| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #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);
- }
|