C# 百度语音合成

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

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

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

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

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

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

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

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

还没有见到有什么服务能够提供与人说话的天然感,始终会有些机rest

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

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

我能够判定必定是百度的开发人员作的,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是最方便与节省内存的一个办法

private const string lan = "zh";
        private const string per = "0";
        private const string ctp = "1"; 
        private const string spd = "3";
        private const string pit = "6";
        private const string vol = "9";     
        private const string cuid = "00-12-7B-16-74-8D";
        private const string tex = "远去的山河 沉寂,恋过的风景 如昔" +
                                   "苍何斩落了 情迷,生死轻付了 别离" +
                                   "捣一脉相思 成泥,沐四海悲风 无迹" +
                                   "往生海烟波 又起,妙华镜风雪 共历";
        private const string tok = "24.fffd842a3fe829c873fe1c4cd0cb9c4e.2592000.1439044224.282335-6396988";
        private const string rest = "tex={0}&lan={1}&per={2}&ctp={3}&cuid={4}&tok={5}&spd={6}&pit={7}&vol={8}";

        private const int NULL = 0, ERROR_SUCCESS = NULL;
        [DllImport("WinMm.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
从上面的代码你或许会很疑惑为何或有那么多常量那么你看下图

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


如今是否是发现与上述常量相同呢?它是“百度语音合成”所须要

的一些“必要或可选”的参数,咱们在这里使用POST的方式主要

在于使用GET方式显得我有些太屌了,虽然文档内是GET方式

protected override void OnLoad(EventArgs e)
        {
            string strUpdateData = string.Format(rest, tex, lan, per, ctp, cuid, tok, spd, pit, vol);
            HttpWebRequest req = WebRequest.Create("http://tsn.baidu.com/text2audio") as HttpWebRequest;
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            req.ContentLength = Encoding.UTF8.GetByteCount(strUpdateData);
            using (StreamWriter sw = new StreamWriter(req.GetRequestStream()))
                sw.Write(strUpdateData);
            HttpWebResponse res = req.GetResponse() as HttpWebResponse;
            using (Stream stream = res.GetResponseStream())
            {
                string strFullFileName = Application.StartupPath + "/app.mp3";
                using (FileStream fs = new FileStream(strFullFileName, FileMode.Truncate | FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                    stream.CopyTo(fs);
                if (mciSendString(string.Format("open \"{0}\" alias app", strFullFileName), null, NULL, NULL) == ERROR_SUCCESS)
                    mciSendString("play app", null, NULL, NULL);
            }
        }
.NET POST的方式无外乎那几种,通常最经常使用的仍是

.NET上层提供HttpWebRequest,不过百度语音识别

要求使用UTF-8的字符串POST,必定注意这里的细节

不然你没法使用百度提供的服务,而对你返回错误代码

想必这些细节做为一个开发人员应该是不会犯的

咱们把POST后返回的HTTP流写到文件,不过在上面

我说过百度是返回的mp3流,那么你就须要以mp3的方

式写到文件,若是使用BASS则没必要它能够播放内存中

的媒体流,不过mci方式则不能够,若是你没有看懂代码

又急须要使用能够拷贝个人代码 不过建议你能读懂最好

依赖的命名空间:

using System.Net;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
到这里基本结束了,百度语音合成 在C#中的使用并非

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