假期里要完成2个C#demo的制作,记录一下自己从无到有的学习过程。
本文主要实现了一个简单的语音合成和语音转文字的小程序。
语音合成的需求为:根据已有问卷上的问题进行语音提问。
语音识别的需求为:在提问之后对用户的回答进行实时的语音转文字。
由于目前还无法接入科大讯飞的接口,并且后续要涉及语音情感识别的内容,此处先练习使用Windows自带类库进行制作。本文demo的效果图如下:
点击`开始询问`按钮之后,首先将通过语音合成的形式提问问题一,之后用户开始回答,答案将实时的显示在上方的对话框中。点击`结束询问`按钮,语音播报“感谢您的配合……”之类的然后结束。
语音合成
主要用到System.Speech.Synthesis
这个命名空间。
// 定义类成员部分private SpeechSynthesizer speechSyn = new SpeechSynthesizer(); //用于语音合成//绑定“开始询问”按钮的点击事件private void buttonStart_Click(object sender, EventArgs e){// 配置对象speechSyn.SetOutputToDefaultAudioDevice();// 事件处理方法speechSyn.SpeakCompleted += new EventHandler<SpeakCompletedEventArgs>(speakCompleted); // 可有可无,看个人需求//异步合成 因为之后会需要同时进行其他工作speechSyn.SpeakAsync("首先是抑郁症问题测试,将有20道题目,你需要根据实际情况如实回答。");}
语音识别
主要用到System.Speech.Recognition
这个命名空间。
// 定义类成员部分private SpeechRecognitionEngine speechRec = new SpeechRecognitionEngine(); //用于语音识别//绑定点击事件private void buttonStart_Click(object sender, EventArgs e){// 配置对象speechRec.SetInputToDefaultAudioDevice(); //设置默认输入speechRec.LoadGrammar(new DictationGrammar()); //设置语法// 事件处理方法speechRec.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(speechRecognized); //事件处理方法处需要有对应的函数调用} void speechRecognized(object sender, SpeechRecognizedEventArgs e){textBox_main.Text = e.Result.Text;} // 正在识别时调用的方法
接下来的工作
将简单的语音合成和识别结合,形成一个问答系统。能够对用户的回答进行情感分析并显示结果。(可选)将用户的回答与量表上问题答案做匹配,最终给出量表评分。总结
本次demo用到的原理其实十分简单,但作为第一次接触C#并且C++的一些写法忘记很多的小白,还需要花一定的时间做。特别是在搜索时,答案全是如何调用网络接口进行识别,基本没有用自带库的,所以这方面也是花了一定的时间。
如果大家有更好的C#方面的建议也请多多指正!