您现在的位置是:网站首页> C/C++

科大讯飞TTS

  • C/C++
  • 2021-03-24
  • 960人已阅读
摘要

一个调用科大讯飞TTS进行语音合成的按钮响应函数,为何第一次运行(点击这个按钮)都正常,第二次运行程序就异常退出?检查了多遍,都看不到哪里不妥。设置断点进行调试的话,程序运行到科大讯飞的函数处,就跳出来了。

代码如下:

BOOL UPLOADCONTENTS::OnCreatevoice() 
{
    CString sql;
    int i;
  m_createvoice.EnableWindow(false);
UpdateData(TRUE);
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
for (i=beginindex;i<=endindex;i++)
{
sql.Format("update tb_phoneout set 通知内容='%s',结果='未通知' where 序号=%i",m_contents,i);
//执行SQL语句
m_AdoConn.ExecuteSQL((_bstr_t)sql);
}
    m_AdoConn.ExitConnect();
  

//开始调用TTS合成语音
DWORD dwErr;
char szInfo[255];
char *strIP;
//如果需要网络合成,则初始化服务器IP地址,否则传入NULL参数
//strcpy(strIP,"192.168.75.17");
strIP=NULL;

//装载STTSApi.dll和iFlyTTS.dll
if(!STTSLoadLibrary()) 
{
dwErr=GetLastError();
if(TTSGETERRCODE(dwErr) == TTSERR_LOADDLL) {
TRACE("错误原因:不能装载TTSApi.dll\n");
}
AfxMessageBox("不能装载STTSApi.dll");
return FALSE;
}
//初始化,首次调用此函数将把TTS系统中需要的一些通用模块加载到系统内存中并完成其他一些初始化步骤,所以可能花较多的时间。
if(!(m_bSTTSInit=STTSInit())) 
{
dwErr = GetLastError();
if ( dwErr != TTSERR_OK ) 
{
if ( TTSGETERRCODE(dwErr) == TTSERR_NOLICENCE ) {
sprintf(szInfo, "初始化TTS失败, 错误原因: 没有正确的授权。");
}
else {
sprintf(szInfo, "初始化TTS失败, 错误代号: %d。", dwErr);
}
AfxMessageBox( szInfo, MB_OK|MB_ICONSTOP );
return FALSE;
}
}

// 产品序列号,从科大讯飞公司获得
char g_SerialNo[]="P4LD6A-5TVH5D-ZJ3ZZP";
HTTSINSTANCE hTTSInstance;
//调用STTSConnect接口,连接语音合成服务器
if(!(hTTSInstance=STTSConnect(g_SerialNo,strIP))) {
AfxMessageBox(_T("连接TTS服务器失败"));
TRACE("[0x%08x] Thread can not connect to kernel! end thread!\n", GetCurrentThreadId());
return 0;
}
    //定义待合成文本
TCHAR szSource[MAX_PATH];
//szDest是成员变量
ZeroMemory(szSource,MAX_PATH);
ZeroMemory(szDest,MAX_PATH);
    lstrcpy(szSource,m_contents);
//增加尾部提示语音
lstrcat(szSource,"。。如已知晓,无需再次通知,请按井号键反馈…");
    //处理目标路径
char pBuf[MAX_PATH]; //存放路径的变量
    GetModuleFileName(NULL, pBuf, MAX_PATH);
    (_tcsrchr(pBuf, _T('\\')))[1] = 0; //删除文件名,只获得路径
/* 设置文件名为当前日期时间 */

 COleDateTime timeNow, dateNow;
 timeNow = COleDateTime::GetCurrentTime();     // 获取当前日期时间
 dateNow = COleDateTime::GetCurrentTime();     // 同样获取当前日期时间,这么写只是为了清晰
 CString sTime = timeNow.Format(VAR_TIMEVALUEONLY);     // 获取当前时间
 CString sDate = dateNow.Format(VAR_DATEVALUEONLY);     // 获取当前日期
 CString FileName = sDate + "_" + sTime;     // 文件名 = 日期_时间
 int fileNameLength = FileName.GetLength();     // 获得文件名长度,CFile不能用CString,只能用string做参数,要做转换
 char pFileName[99];
 for(i=0; i < fileNameLength ; i++)
 {
  pFileName[i] = FileName.GetAt(i);     // CString -> string
  if( pFileName[i] == ':')     // 剔除':'等不能作为文件名的符号
   pFileName[i] = '-';
 }
 pFileName[i] = '\0';     // 文件名结束,一定要加,不然有错
 sprintf(szDest,"%svoice\\%s.wav",pBuf,pFileName);  
//将文件路径写入数据库
ADOConn m_ADOConn;
m_ADOConn.OnInitADOConn();
for(i=beginindex;i<=endindex;i++)
{
sql.Format("update tb_phoneout set 语音文件='%s' where 序号=%d",szDest,i);
m_ADOConn.ExecuteSQL((_bstr_t)sql);
}
m_ADOConn.ExitConnect();
//设置语速
if(!STTSSetParam(hTTSInstance,TTS_PARAM_SPEED,-300))
AfxMessageBox("设置语速错误,按照缺省的语速合成。");
//设置音频格式
if(!STTSSetParam(hTTSInstance,TTS_PARAM_AUDIODATAFMT,TTS_ADF_PCM8K8B1C))
AfxMessageBox("设置AudioFmt错误,按照缺省的音频格式合成。");
//合成文件
if(!STTSString2AudioFile(hTTSInstance,szSource,szDest)) {
AfxMessageBox("从字符串合成波形文件失败!");
return 0;
}
//合成完毕,释放句柄
STTSDisconnect(hTTSInstance);
if(STTSDeinit( ) == FALSE)
{
AfxMessageBox("断开与TTS服务的连接失败");
}
//卸载STTSApi.dll
STTSUnloadLibrary();  

m_createvoice.EnableWindow(true);
m_listen.EnableWindow(true);
m_begindial.EnableWindow(true);
return TRUE;
}

下一篇:QT相关下载·

Top