Windows Speech SDK5.1的安裝和使用(xp/win7)
由於工作需要,需要文字轉語音功能的支援。由於各種原因限制,所以選擇了使用Windows平臺自帶的語音引擎。
首先使用場景是區域網,無法訪問網際網路。所以通過網路介面提供的服務就被排除了,比如百度的tts服務。
由於應用範圍也很有限,規模小,所以付費的語音引擎也不考慮了。比如科大訊飛的語音引擎。
再者個人經驗\閱歷有限,目前不知道其他開源的語音引擎,所以,只能選擇平臺自帶的語音引擎(非windows正版使用者功能有閹割),還好,找到了修復工具,解決了這個問題,修復工具見上一篇文章,附帶好多語音庫可以下載使用,還提供了demo工具可以測試。
下面說一下使用流程。
-
安裝SpeechSDK5.1
-
下載修復工具和測試工具
這是個測試工具,可以用來測試服務是否可用,以及語音庫是佛安裝成功。http://www.cppfans.com/cbknowledge/skills/media/ttsdemo.asp --------------------- 本文來自 moyebaobei1 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/moyebaobei1/article/details/82789362?utm_source=copy
語音庫可以看到我安裝了哪些語音,語音庫都是符合一定標準的就可以識別。然後輸入朗讀內容,單擊【朗讀】就可以按照這種語音庫的規律朗讀文字。如果朗讀成功,則說明語音庫安裝成功了。
Windows平臺,是基於COM和DCOM組織起來的,所以實現上就是需要創建出對應的元件,然後呼叫介面上的方法。哦通過SDK呼叫TTS服務,需要設定預設的語音庫。
-
設定系統語音服務(預設語音庫)
控制面板 - 語音(32位)- 文字轉語音
-
封裝呼叫
然後對SDK呼叫做一下簡單的封裝。
#pragma once #include<iostream> #include <sapi.h> //匯入語音標頭檔案 #include <string> #pragma comment(lib,"sapi.lib") //匯入語音標頭檔案庫 using namespace std; void MSSSpeak(LPCTSTR speakContent)// speakContent為LPCTSTR型的字串,呼叫此函式即可將文字轉為語音 { ISpVoice *pVoice = NULL; //初始化COM介面 if (FAILED(::CoInitialize(NULL))) MessageBox(NULL, (LPCWSTR)L"COM介面初始化失敗!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2); //獲取SpVoice介面 HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice); if (SUCCEEDED(hr)) { pVoice->SetVolume((USHORT)100); //設定音量,範圍是 0 -100 pVoice->SetRate(0); //設定速度,範圍是 -10 - 10 hr = pVoice->Speak(speakContent, 0, NULL); pVoice->Release(); pVoice = NULL; } //釋放com資源 ::CoUninitialize(); } //string轉換車wstring std::wstring StringToWString(const std::string& s) { std::wstring wszStr; int nLength = MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, NULL, NULL); wszStr.resize(nLength); LPWSTR lpwszStr = new wchar_t[nLength]; MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, lpwszStr, nLength); wszStr = lpwszStr; delete[] lpwszStr; return wszStr; } void read(string temp){ wstring a = StringToWString(temp); LPCWSTR str = a.c_str(); /*不知道為什麼Cstr不行*/ MSSSpeak(str); cout << "朗讀結束\n"; }