基于 Visual C++2010 开发基于 Windows7 的语音识别与语音合成
-----语音技术业内资深专家尹成力作
Windows7 相比 Vista 已经进一步改善了语音技术的体验,改进了语音识别的识别率与
语音合成的朗读声音效果。语音技术与多点触摸是 Windows7 最耀眼的技术靓点之一。
语音合成和语音识别技术是实现人机语音通信,建立一个有听和讲能力的口语系统所
必需的两项关键技术。使电脑具有类似于人一样的说话能力,是当今时代信息产业的重要竞
争市场。
语音合成,又称文语转换(Text to Speech)技术,能将任意文字信息实时转化为标准流
畅的自然语音并朗读出来。它涉及声学、语言学、数字信号处理、计算机科学等多个学科,
是中文信息处理领域的一项前沿技术,解决的主要问题就是如何将文字信息转化为可听的声
音信息,即让机器像人一样开口说话。
语音识别,就是让机器通过分析和理解过程把语音信号转变为相应的文本或命令的尖端
技术。语音识别是一门交叉学科,所涉及的领域包括:信号处理、模式识别、概率论和信息
论、发声机理和听觉机理、人工智能等等。语音识别技术与语音合成技术一同成为实现人机
语音通信,建立有听和讲能力的语音系统所必需的两项关键技术。
让我们来体验下用 Visual C++2010 开发 Windows7 的语音识别与语音合成的快感,欣赏
微软最新的 Windows7 新技术给人们带来的便利。自己实现语音交互技术,让自己开发的软
件(准备运行在 Windows7 上的)可以与用户进行语音交互。Windows7 的语音识别与语音
合成与 Vista 与 XP 的有所不同,Windows7 下开发的应用于 Vista 与 XP 可能会遇到 API 兼容
问题。
因为 Windows7 都已经附带了.Net 平台,本文讲述用 Visual C++2010 开发基于 CLR 的
语音技术应用程序,并同时提供了基于 MFC 程序兼容调用 CLR 的办法,无论 Visual C++基于
CLR 或者 MFC 的程序,如果想升级到 Windows7,都可以很快为自己添加语音识别功能,语
音朗读功能。
Visual C++2010 开发基于 CLR 的 Windows7 语音技术
1.创建一个 CLR 的 Windows Forms Application 的项目,名称命名为 CSDN-speech
2.插入下列控件,如下图
3.单击 Project ,选择项目属性
3.在项目属性中我们将看到下图所示
4.单击按钮,Add New Reference,添加 System.Speech(版本为 4.0)的调用
5.单击朗读按钮,创建朗读按钮触发程序
6.在程序初始化部分添加下列代码,以添加对于语音技术的引用 ,还有对于语言文化类的
引用。
using namespace System::Speech;
using namespace System::Speech::Recognition;
using namespace System::Speech::Recognition::SrgsGrammar;
using namespace System::Speech::Synthesis;
using namespace System::Globalization;
7.在按钮“朗读下面添加下列代码”
SpeechSynthesizer ^synth;
synth =gcnew SpeechSynthesizer();
synth->Speak(this->textBox1->Text);
8.实验语音朗读,如下图,听听来自 Windows7 的语音朗读的声音效果
9.单击项目资源管理器 CSDN-speech 节点,添加一个类
10.添加一个纯 c++类
11.命名为 yuyin 类
12.yuyin.h 添加如下代码,代码具体意义见注释
#pragma once
using namespace System::Linq;
using namespace System::Text;
using namespace System::Speech;
using namespace System::Speech::Synthesis;
using namespace System::Speech::Recognition;
using namespace System::Globalization;
using namespace System::Windows::Forms;
namespace CSDNspeech {
public ref class yuyin
{
public:
SpeechRecognitionEngine ^recognizer; //定义语音识别器
DictationGrammar ^dictationGrammar;//定义语法
System::Windows::Forms::Control ^cDisplay; //定义一个关联文本控件
yuyin(array ^fg); //创建关键词语列表
private:
void InitializeSpeechRecognitionEngine(array ^fg);
public:
void BeginRec(Control ^tbResult); //开始语音识别,关联窗口控件
void over();//结束语音识别
virtual Grammar ^CreateCustomGrammar(array ^fg);
private:
void TurnSpeechRecognitionOn(); //开启语音识别
void TurnSpeechRecognitionOff();//关闭语音识别
void
recognizer_SpeechHypothesized(System::Object
^sender,
SpeechHypothesizedEventArgs ^e);
void
recognizer_SpeechRecognized(System::Object
^sender,
SpeechRecognizedEventArgs ^e); //语音识别器
void TurnDictationOn(); //打开词典
void TurnDictationOff();//关闭词典
};
}
13.yuyin.cpp 代码更新为下列代码,代码具体含义见注释
#include "StdAfx.h"
#include "yuyin.h"
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Linq;
using namespace System::Text;
using namespace System::Speech;
using namespace System::Speech::Synthesis;
using namespace System::Speech::Recognition;
using namespace System::Globalization;
using namespace System::Windows::Forms;
namespace CSDNspeech {
yuyin::yuyin(array ^fg) //fg 为语音识别关键词语列表
{
CultureInfo ^myCIintl = gcnew CultureInfo("zh-CN", false);//创建简体中文标示
for
each
(RecognizerInfo
^config
in
SpeechRecognitionEngine::InstalledRecognizers()) //获取所有语音引擎
{
if (config->Culture->Equals(myCIintl) && config->Id == "MS-2052-80-DESK") //
选择中文语音识别引擎
{
}
recognizer = gcnew SpeechRecognitionEngine(config);
break;
}
if (recognizer != nullptr)
{
InitializeSpeechRecognitionEngine(fg);//选择默认语音引擎
dictationGrammar = gcnew DictationGrammar();
MessageBox::Show("创建语音识别失败");
}
else
{
}
}