利用百度語音API進行語音識別。


由於項目需要,這幾天都在試圖利用百度語音API進行語音識別。但是識別到的都是“啊,哦”什么的,我就哭了。

這里我只是分享一下這個過程,錯誤感覺出現在Post語音數據那一塊,可能是轉換問題吧。

API請求地址::http://vop.baidu.com/server_api

語音上傳模式:顯示發送:將語音數據直接放在 HTTP-BODY 中

其他參數:cuid:用戶id,token:密鑰 ,lan:語言等
要了解更多請查看官方文檔:http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice

實現的步驟:1、錄音,將文件存儲起來     2、獲取token     3、Post數據並請求獲取返回值

1、錄音

String fileName = "test.wav";
private MediaCapture _mediaCaptureManager;
private StorageFile _recordStorageFile;
private async void record_Click(object sender, RoutedEventArgs e)//點擊后開始錄音
{
  try
  {
    //在臨時文件夾Temp中創建文件,存在的話就替換掉
    _recordStorageFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
     //關鍵就是這倆句
    MediaEncodingProfile recordProfile = MediaEncodingProfile.CreateWav(AudioEncodingQuality.Auto);//錄音-WAV格式
     await _mediaCaptureManager.StartRecordToStorageFileAsync(recordProfile, this._recordStorageFile);//將錄音保存到創建的文件中
  }
  catch (Exception ex)
  {
    Debug.WriteLine(ex.Message.ToString());
  }
}
private async void stop_Click(object sender, RoutedEventArgs e)
{
  await _mediaCaptureManager.StopRecordAsync();//停止錄音
}

2、獲取token

private void GetToken()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id="
                + "申請的API_KEY" + "&client_secret=" + “申請的SECRET_KEY”);
            request.BeginGetResponse(ResponseTokenCall, request);
        }

        private void ResponseTokenCall(IAsyncResult result)
        {
            try
            {
                HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState;
                WebResponse webResponse = httpWebRequest.EndGetResponse(result);
                using (Stream stream = webResponse.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string content = reader.ReadToEnd();
                    string ssss = content.Replace("\"", "").Replace("{", "").Replace("}", "").Replace("\n", "");
                    string[] indexs = ssss.Split(',');
                    foreach (string index in indexs)
                    {
                        string[] _indexs = index.Split(':');
                        if (_indexs[0] == "access_token")
                            token = _indexs[1];//獲取到的token
                    }
                }
            }

            catch (Exception ex)
            {
                Debug.WriteLine("獲取Token失敗");
            }
        }

3、發送請求

private async void Post()
        {
            string serverURL = "http://vop.baidu.com/server_api?";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serverURL + "lan=zh&cuid=" + cuid + "&token=" + token);//cuid = Guid.NewGuid().ToString();  官方推薦使用 mac 地址/手機 IMEI 等類似參數,只要唯一就好 
            request.ContinueTimeout = 10000;//超時
            request.Method = "POST";//Post請求

            //post data
            request.BeginGetRequestStream(ResponseStreamCallbackPost, request);//Post數據
        }

        private async void ResponseStreamCallbackPost(IAsyncResult result)
        {
          StorageFile storageFile = await ApplicationData.Current.TemporaryFolder.GetFileAsync(fileName);//取出臨時文件夾中保存的音頻文件

            IBuffer buffer = await FileIO.ReadBufferAsync(storageFile);//讀取文件至Ibuffer           byte[] voice = WindowsRuntimeBufferExtensions.ToArray(buffer, 0, (int)buffer.Length);//將Ibuffer轉換為byte[]
            
      HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState; httpWebRequest.ContentType = "audio/wav;rate=8000";//參數設置 using (Stream writeStream = httpWebRequest.EndGetRequestStream(result)) { writeStream.Write(voice, 0, voice.Length);//寫入 } httpWebRequest.BeginGetResponse(ResponseCall, httpWebRequest);//發送請求 } private void ResponseCall(IAsyncResult result) { try { HttpWebRequest httpWebRequest = (HttpWebRequest)result.AsyncState; WebResponse webResponse = httpWebRequest.EndGetResponse(result); using (Stream stream = webResponse.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { string content = reader.ReadToEnd();//返回的是utf-8編碼 string a = Regex.Unescape(content);//進行轉換 } } catch (Exception ex) { Debug.WriteLine("識別失敗"); } }

token獲取了一次,是說30天后會過期。
在處理過程中,遇到了一個問題。我讓GetToken()和Post()先后進行處理,但是卻發現token是在Post之后才得到的,這就導致了請求的URL里面不含token了。

所以還是要先獲取了token之后再進行。

另外(HttpWebRequest)request無法給Content-length屬性進行賦值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM