马开东云搜索

WINDOWS语音编程初步(转自iwaswzq)

更新时间:2019-03-20 19:25:32  
原创,专业,图文 WINDOWS语音编程初步(转自iwaswzq) - WINDOWS,语音,编程,初步,iwaswzq 今日头条,最新,最好,最优秀,最靠谱,最有用,最好看,最有效,最热,排行榜,最牛,怎么办,怎么弄,解决方案,解决方法,怎么处理,如何处理,如何解决

3d开机号和试机号今天 www.jk1z4.cn 转自:iwaswzq

Windows 语音编程初步

一、SAPI简介

软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis)。这两个技术都需要语音引擎的支持。微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。

SAPI全称 The Microsoft Speech API.相关的SR和SS引擎位于Speech SDK开发包中。这个语音引擎支持多种语言的识别和朗读,包括英文、中文、日文等。

SAPI包括以下组件对象(接口):

(1)Voice Commands API。对应用程序进行控制,一般用于语音识别系统中。识别某个命令后,会调用相关接口是应用程序完成对应的功能。如果程序想实现语音控制,必须使用此组对象。
(2)Voice Dictation API。听写输入,即语音识别接口。
(3)Voice Text API。完成从文字到语音的转换,即语音合成。
(4)Voice Telephone API。语音识别和语音合成综合运用到电话系统之上,利用此接口可以建立一个电话应答系统,甚至可以通过电话控制计算机。
(5)Audio Objects API。封装了计算机发音系统。

SAPI是架构在COM基础上的,微软还提供了ActiveX控件,所以不仅可用于一般的windows程序,还可以用于网页、VBA甚至EXCEL的图表中。如果对COM感到陌生,还可以使用微软的C++ WRAPPERS,它用C++类封装了语音SDK COM对象。

二、安装SAPI SDK。

首先从这个站点下载开发包://www.microsoft.com/speech/download/sdk51

此文来自: 马开东云搜索 转载请注明出处 网址: //m.www.jk1z4.cn

此文原标题: WINDOWS语音编程初步(转自iwaswzq) 来源网址: //m.makaidong.com/20151029/6/0_383749.html

Microsoft Speech SDK 5.1添加了Automation支持。所以可以在VB,ECMAScript等支持Automation的语言中使用。

版本说明:
Version: 5.1
发布日期: 8/8/2001
语音: English
下载尺寸: 2.0 MB - 288.8 MB

这个SDK开发包还包括了可以随便发布的英文和中文的语音合成引擎(TTS),和英文、中文、日文的语音识别引擎(SR)。

系统要求98以上版本。编译开发包中的例子程序需要vc6以上环境。

******下载说明******:
(1)如果要下载例子程序,说明文档,SAPI以及用于开发的美国英语语音引擎,需要下载SpeechSDK51.exe,大约68M。
(2)如果想要使用简体中文和日文的语音引擎,需要下载SpeechSDK51LangPack.exe。大约82M。
(3)如果想要和自己的软件一起发布语音引擎,需要下载SpeechSDK51MSM.exe,大约132M。
     (在这个地址,我未能成功下载)。
(4)如果要获取XP下的 Mike 和 Mary 语音,下载Sp5TTIntXP.exe。大约3.5M。
(5)如果要获取开发包的文档说明,请下载sapi.chm。大约2.3M。这个在sdk51里面已经包含。

下载完毕后,首先安装SpeechSDK51.exe,然后安装中文语言补丁包SpeechSDK51LangPack,然后展开
msttss22l,自动将所需dll安装到系统目录。

三、配置vc环境

在vc6.0的环境下编译语音工程,首先要配置编译环境。假设sdk安装在d:\Microsoft Speech SDK 5.1\路径下,打开工程设置对话框,在c/c++栏中选择Preprocessor分类,然后在"附加包含路径"中输入
d:\Microsoft Speech SDK 5.1\include
告诉vc编译程序所需的SAPI头文件的位置。
然后切换到LINK栏,在Input分类下的附加库路径中输入:
d:\Microsoft Speech SDK 5.1\lib\i386
使vc在链接的时候能够找到sapi.lib。

四、语音合成的应用。即使用SAPI实现TTS(Text to Speech)。

1、首先要初始化语音接口,一般有两种方式:
   ISpVoice* pVoice;
   ::CoInitialize(NULL);
   HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice,
               (void **)&pVoice);
   然后就可以使用这个指针调用SAPI函数了,例如
   pVoice->SetVolume(50);//设置音量
   pVoice->Speak(str.AllocSysString(),SPF_ASYNC,NULL);

   另外也可以使用如下方式:
    CComPtr<ISpVoice>   m_cpVoice;
    HRESULT  hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
   在下面的例子中都用这个m_cpVoice变量。

   CLSID_SpVoice的定义位于SPAI.H中。

2、获取/设置输出频率。

   SAPI朗读文字的时候,可以采用多种频率方式输出声音,比如:
   8kHz 8Bit Mono、8kHz 8Bit Stereo、44kHz 16Bit Mono、44kHz 16Bit Stereo等。在音调上有所差别。具体可以参考sapi.h。

   可以使用如下代码获取当前的配置:
   CComPtr<ISpStreamFormat> cpStream;
   HRESULT hrOutputStream = m_cpVoice->GetOutputStream(&cpStream);
   if (hrOutputStream == S_OK)
   {
       CSpStreamFormat Fmt;
       hr = Fmt.AssignFormat(cpStream);
       if (SUCCEEDED(hr))
       {
           SPSTREAMFORMAT eFmt = Fmt.ComputeFormatEnum();
       }
   }
    SPSTREAMFORMAT 是一个ENUM类型,定义位于SPAI.H中。每一个值对应了不同的频率设置。例如 SPSF_8kHz8BitStereo  = 5

    通过如下代码设置当前朗读频率:
    CComPtr<ISpAudio>   m_cpOutAudio; //声音输出接口
    SpCreateDefaultObjectFromCategoryId( SPCAT_AUDIOOUT, &m_cpOutAudio ); //创建接口

    SPSTREAMFORMAT eFmt = 21; //SPSF_22kHz 8Bit Stereo

    CSpStreamFormat Fmt;
    Fmt.AssignFormat(eFmt);
    if ( m_cpOutAudio )
    {
 hr = m_cpOutAudio->SetFormat( Fmt.FormatId(), Fmt.WaveFormatExPtr() );
    }
    else  hr = E_FAIL;

    if( SUCCEEDED( hr ) )
   {
       m_cpVoice->SetOutput( m_cpOutAudio, FALSE );
   }

3、获取/设置播放所用语音。

   引擎中所用的语音数据文件一般保存在SpeechEngines下的spd或者vce文件中。安装sdk后,在注册表中保存了可用的语音,比如英文的男/女,简体中文的男音等。位置是:
   HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Voices\Tokens
如果安装在中文操作系统下,则缺省所用的朗读语音是简体中文。SAPI的缺点是不能支持中英文混读,在朗读中文的时候,遇到英文,只能逐个字母读出。所以需要程序自己进行语音切换。

(1) 可以采用如下的函数把当前SDK支持的语音填充在一个组合框中:
    // SAPI5 helper function in sphelper.h
    HWND hWndCombo = GetDlgItem( hWnd, IDC_COMBO_VOICES ); //组合框句柄
    HRESULT hr = SpInitTokenComboBox( hWndCombo , SPCAT_VOICES );
    这个函数是通过IEnumSpObjectTokens接口枚举当前可用的语音接口,把接口的说明文字添加到组合框中,并且把接口的指针作为LPARAM
    保存在组合框中。
    一定要记住最后程序退出的时候,释放组合框中保存的接口:
    SpDestroyTokenComboBox( hWndCombo );
    这个函数的原理就是逐个取得combo里面每一项的LPARAM数据,转换成IUnknown接口指针,然后调用Release函数。
(2) 当组合框选择变化的时候,可以用下面的函数获取用户选择的语音:
    ISpObjectToken* pToken = SpGetCurSelComboBoxToken( hWndCombo );

(3) 用下面的函数获取当前正在使用的语音:
    CComPtr<ISpObjectToken> pOldToken;
    HRESULT hr = m_cpVoice->GetVoice( &pOldToken );
(4) 当用户选择的语音和当前正在使用的不一致的时候,用下面的函数修改:
    if (pOldToken != pToken)
    {       
         // 首先结束当前的朗读,这个不是必须的。
         HRESULT hr = m_cpVoice->Speak( NULL, SPF_PURGEBEFORESPEAK, 0);
         if (SUCCEEDED (hr) )
        {
            hr = m_cpVoice->SetVoice( pToken );
         }
    }
(5) 也可以直接使用函数SpGetTokenFromId获取指定voice的Token指针,例如:
      WCHAR pszTokenId[] = L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\MSSimplifiedChineseVoice";
    SpGetTokenFromId(pszTokenID , &pChineseToken);

4、开始/暂停/恢复/结束当前的朗读
  
   要朗读的文字必须位于宽字符串中,假设位于szWTextString中,则:
   开始朗读的代码:
   hr = m_cpVoice->Speak( szWTextString, SPF_ASYNC | SPF_IS_NOT_XML, 0 );
   如果要解读一个XML文本,用:
   hr = m_cpVoice->Speak( szWTextString, SPF_ASYNC | SPF_IS_XML, 0 );

   暂停的代码:   m_cpVoice->Pause();
   恢复的代码:   m_cpVoice->Resume();
   结束的代码:(上面的例子中已经给出了)
   hr = m_cpVoice->Speak( NULL, SPF_PURGEBEFORESPEAK, 0);

5、跳过部分朗读的文字

   在朗读的过程中,可以跳过部分文字继续后面的朗读,代码如下:
   ULONG ulGarbage = 0;
   WCHAR szGarbage[] = L"Sentence";
   hr = m_cpVoice->Skip( szGarbage, SkipNum, &ulGarbage );
   SkipNum是设置要跳过的句子数量,值可以是正/负。
   根据sdk的说明,目前SAPI仅仅支持SENTENCE这个类型。SAPI是通过标点符号来区分句子的。

6、播放WAV文件。SAPI可以播放WAV文件,这是通过ISpStream接口实现的:

   CComPtr<ISpStream>       cpWavStream;
   WCHAR                    szwWavFileName[NORM_SIZE] = L"";;

   USES_CONVERSION;
   wcscpy( szwWavFileName, T2W( szAFileName ) );//从ANSI将WAV文件的名字转换成宽字符串

   //使用sphelper.h 提供的这个函数打开 wav 文件,并得到一个 IStream 指针
   hr = SPBindToFile( szwWavFileName, SPFM_OPEN_READONLY, &cpWavStream );
   if( SUCCEEDED( hr ) )
   {
        m_cpVoice->SpeakStream( cpWavStream, SPF_ASYNC, NULL );//播放WAV文件
   }
7、将朗读的结果保存到wav文件
   TCHAR szFileName[256];//假设这里面保存着目标文件的路径
   USES_CONVERSION;
   WCHAR m_szWFileName[MAX_FILE_PATH];
   wcscpy( m_szWFileName, T2W(szFileName) );//转换成宽字符串

   //创建一个输出流,绑定到wav文件
   CSpStreamFormat OriginalFmt;
   CComPtr<ISpStream>  cpWavStream;
   CComPtr<ISpStreamFormat>    cpOldStream;
   HRESULT hr = m_cpVoice->GetOutputStream( &cpOldStream );
   if (hr == S_OK) hr = OriginalFmt.AssignFormat(cpOldStream);
   else  hr = E_FAIL;
   // 使用sphelper.h中提供的函数创建 wav 文件
   if (SUCCEEDED(hr))
   {
      hr = SPBindToFile( m_szWFileName, SPFM_CREATE_ALWAYS, &cpWavStream,
                         &OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() );
    }
   if( SUCCEEDED( hr ) )
   {
      //设置声音的输出到 wav 文件,而不是 speakers
      m_cpVoice->SetOutput(cpWavStream, TRUE);
    }
    //开始朗读
    m_cpVoice->Speak( szWTextString, SPF_ASYNC | SPF_IS_NOT_XML, 0 );

    //等待朗读结束
    m_cpVoice->WaitUntilDone( INFINITE );
    cpWavStream.Release();

    //把输出重新定位到原来的流
    m_cpVoice->SetOutput( cpOldStream, FALSE );
  
8、设置朗读音量和速度
   m_cpVoice->SetVolume((USHORT)hpos); //设置音量,范围是 0 - 100
   m_cpVoice->SetRate(hpos);  //设置速度,范围是 -10 - 10

   hpos的值一般位于

9、设置SAPI通知消息。SAPI在朗读的过程中,会给指定窗口发送消息,窗口收到消息后,可以主动获取SAPI的事件,
   根据事件的不同,用户可以得到当前SAPI的一些信息,比如正在朗读的单词的位置,当前的朗读口型值(用于显
   示动画口型,中文语音的情况下并不提供这个事件)等等。

   要获取SAPI的通知,首先要注册一个消息:
   m_cpVoice->SetNotifyWindowMessage( hWnd, WM_TTSAPPCUSTOMEVENT, 0, 0 );
   这个代码一般是在主窗口初始化的时候调用,hWnd是主窗口(或者接收消息的窗口)句柄。WM_TTSAPPCUSTOMEVENT
   是用户自定义消息。

   在窗口响应WM_TTSAPPCUSTOMEVENT消息的函数中,通过如下代码获取sapi的通知事件:

    CSpEvent        event;  // 使用这个类,比用 SPEVENT结构更方便

    while( event.GetFrom(m_cpVoice) == S_OK )
    {
        switch( event.eEventId )
        {
           。。。
        }
    }

   eEventID有很多种,比如SPEI_START_INPUT_STREAM表示开始朗读,SPEI_END_INPUT_STREAM表示朗读结束等。
   可以根据需要进行判断使用。

四、结束语
  
   SAPI的功能很多,比如语音识别、使用语法分析等,由于条件和精力有限,我未能一一尝试,感兴趣的朋友可以自己安装一个研究一下。
   另外提供一个简单例子程序的下载,位置是:
   //www.cnblogs.com/buffer/admin/ftp://vckbase:[email protected]/user/iwaswzq/Universe.rar
   再次感谢砸玻璃。

 感谢原作者:iwaswzq

原创,专业,图文 WINDOWS语音编程初步(转自iwaswzq) - WINDOWS,语音,编程,初步,iwaswzq 今日头条,最新,最好,最优秀,最靠谱,最有用,最好看,最有效,最热,排行榜,最牛,怎么办,怎么弄,解决方案,解决方法,怎么处理,如何处理,如何解决

正在加载中……

伪原创_伪原创工具_在线伪原创_洗稿工具_AI+智能写作机器人 伪原创,伪原创工具,在线伪原创,洗稿工具,AI+智能写作机器人 ★伪原创☆伪原创工具,在线伪原创,洗稿工具,AI+智能写作机器人是专门生成原创及伪原创文章的在线工具,对各类自媒体平台:微信公众号文章伪原创,百家号,大鱼号,网易号,搜狐号,今日头条,大风号,企鹅号,伪原创,伪原创工具,在线伪原创,洗稿工具,AI+智能写作机器人,在线伪原创工具可以把在互联网上复制的文章瞬间变成原创文章。提供免费的专业伪原创工具,专门针对谷歌、百度、360搜索等大型搜索引擎收录设计,通过伪原创工具生成的文章,会更好的被搜索引擎收录和索引到。网站每天更新词库,让您的网站排名直线飙升! 自媒体征稿 自媒体约稿平台 自媒体投稿有哪些 自媒体投稿 自媒体如何投稿 智能写作机器人 纸牌屋洗稿 纸牌屋伪原创 在线伪原创 原创度检测 写作机器人软件下载 写作机器人 写作机器 小发猫 洗稿 伪原创工具 伪原创吧 伪原创 投稿自媒体 如何洗稿 如何给自媒体投稿 人工智能写作软件 人工智能写作 麒麟原创检测工具 麒麟原创度在线检测 麒麟原创度检测在线 麒麟原创度检测工具 麒麟原创度检测 麒麟原创度 麒麟文章原创度检测工具 奶盘网 奶盘 机器写作 机器人写作 giiso写作机器人 肉盘伪原创 肉盘洗稿 自媒体洗稿 奶盘洗稿 肉盘SEO 奶盘伪原创 今日头条伪原创 百家号伪原创 大鱼号伪原创 微信公众号伪原创 头条号伪原创 大风号伪原创 搜狐号伪原创 网易号伪原创 企鹅号伪原创 今日头条洗稿 百家号洗稿 大鱼号洗稿 微信公众号洗稿 头条号洗稿 大风号洗稿 搜狐号洗稿 网易号洗稿 企鹅号洗稿

  • 西安位居最受欢迎十大旅游城市第四 2019-03-20
  • 广州跨境电商进口增长强劲 2019-03-19
  • 退牧还草 为藏羚羊迁徙让路 2019-03-13
  • 总书记,我们有信心实现高质量发展! 2019-03-08
  • 西部网(陕西新闻网)www.cnwest.com 2019-03-06
  • 5月问政报告:302条留言有回复 环保教育问题投诉增多 2019-03-06
  • 菊花茶可以和什么东西一起泡 都有哪些功效呢-美食资讯 2019-03-03
  • 【奋斗在新时代】劳道“歹猫”增色互联网“表情” 2019-03-03
  • 纸质书电子书何必分高低 2019-02-15
  • 马克思的共产主义,什么时候说了生产资料需要“按需分配”了? 2019-02-12
  • 新时代湖北讲习所:讲学成一道风景,做实成一种自觉  2019-02-12
  • 足球盛宴来袭 省会首届迷你世界杯赛正式打响 2019-02-11
  • 日本大阪6.1级地震 镜头记录事发那一刻 2019-02-10
  • 胡世忠在泰和调研经济运行和项目建设 2019-02-10
  • 看看马克思主义是怎样产生的就明白了。 2019-02-09
  • 321| 702| 976| 893| 360| 819| 139| 737| 396| 997|