Android ASR SDK 集成合成****DEMO****中
(一) 簡介:
<pre style="background:white">本文針對遇見集成Android識別DEMO 有困難的用戶,以android合成SDK作為示例,給出的步驟。</pre>
<pre style="background:white">本文將集成ActivityRecog至官方android合成demo項目。</pre>
<pre style="background:white">android合成demo,可以將文本合成為音頻并且播放。</pre>
<pre style="background:white">我們添加的功能為:識別成功后,將識別出來的文本,合成之后播放出來。</pre>
<pre style="background:white">參考文檔:https://cloud.baidu.com/doc/SPEECH/ASR-Android-SDK.html#.E9.9B.86.E6.88.90.E6.8C.87.E5.8D.97</pre>
<pre style="background:white">前提: 將官方demo的源代碼通過android studio在android真機(jī)上運(yùn)行起來并且測試成功。Demo暫不支持模擬器。</pre>
<pre style="background:white">目標(biāo)用戶:Android初學(xué)者或者想立即集成的用戶。</pre>
|
Android Studio
|
3.0.1
|
|
官方Demo
|
3.0.6
|
| | |
|
測試機(jī)型
|
OPPO R7 - ColorOS 1.4
Android 4.3
|
(二) 官網(wǎng)新建一個應(yīng)用
<pre style="background:white">從合成demo中,我們得知項目的包名是com.baidu.tts.sample,定義在build.gradle中。</pre>
在官網(wǎng)中新建一個應(yīng)用,開通語音識別和語音合成能力。填寫包名為com.baidu.tts.sample。也可以使用本文示例的應(yīng)用,測試成功上線前替換。


修改合成demo的appId appKey secretKey,并且測試是否有效****。

(三) 復(fù)制 AndroidManifest.xml
從官方demo的AndroidManifest.xml中找到如下信息,然后復(fù)制到您自己的同名文件中。
此處需要您復(fù)制a)權(quán)限 b) 官網(wǎng)申請的應(yīng)用信息 c) SDK的Service

紫色的請?zhí)鎿Q成您自己的申請的應(yīng)用信息。
紅色是您需要的添加的部分
(四) 識別初始化,復(fù)制識別jar庫
<pre style="background:white">在 ActivityRecog中可以發(fā)現(xiàn)如下初始化代碼:</pre>

<pre style="background:white">我們暫時不需要離線的,在SynthActivity中添加如下代碼:</pre>

這個時候MyRecognizer類沒有引用,識別的jar包也沒有。
將識別的app\libs\bdasr_V3_20171108_9800a2a.jar復(fù)制到合成的同名目錄。
復(fù)制缺少的JAVA類,解決編譯問題


注意此時底層****SO****庫還沒有集成,開始識別的時候會發(fā)生報錯。
(五) 集成,準(zhǔn)備識別。
我們需要集成的邏輯是識別出文字后然后合成音頻播放。
因此第一步是識別出文字,第二步在識別的成功的回調(diào)中播放音頻。
<pre style="background:white">先準(zhǔn)備一個回調(diào)Listener:extends StatusRecogListener</pre>
<pre style="background:white"> public class TtsRecogListener extends StatusRecogListener { private MySyntherizer synthesizer; private final static String TAG = "TtsRecogListener"; public TtsRecogListener(MySyntherizer synthesizer) { this.synthesizer = synthesizer;
} @Override public void onAsrFinalResult(String[] results, RecogResult recogResult) { super.onAsrFinalResult(results, recogResult);
String msg = "****識別成功:" + results[0];
Log.*i*(***TAG***, msg);
} @Override public void onAsrFinishError(int errorCode, int subErrorCode, String errorMessage, String descMessage, RecogResult recogResult) { super.onAsrFinishError(errorCode, subErrorCode, errorMessage, descMessage, recogResult);
String msg = "****錯誤碼是:" + errorCode;
Log.i(TAG, msg);
}
}</pre>
還記得之前的IRecogListener listener = null;么?

把合成demo中的“使用說明”按鈕復(fù)用下,改為”開始識別”按鈕

<pre style="background:white">我們看見識別demo中是這樣開始識別的:myRecognizer.start(params);</pre>

點(diǎn)擊“使用說明”按鈕,會發(fā)現(xiàn)如下保存。(還記得底層so文件沒有復(fù)制么?)
{"sub_error":5001,"error":5,"origin_result":{"sub_error":5001,"error":5,"sn":"","desc":"Can not load so library"},"desc":"Can not load so library"}
(六) 復(fù)制jni庫的so文件
由于缺少so****文件,點(diǎn)擊開始后,有如下報錯:
:{"sub_error":5001,"error":5,"origin_result":{"sub_error":5001,"error":5,"sn":"","desc":"Can not load so library"},"desc":"Can not load so library"}
我們繼續(xù)修改項目:
復(fù)制官方demo****中 app\src\main\jniLibs 至項目的同名目錄,如果對android studio不熟悉,這一步可以在windows 資源管理器操作
由于原先合成demo項目已經(jīng)有了5個架構(gòu)目錄,因此此時只要合并即可。

如果假設(shè),合成demo項目有6個架構(gòu)目錄,然而合成只有5個,那么兩者目錄取交集,最終只留下同名的5個。如果假設(shè),合成demo項目只有一個armeabi目錄,那么刪除識別項目額外的4個架構(gòu)目錄,最終只留下同名的armeabi目錄。
(七) 測試識別及自定義參數(shù):
啟動app,正常情況可以看見
public void onAsrFinalResult(String[] results, RecogResult recogResult) { super.onAsrFinalResult(results, recogResult);
String msg = "****識別成功:****" + results[0];
Log.i(TAG, msg);
}
這個方法被執(zhí)行。
打開demo,這里以“在線識別”界面為例。 進(jìn)入界面后,點(diǎn)擊“設(shè)置”按鈕。
經(jīng)過一輪測試,準(zhǔn)備選擇“保存音頻文件”及VAD時長2000ms作為在線識別的參數(shù)。

點(diǎn)擊開始錄音后,可以看見如下輸入?yún)?shù):

這個json在logcat中也可以找到。
“vad.endpoint-timeout” 是定義在SpeechConstant中的常量。
項目中填寫同樣的參數(shù),生成一樣的json。

(八) 集成合成播放
<pre style="background:white">我們修改下TtsRecogListener中的回調(diào)</pre>

正常的話,會聽見合成的女聲。
(九) 代碼下載
鏈接:https://pan.baidu.com/s/1sljxdwh 密碼:rn89