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

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


到官網SDK下載中心下載在線命令詞識別SDK(這裏以Android版本爲例)後,能夠發現壓縮包裏面的目錄結構和聽寫的很是相似,這裏告訴你們一個小祕密:java


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),這部分想有更進一步的瞭解見帖子:ide


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


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


wKiom1dQ4UKxlTKwAAGAaWSwbSY561.png-wh_50


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


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


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


**而後是設置相關合成參數**圖片


                // 清空參數

                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)){

                                // 當前僅發音人「小艾」支持設置情感

                                // 「小艾」發音人須要付費使用,具體請聯繫:msp_support@iflytek.com

                                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是合成監聽器,裏面包含了合成進度、合成完成等等很是有用的回調。


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


一、發音人蔘數能夠設置成哪些發音人呢?


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

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

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

(出處: 語音雲社區)


二、一次能夠合成多長的文本呢?我要合成文本超長了怎麼辦?


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


三、在線合成的音頻數據是沒有通過壓縮的嗎?會不會很是耗費流量?


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

相關文章
相關標籤/搜索