C#讯飞实时语音识别和语音合成

最近由于需要做一个关于语音的c#项目,经老师推荐使用了讯飞的语音识别和合成的接口,但由于网上资源关于c#实时语音识别这块实在是太少了,经查阅网上资源和研究源代码,最终完成了一个还算满意的demo,供各位后来者参考和借鉴,希望后来者能少走点弯路。

以下是界面图:
demo界面

MSC模块导入及添加枚举常量等

导入msc.dll,讯飞的语音识别和语音函数是封装起来的,需要我们import进去
MSCDLL类
除此之外,我们还需要创建需要用到的枚举常量和结构体等
枚举

语音识别模块

这部分模块我们需要用到的是麦克风音频(NAudio)和语音识别类。

首先,连续的语音识别是需要用到麦克风的,这时候就需要创建一个麦克风类,来实现声音的获取,及对声音的识别。
麦克风类
其中较为关键的函数是wis_back_DataAvailable和OnDataAvailable,前一个是处理得到的音量,后一个是处理得到的数据。
wis_back_DataAvailable和OnDataAvailable具体实现

private void wis_back_DataAvailable(object sender, WaveInEventArgs e)
{
   
	long sh = System.BitConverter.ToInt64(e.Buffer, 0);
	long width = (long)Math.Pow(2, 50);
	float svolume = Math.Abs(sh / width);
	if (svolume > 1500.0f) {
    svolume = 1500.0f; }//音量最大值
	if (svolume < 50.0f) {
    svolume = 50.0f; }//音量最小值
	this.volume = svolume / 15.0f;//最小3.3333333
	DataArrived(this, new DataArrivedEventArgs(this.volume));//激发音量数据到达事件
}

void OnDataAvailable(object sender, WaveInEventArgs e)
{
   
	totalBufferLength += e.Buffer.Length;
	secondsRecorded = (float)(totalBufferLength / 32000);

	VoiceData data = new VoiceData();
	for (int i = 0; i < e.Buffer.Length; i++)
	{
   
		data.data[i] = e.Buffer[i];
	}
	VoiceBuffer.Add(data);//添加录音数据

	if (volume < 4)//音量低于4则开始准备识别
	Ends = Ends - 1;
	else
	Ends = 5;

	if (Ends == 0)
	{
   
		if (VoiceBuffer.Count() > 5)
		{
   
			isr.RunIAT(VoiceBuffer);//调用语音识别 
		}
		VoiceBuffer.Clear();
		Ends = 5;
	}
}

其中VoiceData 是我创建的处理音频数据的类
VoiceData类

接下来是语音识别类,这是实现语音识别的关键类
语音识别类
其中有两个语音识别的函数,其区别是一个通过麦克风获取声音数据来识别,一个通过读取文件数据来识别。

// 语音识别(从麦克风中获取数据)
public void RunIAT(List<VoiceData> VoiceBuffer)
        {
   
            IntPtr session_id = IntPtr.Zero;//sessionID是本次识别的句柄
            string rec_result = string.Empty;//识别结果
            string hints 
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值