基于C#的在线语音识别软件开发

本文档介绍了一款使用C#编写的在线语音识别软件的开发过程,该软件依赖于百度语音识别接口。主要内容包括获取麦克风输入、通过HTTP上传音频到识别接口、判断录音状态以及在Main函数中的流程。开发过程中涉及设置波形格式、循环等待语音输入、静音检测和语音识别结果的处理。此外,还提到了英语识别和特定文本匹配的实现细节。
摘要由CSDN通过智能技术生成

本软件利用了百度语音识别提供的接口,自行开发出的一个在线的语音识别软件。所以,制作之前需要去百度语音识别的网站去注册一个项目,免费的除非你的需求量特别大不然不需要付费。百度语音识别地址
然后就需要自己写代码去解决以下问题

  • 获取麦克风输入的语音
  • 发送到百度语音识别的接口
  • 得到返还的信息识别。

获取麦克风输入的语音

要获取麦克风的输入,需要调用一些WindowsAPI及其他的东西。下面就慢慢梳理 我会分散的梳理,整合需要自己理解着去整合
首先,我们获取麦克风,使用winmm.dll

//调用wavein的dll
[DllImport("winmm.dll")]
//获取有多少可用输入设备
public static extern int waveInGetNumDevs();
[DllImport("winmm.dll")]
//增加一个缓冲区
public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, UInt32 cbwh);
[DllImport("winmm.dll")]
//关闭麦克风
public static extern int waveInClose(IntPtr hwi);
[DllImport("winmm.dll")]
//打开麦克风
public static extern int waveInOpen(out IntPtr phwi, UInt32 uDeviceID, ref WaveFormatEx lpFormat, WaveDelegate dwCallback, UInt32 dwInstance, UInt32 dwFlags);
[DllImport("winmm.dll")]
//标记为可用的缓冲区
 public static extern int waveInPrepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, UInt32 uSize);
[DllImport("winmm.dll")]
//标记为不可用的缓冲区
public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, UInt32 uSize);
[DllImport("winmm.dll")]
//把缓冲区内容重置
 public static extern int waveInReset(IntPtr hwi);
[DllImport("winmm.dll")]
//开始录制
public static extern int waveInStart(IntPtr hwi);
[DllImport("winmm.dll")]
//停止录制
public static extern int waveInStop(IntPtr hwi);

然后 我们要把接收到的波形数据放入到一个缓冲区里面

[StructLayout(LayoutKind.Sequential)]
    //接受的波形数据放入的缓冲区
    public struct WaveHdr
    {

        public IntPtr lpData;//缓冲区
        public UInt32 dwBufferLength;//缓冲区长度
        public UInt32 dwBytesRecorded;//某一刻读取到了多少字节的数据
        public UInt32 dwUser;//自定义数据
        public UInt32 dwFlags;
        public UInt32 dwLoops;//是否循环
        public IntPtr lpNext;//链表的下一缓冲区
        public UInt32 reserved;//没实际意义
    }

    [StructLayout(LayoutKind.Sequential)]
    //波形格式
    public struct WaveFormatEx
    { 
        public UInt16 wFormatTag;//波形的类型
        public UInt16 nChannels;//通道数(1,单声道   2,立体音)
        public UInt32 nSamplesPerSec;//采样率
        public UInt32 nAvgBytesPerSec;//字节率
        public UInt16 nBlockAlign;
        public UInt16 wBitsPerSample;//每个样多少位
        public UInt16 cbSize;//长度
    }

但是在这里我们需要一个delegate的委托事件,其作用是在缓冲区满了或者waveinopen和waveinclose的时候被调用。

public delegate void WaveDelegate(IntPtr hwi, UInt32
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值