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

解决方案 »

  1.   

    把生成的"ttsTest.wav"文件删除掉,
    再次进行转换则不成功,
    只能转换一条记录.
      

  2.   

    //下面的代码可以实现朗读文本,并转换成wav文件;
    //用到的语言包是: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();
    }