在線語音合成就是在聯網的場景下將文字轉換成聲音,實現機器向人的聲音交互。這個概念應該是比較好理解的,下面就結合Android在線合成的Demo講解一下合成的流程以及大家經常遇到的一些問題。
到官網SDK下載中心下載在線命令詞識別SDK(這裏以Android版本爲例)後,可以發現壓縮包裏面的目錄結構和聽寫的非常類似,這裏告訴大家一個小祕密:
在官網下載Android的這三個選項下載的SDK包是一模一樣的,爲什麼會這樣呢?因爲聽寫、在線合成、在線命令詞三個功能在我們平臺是放在一個SDK 包裏的,版本也是做統一維護,SDK包裏的demo自然也是集合了這個三個功能的演示功能(當然還包含一些其他功能,如語義理解、評測),如下圖所示:
紅框中的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初始化。
**首先是初始化合成對象**
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編碼,因此這兩種方式壓縮出來的音頻也不能通用。