C# 语音识别

C#桌面程序但愿使用语音识别 将语音转成文字有不少方法html

使用讯飞变得比较麻烦,主要是由于全部平台都须要用sdk,不知道是否是不能用web调用(没有研究委屈,按道理应该有。。。)web

下面在使用百度的语音识别来完成这个工做,主要代码来自网友,我写成了类(具体从哪里来的我忘了,在此感谢)json


找到原做者 http://www.cnblogs.com/bfyx/p/3915297.htmlapi


下面是我改写的音频转文字的类,因为返回json,因此用了json.net来解析返回结果,类前面的token和apikey须要本身去申请百度语音识别app

传送门 http://yuyin.baidu.com
ui

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一个而后把语音文件的路径名给了就okspa

AudioToString ats = new AudioToString();
textBox1.Text=ats.audioToString(filename);


本身用的一些东西,有什么不对的请各位大神指正,另外感谢网友提供的方法。.net