文字轉(zhuǎn)語(yǔ)音,導(dǎo)出音頻mp3
用到的是Windows的SAPI,所以只支持Windows。
我測(cè)試了一百多個(gè)字符轉(zhuǎn)音頻導(dǎo)出,速度還挺快的,1秒不到就轉(zhuǎn)好了。
#include <sapi.h> #include "sphelper.h" #include "atlbase.h" #pragma comment(lib,"ole32.lib") #pragma comment(lib,"sapi.lib") // 正式代碼 // 初始化 HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { qDebug() << "init fail"; return; } // 創(chuàng)建 ISpVoice ISpVoice *pVoice; hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); if (FAILED(hr)) { qDebug() << "create fail"; CoUninitialize(); return; } CComPtr<ISpStream> cpWavStream; CComPtr<ISpStreamFormat> cpOldStream; CSpStreamFormat OriginalFmt; pVoice->GetOutputStream( &cpOldStream ); OriginalFmt.AssignFormat(cpOldStream); hr = SPBindToFile( L"D:\\output.mp3",SPFM_CREATE_ALWAYS, &cpWavStream,&OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() ); if( SUCCEEDED( hr ) ) { pVoice->SetOutput(cpWavStream,TRUE); QString s = ui.textEdit->toPlainText(); pVoice->Speak(s.toStdWString().c_str(), SPF_IS_XML, NULL); pVoice->Release(); pVoice = NULL; } CoUninitialize();
測(cè)試了很多電腦,都是正常可用的,公司里面只有一臺(tái)電腦出現(xiàn)了崩潰。
這臺(tái)電腦沒(méi)有激活,沒(méi)有聲音播放器。定位到的代碼是 cpOldStream 為空,然后 AssignFormat 就崩潰了。
后面我在這臺(tái)電腦上插了個(gè)耳機(jī),然后就可以正常使用了。(插上耳機(jī)后,電腦會(huì)自動(dòng)安裝一個(gè)聲音播放器的驅(qū)動(dòng))
現(xiàn)在不確定是因?yàn)殡娔X沒(méi)激活導(dǎo)致的,還是因?yàn)闆](méi)聲音播放器,沒(méi)驅(qū)動(dòng)導(dǎo)致的。


浙公網(wǎng)安備 33010602011771號(hào)