係統粉 > IT資訊 > 業界資訊

MFC讓你的應用發聲(TTS)

發布時間:2017-08-16    瀏覽數:

WIN7之後,Windows係統自帶微軟語音庫,使用語音庫變得非常的簡單,精簡版就不一定了

MFC讓你的應用發聲(TTS)(1)

MFC讓你的應用發聲(TTS)(2)MFC讓你的應用發聲(TTS)(3)

對於win7及以上版本直接包含頭文件和鏈接庫

#include "sapi.h" #include "sphelper.h" #pragma comment(lib, "sapi.lib")

//定義三個變量
ISpVoice *m_pISpVoice = NULL;//初始化COM
IEnumSpObjectTokens *m_pIEnumSpObjectTokens=NULL;
ISpObjectToken *m_pISpObjectToken=NULL;


/*
* 函數功能 : 初始化語言包選擇組合框控件
*/
void CVoiceTDlg::InitVoicePackageSelComboxCtrl(void)
{
//初始化COM組件
if(FAILED(::CoInitialize(NULL)))
{
MessageBox("初始化COM組件失敗!", "提示", MB_OK|MB_ICONWARNING);
return;
}









//枚舉所有語音Token
if(SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &m_pIEnumSpObjectTokens)))
{

//得到所有語音Token的個數
ULONG ulTokensNumber = 0;
m_pIEnumSpObjectTokens->GetCount(&ulTokensNumber);

//檢測該機器是否安裝有語音包
if(ulTokensNumber == 0)
{
MessageBox("該機器沒有安裝語音包!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//將語音包的名字加入組合框控件
CString strVoicePackageName = _T("");
CString strTokenPrefixText = _T("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\");
for(ULONG i=0; i<ulTokensNumber; i++)
{
m_pIEnumSpObjectTokens->Item(i, &m_pISpObjectToken);
WCHAR* pChar;
m_pISpObjectToken->GetId(&pChar);
strVoicePackageName = pChar;
strVoicePackageName.Delete(0, strTokenPrefixText.GetLength());
m_ComboxVoiceSel.InsertString(i, strVoicePackageName);
}










//設置默認的語音包選擇
m_ComboxVoiceSel.SetCurSel(0);
}
}


void CVoiceTDlg::OnBnClickedButton2()
{

InitVoicePackageSelComboxCtrl();
UpdateData(true);

//獲取ISpVoice接口
if(FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pISpVoice)))
{
MessageBox("獲取ISpVoice接口失敗!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//設置語言
m_pIEnumSpObjectTokens->Item(m_ComboxVoiceSel.GetCurSel(), &m_pISpObjectToken);
m_pISpVoice->SetVoice(m_pISpObjectToken);

//設置播放速度
m_pISpVoice->SetRate(/*m_SliderVoiceSpeed.GetPos()*/ 5);

//設置音量大小
m_pISpVoice->SetVolume(100 /*- m_SliderVoiceSize.GetPos()*/);

//檢測朗讀內容是否為空
if(m_EditContent.IsEmpty())
{
MessageBox("朗讀內容不能為空!", "提示", MB_OK|MB_ICONWARNING);
return;
}




//開始進行朗讀
m_pISpVoice->Speak(m_EditContent.AllocSysString(), SPF_ASYNC, NULL);
}

/*
* 函數功能 : 播放語音
*/

void CVoiceTDlg::OnBnClickedButton3()
{
//生成WAV文件
CComPtr<ISpStream> cpISpStream;
CComPtr<ISpStreamFormat> cpISpStreamFormat;
CSpStreamFormat spStreamFormat;
m_pISpVoice->GetOutputStream(&cpISpStreamFormat);
spStreamFormat.AssignFormat(cpISpStreamFormat);
HRESULT hResult = SPBindToFile("C:\Users\Administrator\Desktop\Test\test.wav",
SPFM_CREATE_ALWAYS,
&cpISpStream,
&spStreamFormat.FormatId(),
spStreamFormat.WaveFormatExPtr());
if(SUCCEEDED(hResult))
{
m_pISpVoice->SetOutput(cpISpStream, TRUE);
m_pISpVoice->Speak(m_EditContent.AllocSysString(), SPF_DEFAULT, NULL);
MessageBox("生成WAV文件成功!", "提示", MB_OK);
}
else
{
MessageBox("生成WAV文件失敗!", "提示", MB_OK|MB_ICONWARNING);
}
}






















/*
* 函數功能 : 暫停/繼續播放語音
*/

int i=0;

void CVoiceTDlg::OnBnClickedButton4()//暫停和繼續
{
if (i==0)
{
m_pISpVoice->Pause();
i=1;
}
else
{
m_pISpVoice->Resume();
i=0;
}










}

MFC讓你的應用發聲(TTS)(4)

/*
ISpVoice//成員函數
ISpEventSource繼承方法 :ISpEventSource的所有方法都可以從該接口訪問
SetOutput :設置當前的輸出對象。可以使用NULL值來選擇默認音頻設備。
GetOutputObjectToken :檢索當前音頻輸出對象的對象標記。
GetOutputStream :檢索當前輸出流的指針。
Pause :將聲音暫停在最近的警報邊界並關閉輸出設備。
Resume : 將輸出設備設置為RUN狀態並恢複渲染。
SetVoice :設置用於文本合成的聲音的身份。默認情況下,ISPVoice將使用“控製麵板”中“語音”屬性中設置的語音信息。
GetVoice :檢索標識文本合成中使用的聲音的對象標記。
Speak :說出文本字符串或文件的內容。
SpeakStream :說出流的內容。
GetStatus :檢索與此ISpVoice實例關聯的當前呈現和事件狀態。
Skip :導致語音向前或向後跳過當前通話文本內的指定數量的項目。
SetPriority :設置語音的優先級。正常,警報,結束。
GetPriority :檢索當前語音優先級。
SetAlertBoundary :指定哪個事件應該用作警報的插入點。
GetAlertBoundary :檢索當前正用作警報插入點的事件。
SetRate :實時設置文本渲染速率調整。
GetRate :檢索當前文本渲染速率調整。
SetVolume :實時設定合成器的輸出音量。
GetVolume :檢索合成器的當前輸出音量。
WaitUntilDone :阻止呼叫者,直到語音完成說話或指定的時間間隔過去了。
SetSyncSpeakTimeout :設置以毫秒為單位的超時時間間隔,此語音同步Speak和SpeakStream調用此超時。
GetSyncSpeakTimeout :檢索此ISpVoice實例的同步語音操作的超時間隔。
SpeakCompleteEvent :返回一個事件句柄,當語音完成後,將發出所有待處理的請求信號。
IsUISupported :確定是否支持指定類型的UI。
DisplayUI :顯示所請求的UI。
*/





























MFC讓你的應用發聲(TTS)(5)

MFC讓你的應用發聲(TTS)(6)熱文文,分享你的熱文

轉發文章就能賺錢的app

點擊閱讀原文下載

上一篇:Alphacool放出史上最大水冷散熱器:420mm怪物 下一篇:諾基亞新一代功能機死灰複燃,價格勁爆,續航強勁,國產品牌慌嗎

相關資訊

最新熱門應用

電腦問答