科大讯飞语音接口-tts语音生成
Demo下载链接:https://download.csdn.net/download/jinglell/11566459
语音生成是另一个难点,我的应用场景是参考科大讯飞的APP"听书神器"
,在微信小程序端小说爬取完之后,可以对当前的文章进行朗读处理,由于每天的免费次数有限,所以我对生成的音频流并没有直接返回而是也存储为.wav格式的音频的形式到本地资源服务器。
首先正常情况下也是查看msc.dll,
但是语音合成我这次采用的是另一种形式:在线合成形式,通过请求接口和POST传参合成语音,需要注意的是要MD5加密APIKey+时间+参数Md5(APIKey + curTime + paraBase64);
下面是我的代码:
public static void Text2Audio(string text,string path,string speeker = "xiaoyan")
{
// 应用APPID(必须为webapi类型应用,并开通语音合成服务,参考帖子如何创建一个webapi应用:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=36481)
string appID = "**your appID**";
// 接口密钥(webapi类型应用开通合成服务后,控制台--我的应用---语音合成---相应服务的apikey)
string APIKey = "**your API key**";
// 语音合成webapi接口地址
String url = "http://api.xfyun.cn/v1/service/v1/tts";
String bodys;
// 待合成文本
//string text = "test测试音频";
// 对要合成语音的文字先用utf-8然后进行URL加密
byte[] textData = Encoding.UTF8.GetBytes(text);
text = HttpUtility.UrlEncode(textData);
bodys = string.Format("text={0}", text);
//aue = raw, 音频文件保存类型为 wav或者pcm
//aue = lame, 音频文件保存类型为 mp3
string AUE = "raw";
string param =
"{\"aue\":\"" + AUE + "\","+
"\"auf\":\"audio/L16;rate=16000\","+
"\"voice_name\":\"" + speeker + "\"," +
"\"engine_type\":\"intp65\"}";
// 获取十位的时间戳
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string curTime = Convert.ToInt64(ts.TotalSeconds).ToString();
// 对参数先utf-8然后用base64编码
byte[] paramData = Encoding.UTF8.GetBytes(param);
string paraBase64 = Convert.ToBase64String(paramData);
// 形成签名
string checkSum = Md5(APIKey + curTime + paraBase64);
// 组装http请求头
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Headers.Add("X-Param", paraBase64);
request.Headers.Add("X-CurTime", curTime);
request.Headers.Add("X-Appid", appID);
request.Headers.Add("X-CheckSum", checkSum);
Stream requestStream = request.GetRequestStream();
StreamWriter streamWriter = new StreamWriter(requestStream, Encoding.GetEncoding("gb2312"));
streamWriter.Write(bodys);
streamWriter.Close();
String htmlStr = string.Empty;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Stream responseStream = response.GetResponseStream();
using (StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
{
string header_type = response.Headers["Content-Type"];
if (header_type == "audio/mpeg")
{
Stream st = response.GetResponseStream();
MemoryStream memoryStream = StreamToMemoryStream(st);
// 保存音频文件地址和音频格式类型
//string path = "D:/audios/temp/audioTest23334455.pcm";
File.WriteAllBytes(path, streamTobyte(memoryStream));
//Console.WriteLine(response.Headers);
//Console.ReadLine();
}
else
{
htmlStr = reader.ReadToEnd();
//Console.WriteLine(htmlStr);
//Console.ReadLine();
}
}
responseStream.Close();
}
科大讯飞的两个接口iat/tts到此结束,有问题欢迎留言。{>_<}
ps:刚刚想着改改我发布的项目里的appID什么的突然想到了,除了配置appID appKey
、替换msc.dll
、配置IIS Server
外,还要记得在你的科大讯飞应用控制台里添加你的IP 白名单
,不然会无效的。我csdn下载里的项目里的appID、appKey虽然没改,但是别想着直接用我的了哈,因为我没添加你们的IP到我的应用白名单,你们的请求都是无效的。