文/云圖
大家好,我是云圖。 之前項目有個需求要做一個簡單的siri類似的問答系統(tǒng),經(jīng)過一番周折,終于還是實現(xiàn)出來了,軟件不單可以在pc上面運行,也可以打包到安卓,ios平臺,真正實現(xiàn)一鍵跨平臺打包。
現(xiàn)在我們先說一些實現(xiàn)的思路,所謂問答系統(tǒng),第一步就是用戶首先說一句話,然后我們的軟件把聽到的話轉換成文字。那現(xiàn)在問題有了,第二步我們就需要一個地方,把我們的問題文字轉化成我們軟件回答的答案內(nèi)容。第三步就是把要回答的文字讀出來。
思路有了,開始動手,首先,我們把用戶輸入的語音,要轉成文字,經(jīng)過我?guī)讉€挑選,我發(fā)現(xiàn)百度語音和訊飛語音都不錯,只不過訊飛語音的接入麻煩了點,所以就采用了百度的語音識別
?
- private string token; //access_token
- private string cuid = 隨便寫的d; //用戶標識
- private string format = pcm; //語音格式
- private int rate = 8000; //采樣率
- private int channel = 1; //聲道數(shù)
- private string speech; //語音數(shù)據(jù),進行base64編碼
- private int len; //原始語音長度
- private string lan = zh; //語種
- private string grant_Type = client_credentials;
- private string client_ID = 9152186; //百度appkey
- private string client_Secret = 14c703ce0f900eae40e95b2cdd564472; //百度Secret Key
- private string baiduAPI = http://vop.baidu.com/server_api;
- private string getTokenAPIPath =
- https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentialsclient_id=ekGb1G5XHY4BIVSA8nLzX5cAclient_secret=14c703ce0f900eae40e95b2cdd564472;
- private Byte[] clipByte;
- /// <summary>
- /// 轉換出來的TEXT
- /// </summary>
- public static string audioToString;
- private AudioSource aud;
- private int audioLength;//錄音的長度
- public void StartRecord()
- {
- Debug.Log(開始說話);
- if (Microphone.devices.Length == 0) return;
- Microphone.End(null);
- aud.clip = Microphone.Start(null, false, 10, rate);
- }
- public void EndRecord()
- {
- Debug.Log(結束說話);
- int lastPos = Microphone.GetPosition(null);
- if (Microphone.IsRecording(null))
- audioLength = lastPos / rate;//錄音時長
- else
- audioLength = 10;
- Microphone.End(null);
- clipByte = GetClipData();
- len = clipByte.Length;
- speech = Convert.ToBase64String(clipByte);
- StartCoroutine(GetToken(getTokenAPIPath));
- StartCoroutine(GetAudioString(baiduAPI));
- }
- /// <summary>
- /// 把錄音轉換為Byte[]
- /// </summary>
- /// <returns></returns>
- public Byte[] GetClipData()
- {
- if (aud.clip == null)
- {
- Debug.LogError(錄音數(shù)據(jù)為空);
- return null;
- }
- float[] samples = new float[aud.clip.samples];
- aud.clip.GetData(samples, 0);
- Byte[] outData = new byte[samples.Length * 2];
- int rescaleFactor = 32767; //to convert float to Int16
- for (int i = 0; i < samples.Length; i)
- {
- short temshort = (short)(samples[i] * rescaleFactor);
- Byte[] temdata = System.BitConverter.GetBytes(temshort);
- outData[i * 2] = temdata[0];
- outData[i * 2 1] = temdata[1];
- }
- if (outData == null outData.Length <= 0)
- {
- Debug.LogError(錄音數(shù)據(jù)為空);
- return null;
- }
- return outData;
- }
- /// <summary>
- /// 獲取百度用戶令牌
- /// </summary>
- /// <param name=url>獲取的url</param>
- /// <returns></returns>
- private IEnumerator GetToken(string url)
- {
- WWW getTW = new WWW(url);
- yield return getTW;
- if (getTW.isDone)
- {
- if (getTW.error == null)
- {
- token = getTW.text;
- StartCoroutine(GetAudioString(baiduAPI));
- }
- else
- {
- Debug.LogError(獲取令牌出錯 getTW.error);
- }
- }
- else
- {
- Debug.LogError(下載出錯 getTW.error);
- }
- }
- /// <summary>
- /// 把語音轉換為文字
- /// </summary>
- /// <param name=url></param>
- /// <returns></returns>
- private IEnumerator GetAudioString(string url)
- {
- JsonWriter jw = new JsonWriter();
- jw.WriteObjectStart();
- jw.WritePropertyName(format);
- jw.Write(format);
- jw.WritePropertyName(rate);
- jw.Write(rate);
- jw.WritePropertyName(channel);
- jw.Write(channel);
- jw.WritePropertyName(token);
- jw.Write(token);
- jw.WritePropertyName(cuid);
- jw.Write(cuid);
- jw.WritePropertyName(len);
- jw.Write(len);
- jw.WritePropertyName(speech);
- jw.Write(speech);
- jw.WriteObjectEnd();
- WWW getASW = new WWW(url, Encoding.Default.GetBytes(jw.ToString()));
- yield return getASW;
- if (getASW.isDone)
- {
- if (getASW.error == null)
- {
- JsonData getASWJson = JsonMapper.ToObject(getASW.text);
- if (getASWJson[err_msg].ToString() == success.)
- {
- audioToString = getASWJson[result][0].ToString();
- if (audioToString.Substring(audioToString.Length - 1) == ,)
- audioToString = audioToString.Substring(0, audioToString.Length - 1);
- Debug.Log(說話的問題是: audioToString);
- GetAnswer(audioToString);
- }
- else
- {
- Debug.LogWarning(沒有成功: getASWJson[err_msg].ToString());
- }
- }
- else
- {
- Debug.LogError(getASW.error);
- }
- }
- }
我相信到這一步很多做類似項目的也有不少人做到了,可就是這里沒辦法做下去了,為什么呢,因為要用unity把網(wǎng)絡的音頻下載下來播放是非常麻煩的事情,我至今都沒找到辦法,就算用c#的辦法解決了,可是安卓和ios呢,根本調(diào)用不了,再者就是就算你下載下來了,unity好像沒有提供外部播放音頻的功能,我不知道是我能力不足還是unity的問題,感覺很基本的事情居然沒有解決方案。自我懷疑中。。。。
你可能要問了,那么有沒有一種辦法能解決這個多平臺播放音頻的問題呢? 當然有了,我用了FMOD這個插件,可以直接播放網(wǎng)頁的在線音頻,用了一個插件集成進來,最后一步就把網(wǎng)頁音頻地址傳進去,就解決了播放的問題,而且是跨平臺的,ios ,安卓,pc都能用。
?
?
- //要播放的語音文字
- public string AudioMsg = ;
- private string urlForward = @http://tsn.baidu.com/text2audio?tex=;
- public string AudioUrl = ;
- public AudioStreamDemo asDemo;
- public void PlayAudio(string content)
- {
- Debug.Log(content);
- AudioUrl = @http://tsn.baidu.com/text2audio?tex= content lan=zhcuid=隨便寫的ctp=1tok= token;//
- string[] arrPunc = { ,, 。, ”, ;, “, };
- for (int i = 0; i < arrPunc.Length; i)
- {
- //用空白字符來替換指定的標點符號,也就相當于刪除掉了標點符號
- AudioUrl = AudioUrl.Replace(arrPunc[i], );
- }
- asDemo.SetUrlContext(AudioUrl);
- asDemo.OnPlay();
- }
- asDemo.OnPlay();
- asDemo.SetUrlContext(AudioUrl);
- }
- AudioUrl = AudioUrl.Replace(arrPunc[i], );
- //用空白字符來替換指定的標點符號,也就相當于刪除掉了標點符號
- {
- for (int i = 0; i < arrPunc.Length; i)
- string[] arrPunc = { ,, 。, ”, ;, “, };
- AudioUrl = @http://tsn.baidu.com/text2audio?tex= content lan=zhcuid=隨便寫的ctp=1tok= token;//
- Debug.Log(content);
- {
- public void PlayAudio(string content)
- public AudioStreamDemo asDemo;
- public string AudioUrl = ;
- private string urlForward = @http://tsn.baidu.com/text2audio?tex=;
- public string AudioMsg = ;
就這么點代碼,當初找不到方案的時候頭疼了2個星期。 好在在不放棄的堅持下還是搞定了,中間走了不少彎路,好在有 MemoryC 大神的幫助下, 也一個個解決了,為 MemoryC大神打call 我把這三步驟已經(jīng)縮減到一個類里面,方便大家查閱,提一下目前這個功能的一點短處,就是說完話以后要盡快點結束,讓語音不浪費那么多空間, 增快識別速度,最快的時候可以在2秒內(nèi)讀出答案,網(wǎng)速好的話比較好。我測試在安卓讀的最快,然后是pc,最慢是ios,測試的機器是iphone5,不知道和這個有沒有關系。再說點這個東西的拓展,比如一些項目有一些運行了windows系統(tǒng)的機器人,展廳的一些全息 投影之類的項目,都可以接入這個功能,讓項目更有可玩性。
via:GAD
聲明:游資網(wǎng)登載此文出于傳遞信息之目的,絕不意味著游資網(wǎng)贊同其觀點或證實其描述。
銳亞教育,游戲開發(fā)論壇|游戲制作人|游戲策劃|游戲開發(fā)|獨立游戲|游戲產(chǎn)業(yè)|游戲研發(fā)|游戲運營| unity|unity3d|unity3d官網(wǎng)|unity3d 教程|金融帝國3|8k8k8k|mcafee8.5i|游戲蠻牛|蠻牛 unity|蠻牛
- 還沒有人評論,歡迎說說您的想法!