C# 百度語音合成

語音合成及TTS,咱們嘗試使用百度的語音合成技術 不過我發現html

有一種缺點在於沒有離線包讓我有些很不舒服,多是在線版的web

緣由微軟語音識別技術在Windows 2000是默認集成在系統組件中api

或許咱們沒必要去尋找新的語音合成替代方案,不過在線版一旦離線app

只有Game Over,Hah不過有一點好處在於使用方便適合廣發開發ide

者,第二百度語音合成後的音頻流,妹子的聲音聽着較舒服 若是可工具

以在「卡哇伊」的萌妹妹,必定會更好,不過應該在解決一下聲音堅oop

硬的感受或許會更好,雖然語音合成技術發展這麼多年 至少目前我ui

尚未見到有什麼服務能夠提供與人說話的天然感,始終會有些機this

械幹不過要談到「百度語音識別」與「光學識別 / OCR」的話,我很差意url

思討論 可是支持國產的心是不變的,不過百度的文檔只有那麼簡潔

我能夠判定必定是百度的開發人員作的,Hah 咱們又不是日本人與

印度人寫很差什麼註釋與文檔,人家那是寫做文 咱們能造嗎?

首先你須要具有一個百度帳號,而後到新版百度語音的官方的首頁

http://yuyin.baidu.com/fc.html

屆時你會看到上面的兩種不一樣的技術,咱們選擇語音合成技術

你能夠試試快速體驗實際上它就是利用REST API實現的,不要糾結

咱們點擊當即使用,若是是第一次使用百度的技術服務 那麼你須要

註冊開發者信息一次 爛填最好 省得百度把你的信息哪去賣錢,Hah. 

若是是你已經登記信息,沒有建立應用你也沒法使用百度的服務

你必須建立一個項目,在下圖如所示右上角「建立新應用」

那麼你會看見以下頁面,隨意填寫一個有效名稱確認便可 應用類別

也是隨意選擇,搞那麼清楚給百度幹什麼 只是用服務 又不是賣信息

當應用建立完畢後你會看到以下的頁面,那麼你須要點擊開通服務

若是你沒有看到開通服務的標籤按鈕,能夠回到百度語音支持首頁

選擇「百度語音合成」而後直接點擊「當即使用」

它會提示你選擇你的應用隨便選擇一個充數就能夠,而後點擊下一步

若是提示以下頁面表示成功,你也能夠直接點擊上圖右邊的「建立應用」

超連接快速開通服務

好吧,若是有須要百度幫助文檔的能夠去「應用管理」頁面點擊你需

要的技術按鈕,會彈出以下的快捷菜單 選擇「下載SDK」便可,或者

從百度語音支持首頁選擇「百度語音合成」

點擊工具欄中的「相關下載」後咱們選擇「REST API」選項卡,請參照下圖

點擊下載文檔,不過百度的文檔你或許看了可能會認爲沒有看過 Hah。

如今咱們須要去「獲取 Access Token」又是百度搞出來的新玩意

咱們須要進入「應用管理」頁面中點擊包含「百度語音識別」技術的

應用,點擊「查看Key」圖形按鈕,會出現以下圖所示

咱們如今須要提取兩個重要的參數及API Key、Secret Key話

說爲何叫作「祕密Key」我估摸着是與密碼差很少的一個玩意

咱們根據文檔拼接一個鏈接用於查詢本身的「Access Token」

https://openapi.baidu.com/oauth/2.0/token?

grant_type=client_credentials&

client_id=hINQTsu6G8C6XqwFvfbWT7Tm&

client_secret=8d5dbdb1b92bf945dca42f75c9eb1a69

解釋:

grant_type // 受權類型

client_id // API Key

client_secret // Secret Key

在瀏覽中訪問了上面的鏈接會看到如上圖的文本Json代碼

咱們什麼只須要「access_token / 訪問令牌」中的東西其餘直

接刪刪刪 沒什麼太大的做用

下面開始用C#編寫使用百度語音合成服務的代碼,首先咱們

須要知道,百度語音合成後輸出的音頻流是mp3不是wav所

以咱們須要播放該音頻流則須要求助支持mp3音頻格式的媒體

庫,不過咱們只是簡單的播放它的音頻而不是須要製做音樂播

放器,那麼使用mci是最方便與節省內存的一個辦法

 

[csharp]  view plaincopy
  1. private const string lan = "zh";  
  2. private const string per = "0";  
  3. private const string ctp = "1";   
  4. private const string spd = "3";  
  5. private const string pit = "6";  
  6. private const string vol = "9";       
  7. private const string cuid = "00-12-7B-16-74-8D";  
  8. private const string tex = "遠去的山河 沉寂,戀過的風景 如昔" +  
  9.                            "蒼何斬落了 情迷,生死輕付了 別離" +  
  10.                            "搗一脈相思 成泥,沐四海悲風 無跡" +  
  11.                            "往生海煙波 又起,妙華鏡風雪 共歷";  
  12. private const string tok = "24.fffd842a3fe829c873fe1c4cd0cb9c4e.2592000.1439044224.282335-6396988";  
  13. private const string rest = "tex={0}&lan={1}&per={2}&ctp={3}&cuid={4}&tok={5}&spd={6}&pit={7}&vol={8}";  
  14.   
  15. private const int NULL = 0, ERROR_SUCCESS = NULL;  
  16. [DllImport("WinMm.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]  
  17. private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);  

從上面的代碼你或許會很疑惑爲何或有那麼多常量那麼你看下圖

 

你便知道了,有些觀看文檔的朋友則不用

如今是否是發現與上述常量相同呢?它是「百度語音合成」所須要

的一些「必要或可選」的參數,咱們在這裏使用POST的方式主要

在於使用GET方式顯得我有些太屌了,雖然文檔內是GET方式

 

[csharp]  view plaincopy
  1. protected override void OnLoad(EventArgs e)  
  2. {  
  3.     string strUpdateData = string.Format(rest, tex, lan, per, ctp, cuid, tok, spd, pit, vol);  
  4.     HttpWebRequest req = WebRequest.Create("http://tsn.baidu.com/text2audio") as HttpWebRequest;  
  5.     req.Method = "POST";  
  6.     req.ContentType = "application/x-www-form-urlencoded";  
  7.     req.ContentLength = Encoding.UTF8.GetByteCount(strUpdateData);  
  8.     using (StreamWriter sw = new StreamWriter(req.GetRequestStream()))  
  9.         sw.Write(strUpdateData);  
  10.     HttpWebResponse res = req.GetResponse() as HttpWebResponse;  
  11.     using (Stream stream = res.GetResponseStream())  
  12.     {  
  13.         string strFullFileName = Application.StartupPath + "/app.mp3";  
  14.         using (FileStream fs = new FileStream(strFullFileName, FileMode.Truncate | FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))  
  15.             stream.CopyTo(fs);  
  16.         if (mciSendString(string.Format("open \"{0}\" alias app", strFullFileName), null, NULL, NULL) == ERROR_SUCCESS)  
  17.             mciSendString("play app", null, NULL, NULL);  
  18.     }  
  19. }  

.NET POST的方式無外乎那幾種,通常最經常使用的仍是

 

.NET上層提供HttpWebRequest,不過百度語音識別

要求使用UTF-8的字符串POST,必定注意這裏的細節

不然你沒法使用百度提供的服務,而對你返回錯誤代碼

想必這些細節做爲一個開發人員應該是不會犯的

咱們把POST後返回的HTTP流寫到文件,不過在上面

我說過百度是返回的mp3流,那麼你就須要以mp3的方

式寫到文件,若是使用BASS則沒必要它能夠播放內存中

的媒體流,不過mci方式則不能夠,若是你沒有看懂代碼

又急須要使用能夠拷貝個人代碼 不過建議你能讀懂最好

依賴的命名空間:

 

[csharp]  view plaincopy
  1. using System.Net;  
  2. using System.IO;  
  3. using System.Text;  
  4. using System.Runtime.InteropServices;  

到這裏基本結束了,百度語音合成 在C#中的使用並非

 

你想象中的那麼困難,你沒有必要去糾結它的使用方法

相關文章
相關標籤/搜索