#include <sapi.h>
#include <sphelper.h>//可以多次朗读文本
void CSapitestDlg::OnSpeak()
{
UpdateData();
ISpVoice * pVoice = NULL; if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(m_Text.AllocSysString(), 0, NULL);
pVoice->Release();
pVoice = NULL;
} CoUninitialize();
}//文本转换成语音,只能转换一条
//同时转换多条记录有问题 !!!!!!
void CSapitestDlg::OnRecord()
{
ISpVoice * pVoice = NULL;
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
TCHAR szFileName[256];
TCHAR szContent[256];
strcpy(szFileName,"D:\\ttsTest.wav");
strcpy(szContent,"hello 你好 "); USES_CONVERSION;
WCHAR m_szWFileName[256];
WCHAR m_szContent[256];
wcscpy(m_szWFileName, T2W(szFileName) );
wcscpy(m_szContent, T2W(szContent) );
CSpStreamFormat OriginalFmt;
CComPtr<ISpStream> cpWavStream;
CComPtr<ISpStreamFormat> cpOldStream; //设置语音相关参数
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo;
//SPSTREAMFORMAT eFmt = 21;
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo; //SPSF_22kHz 8Bit Stereo
//CSpStreamFormat Fmt;
//Fmt.AssignFormat(eFmt); HRESULT hr = pVoice->GetOutputStream( &cpOldStream );
if (hr == S_OK)
{
hr = OriginalFmt.AssignFormat(cpOldStream);
}
else
{
hr = E_FAIL;
} if (SUCCEEDED(hr))
{
hr = SPBindToFile( m_szWFileName, SPFM_CREATE_ALWAYS, &cpWavStream,
&OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() );
}
if( SUCCEEDED( hr ) )
{
pVoice->SetOutput(cpWavStream, TRUE);
} //pVoice->Speak(m_Text.AllocSysString(), SPF_ASYNC | SPF_IS_NOT_XML, 0 );
pVoice->Speak(m_szContent, SPF_ASYNC | SPF_IS_NOT_XML, 0 );
pVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();
pVoice->SetOutput(cpOldStream, FALSE );
}
::CoUninitialize();
}
#include <sphelper.h>//可以多次朗读文本
void CSapitestDlg::OnSpeak()
{
UpdateData();
ISpVoice * pVoice = NULL; if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(m_Text.AllocSysString(), 0, NULL);
pVoice->Release();
pVoice = NULL;
} CoUninitialize();
}//文本转换成语音,只能转换一条
//同时转换多条记录有问题 !!!!!!
void CSapitestDlg::OnRecord()
{
ISpVoice * pVoice = NULL;
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
TCHAR szFileName[256];
TCHAR szContent[256];
strcpy(szFileName,"D:\\ttsTest.wav");
strcpy(szContent,"hello 你好 "); USES_CONVERSION;
WCHAR m_szWFileName[256];
WCHAR m_szContent[256];
wcscpy(m_szWFileName, T2W(szFileName) );
wcscpy(m_szContent, T2W(szContent) );
CSpStreamFormat OriginalFmt;
CComPtr<ISpStream> cpWavStream;
CComPtr<ISpStreamFormat> cpOldStream; //设置语音相关参数
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo;
//SPSTREAMFORMAT eFmt = 21;
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo; //SPSF_22kHz 8Bit Stereo
//CSpStreamFormat Fmt;
//Fmt.AssignFormat(eFmt); HRESULT hr = pVoice->GetOutputStream( &cpOldStream );
if (hr == S_OK)
{
hr = OriginalFmt.AssignFormat(cpOldStream);
}
else
{
hr = E_FAIL;
} if (SUCCEEDED(hr))
{
hr = SPBindToFile( m_szWFileName, SPFM_CREATE_ALWAYS, &cpWavStream,
&OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() );
}
if( SUCCEEDED( hr ) )
{
pVoice->SetOutput(cpWavStream, TRUE);
} //pVoice->Speak(m_Text.AllocSysString(), SPF_ASYNC | SPF_IS_NOT_XML, 0 );
pVoice->Speak(m_szContent, SPF_ASYNC | SPF_IS_NOT_XML, 0 );
pVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();
pVoice->SetOutput(cpOldStream, FALSE );
}
::CoUninitialize();
}
再次进行转换则不成功,
只能转换一条记录.
//用到的语言包是:Microsoft Speech SDK 5.1;
//使用sapi如何设置音频的频率等参数?
#include <sapi.h> //朗读文本
#include <sphelper.h> //文本转换成wav文件//朗读文本
void CSapitestDlg::OnSpeak()
{
UpdateData();
ISpVoice * pVoice = NULL;
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(m_Text.AllocSysString(), 0, NULL);
pVoice->Release();
pVoice = NULL;
}
CoUninitialize();
}//文本转换成wav文件
//默认保存在D盘,文件名是系统当前时间
void CSapitestDlg::OnRecord()
{
UpdateData();
ISpVoice * pVoice = NULL;
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("Error to intiliaze COM");
return;
}
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
//拼接文件路径
SYSTEMTIME t;
GetLocalTime(&t);
CString strTmp;
strTmp.Format("%d%d%d%d%d%d%d",t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond,t.wMilliseconds);
strTmp.Insert(0,"D:\\");
strTmp.Insert(strTmp.GetLength(),".wav");
//LPTSTR tmpFilePath = (LPTSTR)LPCTSTR(strTmp);
//wav文件路径
TCHAR szFileName[256];
strcpy(szFileName,strTmp);
USES_CONVERSION;
WCHAR m_szWFileName[256];
wcscpy(m_szWFileName, T2W(szFileName) );
CSpStreamFormat OriginalFmt;
CComPtr<ISpStream> cpWavStream;
CComPtr<ISpStreamFormat> cpOldStream;
//设置音频的频率 BEGIN
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo;
//SPSTREAMFORMAT eFmt = 21;
//SPSTREAMFORMAT eFmt = OriginalFmt.ComputeFormatEnum().SPSF_22kHz8BitStereo; //SPSF_22kHz 8Bit Stereo
//CSpStreamFormat Fmt;
//Fmt.AssignFormat(eFmt);
//设置音频的频率 END HRESULT hr = pVoice->GetOutputStream( &cpOldStream );
if (hr == S_OK)
{
hr = OriginalFmt.AssignFormat(cpOldStream);
}
else
{
hr = E_FAIL;
}
if (SUCCEEDED(hr))
{
hr = SPBindToFile(m_szWFileName, SPFM_CREATE_ALWAYS, &cpWavStream,
&OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() );
}
if( SUCCEEDED( hr ) )
{
pVoice->SetOutput(cpWavStream, TRUE);
}
pVoice->Speak(m_Text.AllocSysString(), SPF_ASYNC | SPF_IS_NOT_XML, 0 );
pVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();
pVoice->Release();
pVoice = NULL;
//pVoice->SetOutput(cpOldStream, FALSE );
}
::CoUninitialize();
}