组件

TtsIbm.cpp 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "StdAfx.h"
  2. #include "TTSibm.h"
  3. #include "..\\Logger\Logger.h"
  4. CTtsIbm::CTtsIbm(void) : m_Handle(NULL_ECI_HAND), m_Module(NULL), m_ProcEciNew(NULL), m_ProcEciDelete(NULL), m_ProcEciSetParam(NULL), m_ProcEciSetVoiceParam(NULL),
  5. m_ProcEciSetOutputFilename(NULL), m_ProcEciAddText(NULL), m_ProcEciSynthesize(NULL), m_ProcEciSynchronize(NULL), m_ProcEciSynthesizeFile(NULL)
  6. {
  7. }
  8. CTtsIbm::~CTtsIbm(void)
  9. {
  10. close();
  11. }
  12. ECICallbackReturn CTtsIbm::Callback( ECIHand eciHand, ECIMessage msg, long param, void * data )
  13. {
  14. if( msg == eciWaveformBuffer )
  15. {
  16. // Add your code here.
  17. }
  18. return eciDataProcessed;
  19. }
  20. /*****************************************************************
  21. **【函数名称】 load
  22. **【函数功能】 加载TTS引擎
  23. **【参数】
  24. **【返回值】
  25. ****************************************************************/
  26. bool CTtsIbm::load( LPCTSTR LibPath/* = NULL*/ )
  27. {
  28. if(LibPath == NULL)
  29. m_Module = LoadLibrary(_T("ibmeci.dll"));
  30. else
  31. m_Module = LoadLibrary(LibPath);
  32. if(m_Module == NULL)
  33. return false;
  34. if((m_ProcEciNew = (__eciNew)GetProcAddress(m_Module, _T("eciNew"))) == NULL)
  35. return false;
  36. if((m_ProcEciDelete = (__eciDelete)GetProcAddress(m_Module, _T("eciDelete"))) == NULL)
  37. return false;
  38. if((m_ProcEciSetParam = (__eciSetParam)GetProcAddress(m_Module, _T("eciSetParam"))) == NULL)
  39. return false;
  40. if((m_ProcEciSetVoiceParam = (__eciSetVoiceParam)GetProcAddress(m_Module, _T("eciSetVoiceParam"))) == NULL)
  41. return false;
  42. if((m_ProcEciSetOutputFilename = (__eciSetOutputFilename)GetProcAddress(m_Module, _T("eciSetOutputFilename"))) == NULL)
  43. return false;
  44. if((m_ProcEciAddText = (__eciAddText)GetProcAddress(m_Module, _T("eciAddText"))) == NULL)
  45. return false;
  46. if((m_ProcEciSynthesize = (__eciSynthesize)GetProcAddress(m_Module, _T("eciSynthesize"))) == NULL)
  47. return false;
  48. if((m_ProcEciSynchronize = (__eciSynchronize)GetProcAddress(m_Module, _T("eciSynchronize"))) == NULL)
  49. return false;
  50. if((m_ProcEciSynthesizeFile = (__eciSynthesizeFile)GetProcAddress(m_Module, _T("eciSynthesizeFile"))) == NULL)
  51. return false;
  52. return true;
  53. }
  54. /*****************************************************************
  55. **【函数名称】 init
  56. **【函数功能】 初始化TTS
  57. **【参数】 a_ErrorInfo:如果初始化失败,返回失败原因
  58. **【返回值】 TRUE:初始化成功
  59. ****************************************************************/
  60. bool CTtsIbm::init( LPTSTR a_ErrorInfo )
  61. {
  62. if(m_Handle == NULL)
  63. {
  64. // 初始化TTS
  65. m_Handle = m_ProcEciNew();
  66. if(m_Handle == NULL_ECI_HAND)
  67. {
  68. lstrcpy(a_ErrorInfo, _T("创建TTS实例失败!"));
  69. return false;
  70. } // end if
  71. }
  72. return true;
  73. }
  74. /*****************************************************************
  75. **【函数名称】 close
  76. **【函数功能】 释放TTS连接
  77. **【参数】
  78. **【返回值】
  79. ****************************************************************/
  80. void CTtsIbm::close(void)
  81. {
  82. if(m_Handle != NULL_ECI_HAND)
  83. {
  84. m_ProcEciDelete(m_Handle);
  85. m_Handle = NULL_ECI_HAND;
  86. }
  87. if(m_Module != NULL)
  88. {
  89. FreeLibrary(m_Module);
  90. m_Module = NULL;
  91. }
  92. }
  93. /*****************************************************************
  94. **【函数名称】 setParam
  95. **【函数功能】 设置合成前的参数
  96. **【参数】 a_NumReadType读的方式:1数值,2字符串方式
  97. a_Speed:音速
  98. a_Volume:音量
  99. **【返回值】
  100. ****************************************************************/
  101. bool CTtsIbm::setParam( int a_NumReadType, int a_Speed, int a_Volume )
  102. {
  103. if(m_Handle == NULL_ECI_HAND)
  104. return false;
  105. // 设置合成参数
  106. m_ProcEciSetParam(m_Handle, eciInputType, a_NumReadType); // 文本中是否含有注释
  107. m_ProcEciSetVoiceParam(m_Handle, 0, eciSpeed, a_Speed); // 音速
  108. m_ProcEciSetVoiceParam(m_Handle, 0, eciPitchBaseline, 50); // 音高
  109. m_ProcEciSetVoiceParam(m_Handle, 0, eciVolume, a_Volume); // 音量
  110. return true;
  111. }
  112. /*****************************************************************
  113. **【函数名称】 string2Audio
  114. **【函数功能】 转换文本串到语音文件
  115. **【参数】 a_Text 要转换的文本串
  116. a_AudioName 语音文件名
  117. **【返回值】
  118. ****************************************************************/
  119. bool CTtsIbm::string2Audio( LPTSTR a_Text, LPTSTR a_AudioName )
  120. {
  121. if(m_Handle == NULL_ECI_HAND)
  122. return false;
  123. // 设置输出文件名
  124. if(!m_ProcEciSetOutputFilename(m_Handle, a_AudioName))
  125. return false;
  126. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: 开始合成文件"));
  127. // 开始合成
  128. if(!m_ProcEciAddText(m_Handle, /*(ECIInputText)*/(const char*)a_Text))
  129. return false;
  130. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: 合成文件完成"));
  131. if(!m_ProcEciSynthesize(m_Handle))
  132. return false;
  133. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: m_ProcEciSynchronize函数开始"));
  134. m_ProcEciSynchronize(m_Handle);
  135. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: m_ProcEciSynchronize函数完成"));
  136. return true;
  137. }
  138. /*****************************************************************
  139. **【函数名称】 file2Audio
  140. **【函数功能】 转换文本文件到语音文件
  141. **【参数】 a_FileName 要转换的文本文本文件名
  142. a_AudioName 语音文件名
  143. **【返回值】
  144. ****************************************************************/
  145. bool CTtsIbm::file2Audio( LPTSTR a_FileName, LPTSTR a_AudioName )
  146. {
  147. if(m_Handle == NULL_ECI_HAND)
  148. return false;
  149. // 设置输出文件名
  150. if(!m_ProcEciSetOutputFilename(m_Handle, a_AudioName))
  151. return false;
  152. // 开始合成
  153. if(!m_ProcEciSynthesizeFile(m_Handle, a_FileName))
  154. return false;
  155. m_ProcEciSynchronize(m_Handle);
  156. return true;
  157. }