语音合成及TTS,我们尝试使用百度的语音合成技术 不过我发现

有一种缺点在于没有离线包让我有些很不舒服,可能是在线版的

原因微软语音识别技术在Windows 2000是默认集成在系统组件中

或许我们不必去寻找新的语音合成替代方案,不过在线版一旦离线

只有Game Over,Hah不过有一点好处在于使用方便适合广发开发

者,第二百度语音合成后的音频流,妹子的声音听着较舒服 如果可

以在“卡哇伊”的萌妹妹,一定会更好,不过应该在解决一下声音坚

硬的感觉或许会更好,虽然语音合成技术发展这么多年 至少目前我

还没有见到有什么服务可以提供与人说话的自然感,始终会有些机

械干不过要谈到“百度语音识别”与“光学识别 / OCR”的话,我不好意

思讨论 但是支持国产的心是不变的,不过百度的文档只有那么简洁

我可以断定一定是百度的开发人员做的,Hah 我们又不是日本人与

印度人写不好什么注释与文档,人家那是写作文 我们能造吗?

首先你需要具备一个百度账号,然后到新版百度语音的官方的首页

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

C# 百度语音合成

届时你会看到上面的两种不同的技术,我们选择语音合成技术

C# 百度语音合成

你可以试试快速体验实际上它就是利用REST API实现的,不要纠结

我们点击立即使用,如果是第一次使用百度的技术服务 那么你需要

注册开发者信息一次 烂填最好 免得百度把你的信息哪去卖钱,Hah. 

C# 百度语音合成

如果是你已经登记信息,没有创建应用你也无法使用百度的服务

你必须创建一个项目,在下图如所示右上角“创建新应用”

C# 百度语音合成

那么你会看见如下页面,随意填写一个有效名称确认即可 应用类别

也是随意选择,搞那么清楚给百度干什么 只是用服务 又不是卖信息

C# 百度语音合成

当应用创建完毕后你会看到如下的页面,那么你需要点击开通服务

C# 百度语音合成

如果你没有看到开通服务的标签按钮,可以回到百度语音支持首页

选择“百度语音合成”然后直接点击“立即使用”

C# 百度语音合成

它会提示你选择你的应用随便选择一个充数就可以,然后点击下一步

如果提示如下页面表示成功,你也可以直接点击上图右边的“创建应用”

超链接快速开通服务

C# 百度语音合成

好吧,如果有需要百度帮助文档的可以去“应用管理”页面点击你需

要的技术按钮,会弹出如下的快捷菜单 选择“下载SDK”即可,或者

从百度语音支持首页选择“百度语音合成”

C# 百度语音合成

点击工具栏中的“相关下载”后我们选择“REST API”选项卡,请参照下图

点击下载文档,不过百度的文档你或许看了可能会认为没有看过 Hah。

C# 百度语音合成

现在我们需要去“获取 Access Token”又是百度搞出来的新玩意

我们需要进入“应用管理”页面中点击包含“百度语音识别”技术的

应用,点击C# 百度语音合成“查看Key”图形按钮,会出现如下图所示

C# 百度语音合成

我们现在需要提取两个重要的参数及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

C# 百度语音合成

在浏览中访问了上面的连接会看到如上图的文本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);  

从上面的代码你或许会很疑惑为什么或有那么多常量那么你看下图

 

你便知道了,有些观看文档的朋友则不用

C# 百度语音合成

现在是不是发现与上述常量相同呢?它是“百度语音合成”所需要

的一些“必要或可选”的参数,我们在这里使用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#中的使用并不是

 

你想象中的那么困难,你没有必要去纠结它的使用方法

相关文章:

  • 2022-01-24
  • 2022-12-23
  • 2021-08-12
  • 2021-11-24
  • 2021-12-11
  • 2021-12-09
  • 2021-07-12
  • 2022-12-23
猜你喜欢
  • 2021-06-12
  • 2022-12-23
  • 2021-06-11
  • 2021-04-02
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案