WEB开发网
开发学院软件开发VC 文本语音转换入门 阅读

文本语音转换入门

 2010-05-12 20:35:21 来源:WEB开发网   
核心提示:控制发音:<PRON SYM = ''h eh - l ow 1''/>这个标签的功能比较强,重点讲一下:所有的语言发音都是由基本的音素组成,文本语音转换入门(3),拿中文发音来说,拼音是组成发音的最基本的元素,SR(语音识别)更有趣,有兴趣不妨试试,只要知道汉字的拼音,即使

控制发音:

<PRON SYM = ''h eh - l ow 1''/>

这个标签的功能比较强,重点讲一下:所有的语言发音都是由基本的音素组成,拿中文发音来说,拼音是组成发音的最基本的元素,只要知道汉字的拼音,即使不知道怎么写,我们可知道这个字怎么都,对于TTS引擎来说,它不一定认识所有字,但是你把拼音对应的符号(SYM)给它,它就一定能够读出来,而英语发音则可以用音标表示,''h eh - l ow 1''就是hello这个单词对应的语素。至于发音与符号SYM具体对应关系请看SDK文档中的Phoneme Table。

再另外,数字、日期、时间的读法也有一套规则,SDK中有详细的说明,这里不说了(懒得翻译了),下面随便抛个例子:

<context ID = "date_ ymd">1999.12.21</context>

会读成

"December twenty first nineteen ninety nine"

XML标签可以嵌套使用,但是一定要遵守XML标准。XML标签确实好用,效果也不错,但是……缺点:一个字―――"烦",如果给一大段文字加标签,简直痛不欲生。

把文本语音输出为WAV文件

#include <sapi.h>
#include <sphelper.h>
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"sapi.lib")
int main(int argc, char* argv[])
{
  ISpVoice * pVoice = NULL;
  if (FAILED(::CoInitialize(NULL)))
    return FALSE;

  HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL,
    IID_ISpVoice, (void **)&pVoice);
  if( SUCCEEDED( hr ) )
  {
    CComPtr<ISpStream>      cpWavStream;
    CComPtr<ISpStreamFormat>  cpOldStream;
    CSpStreamFormat OriginalFmt;
    pVoice->GetOutputStream( &cpOldStream );
    OriginalFmt.AssignFormat(cpOldStream);
    hr = SPBindToFile( L"D:\\output.wav",SPFM_CREATE_ALWAYS,
      &cpWavStream,&OriginalFmt.FormatId(),
      OriginalFmt.WaveFormatExPtr() );
    if( SUCCEEDED( hr ) )
    {
      pVoice->SetOutput(cpWavStream,TRUE);
      WCHAR WTX[] = L"<VOICE REQUIRED=''NAME=Microsoft Mary''/>text to wave";
      pVoice->Speak(WTX, SPF_IS_XML, NULL);
      pVoice->Release();
      pVoice = NULL;
    }
  }

  ::CoUninitialize();
  return TRUE;
}

SPBindToFile把文件绑定到输出流上,而SetOutput把输出设为绑定文件的流上。

最后

看完本文后,是不是觉得很简单,微软把强大的功能封装的太好了。其实SDK中另外一个API,SR(语音识别)更有趣,有兴趣不妨试试,你会有意外的收获的。

本文配套源码

上一页  1 2 3 

Tags:文本 语音 转换

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接