人工智能交互集成在線語音合成能力的Tips

在線語音合成就是在聯網的場景下將文字轉換成聲音,實現機器向人的聲音交互。這個概念應該是比較好理解的,下面就結合Android在線合成的Demo講解一下合成的流程以及大家經常遇到的一些問題。


到官網SDK下載中心下載在線命令詞識別SDK(這裏以Android版本爲例)後,可以發現壓縮包裏面的目錄結構和聽寫的非常類似,這裏告訴大家一個小祕密:


wKiom1dQ4SWy7riCAADYrpG5744844.jpg-wh_50


在官網下載Android的這三個選項下載的SDK包是一模一樣的,爲什麼會這樣呢?因爲聽寫、在線合成、在線命令詞三個功能在我們平臺是放在一個SDK 包裏的,版本也是做統一維護,SDK包裏的demo自然也是集合了這個三個功能的演示功能(當然還包含一些其他功能,如語義理解、評測),如下圖所示:


wKioL1dQ4jGwSBprAABYSpM1-4s267.jpg-wh_50

 

紅框中的java文件從上到下依次是:命令詞識別子demo、聽寫子demo、評測子Demo、Demo主入口界面、SpeechUtility初始化、 合成子Demo、語義理解子Demo。可能有人注意到,其中命令詞識別子demo、聽寫子demo、合成子Demo都有對應本地功能,這些本地功能是有語 記APP提供的,而不是離線SDK提供的,所以如果你的手機上沒有安裝語記APP,你在demo裏看到的這些本地功能是用不了的(報錯語音組件未安裝 21001),這部分想有更進一步的瞭解見帖子:


21001問題詳解:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=11724&fromuid=33982


下面看一下TtsDemo.java裏面的調用流程,注意在這之前一定別忘了SpeechApp.java裏面的SpeechUtility初始化。


wKiom1dQ4UKxlTKwAAGAaWSwbSY561.png-wh_50


**首先是初始化合成對象**


                mTts = SpeechSynthesizer.createSynthesizer(TtsDemo.this, mTtsInitListener);


mTtsInitListener是初始化監聽器,比較保險的做法是在初始化回調成功後再進行下面的操作。


**然後是設置相關合成參數**


                // 清空參數

                mTts.setParameter(SpeechConstant.PARAMS, null);

                // 根據合成引擎設置相應參數

                if(mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {

                        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);

                        // 設置在線合成發音人

                        mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);

                        if(!"neutral".equals(emot)){

                                // 當前僅發音人“小艾”支持設置情感

                                // “小艾”發音人需要付費使用,具體請聯繫:[email protected]

                                mTts.setParameter(SpeechConstant.EMOT, emot);

                        }

                //設置合成語速

                mTts.setParameter(SpeechConstant.SPEED, mSharedPreferences.getString("speed_preference", "50"));

                //設置合成音調

                mTts.setParameter(SpeechConstant.PITCH, mSharedPreferences.getString("pitch_preference", "50"));

                //設置合成音量

                mTts.setParameter(SpeechConstant.VOLUME, mSharedPreferences.getString("volume_preference", "50"));



                //設置播放器音頻流類型

                mTts.setParameter(SpeechConstant.STREAM_TYPE, mSharedPreferences.getString("stream_preference", "3"));

                // 設置播放合成音頻打斷音樂播放,默認爲true

                mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

                // 設置音頻保存路徑,保存音頻格式支持pcm、wav,設置路徑爲sd卡請注意WRITE_EXTERNAL_STORAGE權限

                // 注:AUDIO_FORMAT參數語記需要更新版本才能生效

                mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");

                mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");


相關參數的作用在註釋中已經說的比較詳細了。

**最後開始合成**

                mTts.startSpeaking(text, mTtsListener);


其中text就是你需要合成的文本,mTtsListener是合成監聽器,裏面包含了合成進度、合成完成等等非常有用的回調。


**常見問題及解答:**


1、發音人蔘數可以設置成哪些發音人呢?


目前支持的在線發音人列表見下面的帖子

【官方】合成發音人在線、離線支持情況

http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=12012&fromuid=33982

(出處: 語音雲社區)


2、一次可以合成多長的文本呢?我要合成文本超長了怎麼辦?


合成文本是有長度限制的,一次最長合成8192個字節的文本,你可能根據你的文本的編碼格式換算出支持的最長字符數。如果你要合成的文本超長了,你可以將他按照長度限制進行切分,分多次合成後再依次進行音頻數據的合併或者播放。


3、在線合成的音頻數據是沒有經過壓縮的嗎?會不會非常耗費流量?


和聽寫時音頻數據的上傳類似,合成是服務器返回的音頻 數據是經過”speex編碼“壓縮過的,壓縮比約爲1:10,也就是時候服務端將合成的音頻進行1:10的壓縮,然後客戶端SDK接收到音頻後再解碼成非 壓縮的原始音頻,那麼按照16K採樣率16位採樣精度單聲道的音頻來計算,1秒鐘的音頻壓縮後的大小大約爲3K左右,並不是非常的大。另外上面提到的 speex編碼並不是普通的speex編碼,因此這兩種方式壓縮出來的音頻也不能通用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章