C# 语音识别
2015-10-22 15:07
344 查看
C#桌面程序希望使用语音识别 将语音转成文字有很多方法
使用讯飞变得比较麻烦,主要是因为所有平台都需要用sdk,不知道是不是不能用web调用(没有研究
,按道理应该有。。。)
下面在使用百度的语音识别来完成这个工作,主要代码来自网友,我写成了类(具体从哪里来的我忘了,在此感谢)
找到原作者 http://www.cnblogs.com/bfyx/p/3915297.html
下面是我改写的音频转文字的类,由于返回json,所以用了json.net来解析返回结果,类前面的token和apikey需要自己去申请百度语音识别
传送门 http://yuyin.baidu.com
类的外部调用,直接new一个然后把语音文件的路径名给了就ok
自己用的一些东西,有什么不对的请各位大神指正,另外感谢网友提供的方法。
使用讯飞变得比较麻烦,主要是因为所有平台都需要用sdk,不知道是不是不能用web调用(没有研究
,按道理应该有。。。)
下面在使用百度的语音识别来完成这个工作,主要代码来自网友,我写成了类(具体从哪里来的我忘了,在此感谢)
找到原作者 http://www.cnblogs.com/bfyx/p/3915297.html
下面是我改写的音频转文字的类,由于返回json,所以用了json.net来解析返回结果,类前面的token和apikey需要自己去申请百度语音识别
传送门 http://yuyin.baidu.com
using System; using System.Text; using System.Net; using System.IO; using Newtonsoft.Json.Linq; namespace TestBaiDuAudio2Txt { public class AudioToString { string token = "";//你自己注册百度语音识别所建立的app给的 string apiKey = "";//同上 string secretKey = "";<span style="font-family: Arial, Helvetica, sans-serif;">//同上</span> string cuid = "";//这个随便写 不过尽量写唯一的,比如自己创建个guid,或者你手机号码什么的都可以 string getTokenURL = ""; string serverURL = "http://vop.baidu.com/server_api"; public AudioToString() { cuid = Guid.NewGuid().ToString(); getToken(); } private void getToken() { getTokenURL = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials" + "&client_id=" + apiKey + "&client_secret=" + secretKey; token = GetValue("access_token"); } private string GetValue(string key) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(getTokenURL); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader1 = new StreamReader(response.GetResponseStream(), Encoding.UTF8); string ssss = reader1.ReadToEnd().Replace("\"", "").Replace("{", "").Replace("}", "").Replace("\n", ""); string[] indexs = ssss.Split(','); foreach (string index in indexs) { string[] _indexs = index.Split(':'); if (_indexs[0] == key) return _indexs[1]; } return ""; } public string audioToString(string audioFilePath) { serverURL += "?lan=zh&cuid=" + cuid + "&token=" + token; FileStream fs = new FileStream(audioFilePath, FileMode.Open); byte[] voice = new byte[fs.Length]; fs.Read(voice, 0, voice.Length); fs.Close(); fs.Dispose(); HttpWebRequest request = null; Uri uri = new Uri(serverURL); request = (HttpWebRequest)WebRequest.Create(uri); request.Timeout = 30000; request.Method = "POST"; //16K的采样率 request.ContentType = "audio/wav; rate=16000"; request.ContentLength = voice.Length; try { using (Stream writeStream = request.GetRequestStream()) { writeStream.Write(voice, 0, voice.Length); writeStream.Close(); writeStream.Dispose(); } } catch { return null; } string result = string.Empty; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8)) { string line = string.Empty; StringBuilder sb = new StringBuilder(); while (!readStream.EndOfStream) { line = readStream.ReadLine(); sb.Append(line); sb.Append("\r"); } result = sb.ToString(); readStream.Close(); readStream.Dispose(); } responseStream.Close(); responseStream.Dispose(); } response.Close(); } string re = string.Empty; JObject jsonObj = JObject.Parse(result); string err_msg = (string)jsonObj["err_msg"]; string err_no = (string)jsonObj["err_no"]; //错误的代码也没有处理,对我没用咯 if (err_no == "0" && err_msg == "success.") { //由于百度语音识别会返回1-5个候选结果,这里没有处理就只要了第一个结果 JArray jlist = JArray.Parse(jsonObj["result"].ToString()); return jlist[0].ToString(); } else { return null; } } } }
类的外部调用,直接new一个然后把语音文件的路径名给了就ok
AudioToString ats = new AudioToString(); textBox1.Text=ats.audioToString(filename);
自己用的一些东西,有什么不对的请各位大神指正,另外感谢网友提供的方法。
相关文章推荐
- 房产界已上市和IPO路上的难兄难弟:房天下与房多多
- 利用百度地图提供的API做的应用
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- c#调用COM组件
- 百度20年:搜索帝国的崛起、式微与重生
- 小白观察:Google 开始清除百度旗下公司开发的 46 款应用程序
- XML 与 JSON 优劣对比
- VBA将excel数据表生成JSON文件
- 百度全面恢复网站权重,流量暴涨中
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#.NET获取拨号连接的宽带连接方法