本文系原创,禁止转载。

分享如何使用c#对接科大讯飞语音听写服务,简单高效地实现语音听写。

实现语音听写主要分为录音和语音识别两部分;录音是指获取设备声卡端口的音频数据并将之保存为音频文件,语音识别就是将刚才所述的音频文件通过调用讯飞的语音听写服务转换为文字。

相关的类库文件

1. 开源录音库 NAudio.dll

  http://pan.baidu.com/s/1dFth2nv

2.语音听写库 msc.dll

  去讯飞开放平台申请相关的SDK

录音部分可以使用开源的.net音频处理类库NAudio.dll,它是托管的类库,使用起来比较方便,当然你也可以自己去读声卡录音,微软有相关的系统API,这里不详述。

录音部分核心代码:

 //初始化
             String FilePath = AppDomain.CurrentDomain.BaseDirectory + "Temp.wav";
             WaveIn m_waveSource = new WaveIn();
             m_waveSource.WaveFormat = , , );// 16bit,16KHz,Mono的录音格式
             m_waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
             m_waveSource.RecordingStopped += new EventHandler<StoppedEventArgs>(waveSource_RecordingStopped);
             WaveFileWriter m_waveFile = new WaveFileWriter(m_fileName, m_waveSource.WaveFormat);

             //开始录音
             m_waveSource.StartRecording();

             //保存到截获到的声音
             private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
           {
             if (m_waveFile != null)
             {
                 m_waveFile.Write(e.Buffer, , e.BytesRecorded);
                 m_waveFile.Flush();
             }
           }

           //停止录音
           m_waveSource.StopRecording();

录音完成后就可以进行语音听写了,讯飞提供的语音听写服务SDK中的类库msc.dll是原生的类库,在c#中没有办法像托管类库那样使用,需要通过使用Import的方式来引用,也可以包装成托管的类库来使用,这里只介绍第一种方法。

上述类库是msc.dll使用C语言封装的,在声明接口的时候需注意C语言的变量类型的表达方式与C#有很多不同之处;比如,在SDK中有很多针对内存地址操作的,所以涉及到很多的指针类型变量,而C#中指针概念相对较弱。提供两个解决思路,一是在C#中声明UnSafe代码,这样就可以像C/C++一样使用指针,二是使用IntPtr、ref 变量的表达方式,来实现“兼容”。
相关接口声明:

      [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int MSPLogin(string usr, string pwd, string @params);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern IntPtr QISRSessionBegin(string grammarList, string _params, ref int errorCode);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int QISRGrammarActivate(string sessionID, string grammar, string type, int weight);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int QISRAudioWrite(string sessionID, IntPtr waveData, uint waveLen, int audioStatus, ref int epStatus, ref int recogStatus);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern IntPtr QISRGetResult(string sessionID, ref int rsltStatus, int waitTime, ref int errorCode);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int QISRSessionEnd(string sessionID, string hints);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int QISRGetParam(string sessionID, string paramName, string paramValue, ref uint valueLen);

         [DllImport("msc.dll", CallingConvention = CallingConvention.StdCall)]
         public static extern int MSPLogout();

业务流程:
1.调用 MSPLogin(...)接口登入,可以只登入一次,但是必须保证在调用其他接口前先登入;
2.调用 QISRSessionBegin(...)开始一次语音听写;
3.调用 QISRAudioWrite(...) 分块写入音频数据
4.循环调用 QISRGetResult(...) 接口返回听写结果
5.调用 QISRSessionEnd(...) 主动结束本次听写
6.不再使用服务的时候 调用MSPLogout()登出,避免不必要的麻烦。
核心代码:

public string AudioToString(string inFile)
        {
            ;
            string text = String.Empty;
            FileStream fileStream = new FileStream(inFile, FileMode.OpenOrCreate);
            byte[] array = new byte[this.BUFFER_NUM];
            IntPtr intPtr = Marshal.AllocHGlobal(this.BUFFER_NUM);
            ;
            ;
            ;
            ;
            while (fileStream.Position != fileStream.Length)
            {
                , this.BUFFER_NUM);
                Marshal.Copy(array, , intPtr, array.Length);
                ret = iFlyASR.QISRAudioWrite(this.m_sessionID, intPtr, (uint)waveLen, audioStatus, ref epStatus, ref recogStatus);
                )
                {
                    fileStream.Close();
                    throw new Exception("QISRAudioWrite err,errCode=" + ret);
                }
                )
                {
                    IntPtr intPtr2 = iFlyASR.QISRGetResult(, ref ret);
                    if (intPtr2 != IntPtr.Zero)
                    {
                        text += this.Ptr2Str(intPtr2);
                    }
                }
                Thread.Sleep();
            }
            fileStream.Close();
            audioStatus = ;
            ret = iFlyASR.QISRAudioWrite(this.m_sessionID, intPtr, 1u, audioStatus, ref epStatus, ref recogStatus);
            )
            {
                throw new Exception("QISRAudioWrite write last audio err,errCode=" + ret);
            }
            ;
            while (true)
            {
                IntPtr intPtr2 = iFlyASR.QISRGetResult(, ref ret);
                if (intPtr2 != IntPtr.Zero)
                {
                    text += this.Ptr2Str(intPtr2);
                }
                )
                {
                    break;
                }
                Thread.Sleep();
                 || timesCount++ >= )
                {
                    break;
                }
            }
            return text;
        }

自己设计以下UI交互,或者和你的应用程序结合一下,就可以让你的应用程序长一双会听的耳朵了!

结果:

C# 实现语音听写的更多相关文章

  1. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  2. UI进阶 科大讯飞(1) 语音听写(语音转换成文字)

    一.科大讯飞开放平台: http://www.xfyun.cn/ 注册.登录之后创建新应用. 因为本项目只实现了语音听写,所以在SDK下载中心勾选语音听写单项SDK就可以了 开发平台选择iOS,应用选 ...

  3. Android集成科大讯飞SDK语音听写及语音合成功能实现

    前言 现在软件设计越来越人性化.智能化.一些常见的输入都慢慢向语音听写方向发展,一些常见的消息提示都向语音播报发展.所以语音合成和语音听写是手机软件开发必不可少的功能.目前国内这方面做的比较好的应该是 ...

  4. 讯飞云 API 语音听写 python3 调用例程

    #!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...

  5. ros语音交互(四)移植科大讯飞语音识别到ros

    将以前下载的的语音包的 samples/iat_record/的iat_record.c speech_recognizer.c speech_recognizer.c 拷贝到工程src中, linu ...

  6. iOS: 讯飞语音的使用

    一.介绍: 讯飞语音做的相当不错,容错率达到90%多,如果需要做语音方面的功能,它绝对是一个不错的选择.讯飞语音的功能很多:语音听写.语音识别.语音合成等,但我们最常用的还是语音听写.讯飞语音中包含界 ...

  7. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  8. android讯飞语音开发常遇到的问题

    场景:android项目中共使用了3个语音组件:在线语音听写.离线语音合成.离线语音识别 11208:遇到这个错误,授权应用失败,先检查装机量(3台测试权限),以及appid的申请时间(35天期限), ...

  9. UI进阶 科大讯飞(2) 语音合成(文字转换成语音)

    科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...

随机推荐

  1. bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树

    先把树剖分了(又是dfs1.dfs2),然后区间求和.区间覆盖即可 难得的1A好(shui)题 ——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233 总结: ...

  2. POJ 1182 食物链

    G - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  3. vi命令的基础知识

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,先说说一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您 ...

  4. zabbix介绍

    zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix组件主要分两个: zabbix-server和zabbix-agent.支持的监控协议有ICM ...

  5. Codeforces Gym 100015G Guessing Game 差分约束

    Guessing Game 题目连接: http://codeforces.com/gym/100015/attachments Description Jaehyun has two lists o ...

  6. Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长

    get请求方式中,传递的参数的值不能太多.是有长度限制的. http://test.jz.gaitu.cn:80/appMana/TemplateImgOutput.aspx?TemplateID=1 ...

  7. javascript——面向对象程序设计(3)

    <script type="text/javascript"> //1.结合使用构造函数模式和原型模式 //2.动态原型模式 //3.寄生构造函数模式 //4.稳妥构造 ...

  8. jQuery学习-事件之绑定事件(一)

    我们都知道jQuery的事件其思想来源于Dean Edwards的addEvent,通过源码我们知道jQuery在为元素绑定事件时,每种类型的事件(click,blur)时只绑定了一次对应类型的事件处 ...

  9. JavaScript之childNodes属性、nodeType属性学习

    1.childNodes属性:在一颗节点树上,childNodes属性可以用来获取任何一个元素的所有元素,它是一个包含这个元素所有子元素的数组. <body> <script typ ...

  10. jQuery.Autocomplete实现自动完成功能-搜索提示功能

    $(function(){ var availableTags=["ads","abc","acc"]; $("#tags&quo ...