1. 程式人生 > >Windows Speech SDK5.1的安裝和使用(xp/win7)

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";
}