windows下sapi做TTS轉化(修復)總結

TTS轉換有很多第三方庫,比如科大訊飛的sdk就很好用,但是對於一些簡單的需求,用windows(win7)的sapi就可以了。

sapi運用是很簡單,但是在很多電腦上就上放不出聲音,原因是這些電腦系統不是官網下載的,TTS功能被閹割了,本文記錄的主要就是修復這個問題。


由於不同電腦缺少的語音組件不同,所以試了一堆修復包,也不知道這些修復包誰有用,總之不行全執行一遍就行。


爲了以後下載方便,把他們存在了百度雲盤中,地址:https://pan.baidu.com/s/1hrOcaVi

自帶一個示例程序tts_helloworld.




#include "stdafx.h"
#include "../Include/sapi.h"
#include "../Include/sphelper.h"
#define _CRT_SECURE_NO_WARNINGS


#pragma comment(lib,"../Lib/sapi.lib")


int Speak(const char *Text)
{
ISpVoice *pVoice = NULL;
WCHAR  Wchar[1024];

MultiByteToWideChar(CP_ACP, 0, Text,strlen(Text) + 1, Wchar, 1024 / sizeof(Wchar[0]));

//初始化COM接口
if (FAILED(::CoInitialize(NULL)))
return -1;


//獲取SpVoice接口
HRESULT hr = CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_ALL,IID_ISpVoice,(void**)&pVoice);


if (SUCCEEDED(hr))
{
ISpObjectToken *p = NULL;
hr = SpFindBestToken(SPCAT_VOICES,L"language=804", L"Name=VM Lily", &p);
if (SUCCEEDED(hr))//說話人控制 
{
pVoice->SetVoice(p);
}
pVoice->SetRate(-2);
pVoice->SetVolume(100);


hr = pVoice->Speak(Wchar,0,NULL);
pVoice->Release();
pVoice = NULL;
}


//釋放com資源
::CoUninitialize();


return 0;
}
int SaveVoice(const char *Text,const char* FileName)
{
CComPtr<ISpVoice> m_cpVoice;
WCHAR  Wchar[1024];
MultiByteToWideChar(CP_ACP, 0, Text,strlen(Text) + 1, Wchar, 1024 / sizeof(Wchar[0]));


//初始化COM接口
if (FAILED(::CoInitialize(NULL)))
return -1;


HRESULT hr = m_cpVoice.CoCreateInstance(CLSID_SpVoice);


if (SUCCEEDED(hr))
{
USES_CONVERSION;
CComPtr<ISpStream> cpWavStream;
CComPtr<ISpStreamFormat>    cpOldStream;
CSpStreamFormat OriginalFmt;


hr = m_cpVoice->GetOutputStream( &cpOldStream );
if (hr == S_OK)
{
hr = OriginalFmt.AssignFormat(cpOldStream);
}
else
{
hr = E_FAIL;
}


if (SUCCEEDED(hr))
{
hr = SPBindToFile( FileName, SPFM_CREATE_ALWAYS, &cpWavStream, &OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() ); 
}
if( SUCCEEDED( hr ) )
{
hr = m_cpVoice->SetOutput(cpWavStream, TRUE);
}


if ( SUCCEEDED( hr ) )
{
ISpObjectToken *p = NULL;


hr = SpFindBestToken(SPCAT_VOICES,L"language=804", L"Name=Microsoft lili", &p);
if (SUCCEEDED(hr))//說話人控制 
{
m_cpVoice->SetVoice(p);
}
m_cpVoice->SetRate(-2);
m_cpVoice->SetVolume(100);
hr =m_cpVoice->Speak(Wchar, SPF_ASYNC|SPF_IS_NOT_XML, 0 );
}


m_cpVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();


m_cpVoice->SetOutput( cpOldStream, FALSE );
m_cpVoice.Release();
m_cpVoice = NULL;


}
::CoUninitialize();
return 0;
}


int _tmain(int argc, _TCHAR* argv[])
{
char *Text = "hello world! 你好啊,我是Heworld。";
Speak(Text);
SaveVoice(Text,"hello.wav");
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章