您的位置:首页 > 编程语言 > C#

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
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);


自己用的一些东西,有什么不对的请各位大神指正,另外感谢网友提供的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  语音识别 c# json 百度