闲来无事做的一个demo。本来想做成网站的形式,发现不知道怎么在请求头里加信息,于是就做成了Winform版的。
到官网开通sdk
网址https://console.xfyun.cn/app/myapp
没注册的先要注册,然后创建应用,应用平台选择webAPI
回到控制台,添加新服务--在线语音合成、语音听写
添加IP白名单,把ip加进去(直接百度IP就可以查到自己的IP地址),记住这里的APIKey,一会要用
还有这里的APPID一会也有用处
在VS中新建Winform项目,在app.config中填入刚才的appid、apikey
接下来就是写处理逻辑了。其实很简单,就是查看官方的sdk,跟着一步一步做就行了。直接附上代码:
语音合成
private void btnTTS_Click(object sender, EventArgs e)
{
//读取配置信息(请求头)
String appId = ConfigurationManager.AppSettings["appId"];
String apiKey = ConfigurationManager.AppSettings["apiKeyTTS"];
String realIp = ConfigurationManager.AppSettings["realIp"];
String curTime = Utils.ConvertDateTimeLong(DateTime.Now).ToString();
//读取语音合成参数,并计算校验和
Dictionary<string, string> xParams = new Dictionary<string, string>();
xParams.Add("auf", ConfigurationManager.AppSettings["aufTTS"]);
xParams.Add("aue", ConfigurationManager.AppSettings["aueTTS"]);
xParams.Add("voice_name", ConfigurationManager.AppSettings["voice_nameTTS"]);
xParams.Add("speed", ConfigurationManager.AppSettings["speedTTS"]);
xParams.Add("volume", ConfigurationManager.AppSettings["volumeTTS"]);
xParams.Add("pitch", ConfigurationManager.AppSettings["pitchTTS"]);
xParams.Add("engine_type", ConfigurationManager.AppSettings["engine_typeTTS"]);
xParams.Add("text_type", ConfigurationManager.AppSettings["text_typeTTS"]);
string json = JsonConvert.SerializeObject(xParams);
String param = Convert.ToBase64String(Encoding.UTF8.GetBytes(json));//"eyJhdWYiOiAiYXVkaW8vTDE2O3JhdGU9MTYwMDAiLCJhdWUiOiAicmF3Iiwidm9pY2VfbmFtZSI6ICJ4aWFveWFuIiwic3BlZWQiOiAiNTAiLCJ2b2x1bWUiOiAiNTAiLCJwaXRjaCI6ICI1MCIsImVuZ2luZV90eXBlIjogImludHA2NSIsInRleHRfdHlwZSI6ICJ0ZXh0In0=";
String checkSum = Utils.GetMD5(apiKey + curTime + param);
HttpWebRequest req = WebRequest.CreateHttp("http://api.xfyun.cn/v1/service/v1/tts");
req.Method = "POST";
//设置请求头
req.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
req.Headers.Add("X-Appid", appId);
req.Headers.Add("X-CurTime", curTime);
req.Headers.Add("X-Param", param);
req.Headers.Add("X-Real-Ip", realIp);
req.Headers.Add("X-CheckSum", checkSum);
//将文本框中文字写入到要post提交的数据
using (Stream stream = req.GetRequestStream())
{
string text = System.Web.HttpUtility.HtmlEncode(txtTTS.Text);
byte[] buffer = Encoding.UTF8.GetBytes("text=" + text);
stream.Write(buffer, 0, buffer.Length);
}
//获取响应
using (WebResponse resp = req.GetResponse())
{
Stream stream = resp.GetResponseStream();
//如果成功,保存为音频文件
if (resp.ContentType.Contains("audio/mpeg"))
{
string filename = "temp.wav";//默认wav文件,文件类型与配置文件中aue的值有关
if ("lame" == ConfigurationManager.AppSettings["aueTTS"])
{
filename = "temp.mp3";
}
using (FileStream fs = new FileStream(filename, FileMode.Create))
{
int b = -1;
while ((b = stream.ReadByte()) != -1)
{
fs.WriteByte((byte)b);
}
//文件流指针回到开始以便进行播放
fs.Seek(0, SeekOrigin.Begin);
SoundPlayer sp = new SoundPlayer(fs);
sp.Load();
sp.Play();
}
}
//否则获取失败,输出错误信息
else
{
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
string retString = streamReader.ReadToEnd();
ErrorCode errCode = JsonConvert.DeserializeObject<ErrorCode>(retString);
ErrorMessage errMsg = new ErrorMessage(errCode);
txtResult.Text = errMsg.ToString() + Environment.NewLine + errCode.ToString();
}
stream.Close();
}
}
语音识别
private void btnSTT_Click(object sender, EventArgs e)
{
//先选择一个音频文件,准备好要Post发送的数据
string audio = string.Empty;
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Title = "选择一个音频文件进行语音转文字";
ofd.Filter = "未压缩的声音|*.wav;*.pcm";
ofd.ShowDialog();
if (ofd.FileName == "")
{
return;
}
//读取文件进行base64编码
using (FileStream fs = new FileStream(ofd.FileName, FileMode.Open))
{
byte[] array = new byte[fs.Length];
fs.Read(array, 0, array.Length);
string base64Audio = Convert.ToBase64String(array);
audio = System.Web.HttpUtility.UrlEncode(base64Audio);
//编码后长度不超过2兆
if (Encoding.UTF8.GetByteCount(audio) > 2 * 1024 * 1024)
{
MessageBox.Show("文件超过了2兆,无法提交!", "文件太大", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
}
}
//获取appid、apikey、curTime
String appId = ConfigurationManager.AppSettings["appId"];
String apiKey = ConfigurationManager.AppSettings["apiKeySTT"];
String realIp = ConfigurationManager.AppSettings["realIp"];
String curTime = Utils.ConvertDateTimeLong(DateTime.Now).ToString();
//计算校验和
Dictionary<string, string> xParams = new Dictionary<string, string>();
xParams.Add("engine_type", ConfigurationManager.AppSettings["engine_typeSTT"]);
xParams.Add("aue", ConfigurationManager.AppSettings["aueSTT"]);
string json = JsonConvert.SerializeObject(xParams);
string param = Convert.ToBase64String(Encoding.UTF8.GetBytes(json));
String checkSum = Utils.GetMD5(apiKey + curTime + param);
HttpWebRequest req = WebRequest.CreateHttp("http://api.xfyun.cn/v1/service/v1/iat");
req.Method = "POST";
//设置请求头
req.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
req.Headers.Add("X-Appid", appId);
req.Headers.Add("X-CurTime", curTime);
req.Headers.Add("X-Param", param);
req.Headers.Add("X-Real-Ip", realIp);
req.Headers.Add("X-CheckSum", checkSum);
//将base64编码的音频文件写入到post数据
using (Stream stream = req.GetRequestStream())
{
byte[] buffer = Encoding.UTF8.GetBytes("audio=" + audio);
stream.Write(buffer, 0, buffer.Length);
}
//获取响应流
using (Stream stream = req.GetResponse().GetResponseStream())
{
//将响应json反序列化为对象
StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
string retString = streamReader.ReadToEnd();
ErrorCode errCode = JsonConvert.DeserializeObject<ErrorCode>(retString);
ErrorMessage errMsg = new ErrorMessage(errCode);
if (errCode.Code==0)
{
//如果成功,显示转换后的字符串
txtResult.Text = errMsg.ToString();
}
else
{
//如果获取失败,输出错误信息
txtResult.Text = errMsg.ToString() + Environment.NewLine + errCode.ToString();//retString;
}
}
}
Windows平台的离线语音合成可以免费不限次体验,Java平台的有多种发音人可供选择,而这个WebAPI平台的有很多限制,首先数据不能太大,而且不花钱的话发音人只有一种,又不能离线合成,所以优先考虑其他两种吧
源码: