#include "StdAfx.h" #include "TtsCore.h" #include "md5c.h" #include "TtsIbm.h" #include "TTSjt.h" #include "..\\Logger\Logger.h" SINGLETON_IMPLEMENT(CTtsCore) ITtsInterface& ITtsInterface::getInstance(void) { return CTtsCore::GetInstance(); } CTtsCore::CTtsCore(void) : m_TTSImmplement(NULL) { } CTtsCore::~CTtsCore(void) { close(); } /***************************************************************** **【函数名称】 __createTTSPath **【函数功能】 创建TTS文件路径 **【参数】 **【返回值】 ****************************************************************/ void CTtsCore::__createTTSPath( LPCSTR BufferPath ) { if(BufferPath != NULL) { m_BufferPath = BufferPath; if(m_BufferPath.Right(1) != _T("\\")) m_BufferPath += _T("\\"); } else m_BufferPath = TTS_WAVE_FILE_PATH; CFileFind fileFind; if(!fileFind.FindFile(m_BufferPath)) { ::CreateDirectory(m_BufferPath, NULL); } } /***************************************************************** **【函数名称】 __isAudioExisted **【函数功能】 查找是否存在当前文本串的语音文件 **【参数】 szStr 要转换的文本串 nFileNameLen 语音文件名缓冲区长度 isFile 要转换的音源是否为文件 **【返回值】 szFileName 转换成的语音文件名(全路径) ****************************************************************/ BOOL CTtsCore::__isAudioExisted( LPTSTR szStr, LPTSTR szFileName, int nFileNameLen, bool isFile ) { CHAR szMd5String[1024] = { 0 }; // 得到当前文本串的MD5值 if(isFile) { MD5File(szStr, szMd5String); } else { MD5String((UCHAR*)szStr, strlen(szStr), szMd5String); } // 生成语音文件名 memset(szFileName, 0, nFileNameLen); sprintf_s(szFileName, nFileNameLen, _T("%s%s.wav"), m_BufferPath, szMd5String); // 查找是否存在当前文本串的语音文件 CFileFind fileFind; if(fileFind.FindFile(szFileName)) return TRUE; else return FALSE; } /***************************************************************** **【函数名称】 init **【函数功能】 初始化TTS **【参数】 TtsType:TTS类型 ErrorInfo:如果初始化失败,返回失败原因 **【返回值】 true:初始化成功 ****************************************************************/ bool CTtsCore::init( TTS_TYPE TtsType, LPCSTR BufferPath, LPTSTR ErrorInfo ) { switch (TtsType) { case TTS_IFLY: break; case TTS_IBM: m_TTSImmplement = new CTtsIbm; break; case TTS_JT: m_TTSImmplement = new CTtsJt; break; default: ASSERT(FALSE); } if(m_TTSImmplement == NULL) { lstrcpy(ErrorInfo, _T("生成TTS实例对象失败!")); return false; } if(!m_TTSImmplement->load()) { lstrcpy(ErrorInfo, _T("加载TTS引擎失败!")); return false; } if(!m_TTSImmplement->init(ErrorInfo)) return false; __createTTSPath(BufferPath); return true; } /***************************************************************** **【函数名称】 close **【函数功能】 接口关闭 **【参数】 **【返回值】 ****************************************************************/ void CTtsCore::close( void ) { if(m_TTSImmplement == NULL) return; m_TTSImmplement->close(); delete m_TTSImmplement; m_TTSImmplement = NULL; } /***************************************************************** **【函数名称】 setTTSParam **【函数功能】 设置字符串读得方式比如一零一,一百零一,语速,音量 **【参数】 **【返回值】 ****************************************************************/ bool CTtsCore::setTTSParam( int NumReadType, int Speed, int Volume ) { if(m_TTSImmplement == NULL) return false; return m_TTSImmplement->setParam(NumReadType, Speed, Volume); } /***************************************************************** **【函数名称】 string2Audio **【函数功能】 Text:需要转换的字符串 AudioName:转换后的文件名 Len:添入的文件名的长度 **【参数】 **【返回值】 成功TRUE,失败FALSE ****************************************************************/ bool CTtsCore::string2Audio( LPTSTR Text, LPTSTR AudioName, int Len ) { // 如果已存在当前文本串的语音文件 //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsCore.string2Audio}: 检查语音文件是否已经存在")); if (__isAudioExisted(Text, AudioName, Len, false)) { //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsCore.string2Audio}: 语音文件已经存在")); return true; } //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTtsCore.string2Audio}: 语音文件不存在准备生成语音文件")); if (m_TTSImmplement == NULL) { return false; } return m_TTSImmplement->string2Audio(Text, AudioName); } /***************************************************************** **【函数名称】 file2Audio **【函数功能】 FileName:需要转换的文本文件名 AudioName:转换后的文件名 Len:添入的文件名的长度 **【参数】 **【返回值】 ****************************************************************/ bool CTtsCore::file2Audio( LPTSTR FileName, LPTSTR AudioName, int Len ) { // 如果已存在当前文件的语音文件 if(__isAudioExisted(FileName, AudioName, Len, true)) return true; if(m_TTSImmplement == NULL) return false; return m_TTSImmplement->file2Audio(FileName, AudioName); }