Winform利用讯飞语音WebAPI实现在线语音合成、语音识别

闲来无事做的一个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平台的有很多限制,首先数据不能太大,而且不花钱的话发音人只有一种,又不能离线合成,所以优先考虑其他两种吧

源码:

https://pan.baidu.com/s/1Lk_bSsEOKDE2_QuczrRzVQ

猜你喜欢

转载自blog.csdn.net/qq_40582463/article/details/83474521