《MFC讓你的應用發聲(TTS)》要點:
本文介紹了MFC讓你的應用發聲(TTS),希望對您有用。如果有疑問,可以聯系我們。
WIN7之后,Windows系統自帶微軟語音庫,使用語音庫變得非常的簡單,精簡版就不必定了
對于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;
}
}
/*
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.
*/
熱文文,分享你的熱文
轉發文章就能賺錢的app
點擊瀏覽原文下載
維易PHP學堂逐步分享更多《MFC讓你的應用發聲(TTS)》相關教程。歡迎交流
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9142.html