#include "StdAfx.h" #include "TTSibm.h" #include "..\\Logger\Logger.h" CTtsIbm::CTtsIbm(void) : m_Handle(NULL_ECI_HAND), m_Module(NULL), m_ProcEciNew(NULL), m_ProcEciDelete(NULL), m_ProcEciSetParam(NULL), m_ProcEciSetVoiceParam(NULL), m_ProcEciSetOutputFilename(NULL), m_ProcEciAddText(NULL), m_ProcEciSynthesize(NULL), m_ProcEciSynchronize(NULL), m_ProcEciSynthesizeFile(NULL) { } CTtsIbm::~CTtsIbm(void) { close(); } ECICallbackReturn CTtsIbm::Callback( ECIHand eciHand, ECIMessage msg, long param, void * data ) { if( msg == eciWaveformBuffer ) { // Add your code here. } return eciDataProcessed; } /***************************************************************** **【函数名称】 load **【函数功能】 加载TTS引擎 **【参数】 **【返回值】 ****************************************************************/ bool CTtsIbm::load( LPCTSTR LibPath/* = NULL*/ ) { if(LibPath == NULL) m_Module = LoadLibrary(_T("ibmeci.dll")); else m_Module = LoadLibrary(LibPath); if(m_Module == NULL) return false; if((m_ProcEciNew = (__eciNew)GetProcAddress(m_Module, _T("eciNew"))) == NULL) return false; if((m_ProcEciDelete = (__eciDelete)GetProcAddress(m_Module, _T("eciDelete"))) == NULL) return false; if((m_ProcEciSetParam = (__eciSetParam)GetProcAddress(m_Module, _T("eciSetParam"))) == NULL) return false; if((m_ProcEciSetVoiceParam = (__eciSetVoiceParam)GetProcAddress(m_Module, _T("eciSetVoiceParam"))) == NULL) return false; if((m_ProcEciSetOutputFilename = (__eciSetOutputFilename)GetProcAddress(m_Module, _T("eciSetOutputFilename"))) == NULL) return false; if((m_ProcEciAddText = (__eciAddText)GetProcAddress(m_Module, _T("eciAddText"))) == NULL) return false; if((m_ProcEciSynthesize = (__eciSynthesize)GetProcAddress(m_Module, _T("eciSynthesize"))) == NULL) return false; if((m_ProcEciSynchronize = (__eciSynchronize)GetProcAddress(m_Module, _T("eciSynchronize"))) == NULL) return false; if((m_ProcEciSynthesizeFile = (__eciSynthesizeFile)GetProcAddress(m_Module, _T("eciSynthesizeFile"))) == NULL) return false; return true; } /***************************************************************** **【函数名称】 init **【函数功能】 初始化TTS **【参数】 a_ErrorInfo:如果初始化失败,返回失败原因 **【返回值】 TRUE:初始化成功 ****************************************************************/ bool CTtsIbm::init( LPTSTR a_ErrorInfo ) { if(m_Handle == NULL) { // 初始化TTS m_Handle = m_ProcEciNew(); if(m_Handle == NULL_ECI_HAND) { lstrcpy(a_ErrorInfo, _T("创建TTS实例失败!")); return false; } // end if } return true; } /***************************************************************** **【函数名称】 close **【函数功能】 释放TTS连接 **【参数】 **【返回值】 ****************************************************************/ void CTtsIbm::close(void) { if(m_Handle != NULL_ECI_HAND) { m_ProcEciDelete(m_Handle); m_Handle = NULL_ECI_HAND; } if(m_Module != NULL) { FreeLibrary(m_Module); m_Module = NULL; } } /***************************************************************** **【函数名称】 setParam **【函数功能】 设置合成前的参数 **【参数】 a_NumReadType读的方式:1数值,2字符串方式 a_Speed:音速 a_Volume:音量 **【返回值】 ****************************************************************/ bool CTtsIbm::setParam( int a_NumReadType, int a_Speed, int a_Volume ) { if(m_Handle == NULL_ECI_HAND) return false; // 设置合成参数 m_ProcEciSetParam(m_Handle, eciInputType, a_NumReadType); // 文本中是否含有注释 m_ProcEciSetVoiceParam(m_Handle, 0, eciSpeed, a_Speed); // 音速 m_ProcEciSetVoiceParam(m_Handle, 0, eciPitchBaseline, 50); // 音高 m_ProcEciSetVoiceParam(m_Handle, 0, eciVolume, a_Volume); // 音量 return true; } /***************************************************************** **【函数名称】 string2Audio **【函数功能】 转换文本串到语音文件 **【参数】 a_Text 要转换的文本串 a_AudioName 语音文件名 **【返回值】 ****************************************************************/ bool CTtsIbm::string2Audio( LPTSTR a_Text, LPTSTR a_AudioName ) { if(m_Handle == NULL_ECI_HAND) return false; // 设置输出文件名 if(!m_ProcEciSetOutputFilename(m_Handle, a_AudioName)) return false; //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: 开始合成文件")); // 开始合成 if(!m_ProcEciAddText(m_Handle, /*(ECIInputText)*/(const char*)a_Text)) return false; ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: 合成文件完成")); if(!m_ProcEciSynthesize(m_Handle)) return false; //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: m_ProcEciSynchronize函数开始")); m_ProcEciSynchronize(m_Handle); //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsIbm.string2Audio}: m_ProcEciSynchronize函数完成")); return true; } /***************************************************************** **【函数名称】 file2Audio **【函数功能】 转换文本文件到语音文件 **【参数】 a_FileName 要转换的文本文本文件名 a_AudioName 语音文件名 **【返回值】 ****************************************************************/ bool CTtsIbm::file2Audio( LPTSTR a_FileName, LPTSTR a_AudioName ) { if(m_Handle == NULL_ECI_HAND) return false; // 设置输出文件名 if(!m_ProcEciSetOutputFilename(m_Handle, a_AudioName)) return false; // 开始合成 if(!m_ProcEciSynthesizeFile(m_Handle, a_FileName)) return false; m_ProcEciSynchronize(m_Handle); return true; }