[英]how to change Text to Speech voice and how to insert characters into char array
我需要更改“ 文字轉語音”引擎的聲音。 當選擇菜單( ID_SPEAK_PLAY
)時,我得到一個編輯框的文本並簡單地閱讀它。
我的情況可以通過兩種方式解決:
strncat
或涉及創建其他wchar_t*
緩沖區的其他函數(內存問題)的情況下,將XML代碼插入ptrData
。 StringCchPrintf
無法正常工作。 這是我的代碼:
case ID_SPEAK_PLAY:
text_size = SendMessage(h_edit, WM_GETTEXTLENGTH, 0, 0);
text_size += 100;
ptrData = new wchar_t[text_size];
SendMessage(h_edit, WM_GETTEXT, text_size, (LPARAM)ptrData);
StringCchPrintf(ptrData, text_size, L"<voice required = \"Gender=Female;Age=Teen\"> %s", ptrData);
pVoice->Speak(ptrData, SPF_ASYNC | SPF_IS_XML, NULL);
delete [] ptrData;
break;
StringCchPrintf無法正常工作。
這是因為您忽略了文檔中的警告:
如果pszDest,pszFormat或任何參數字符串指向的字符串重疊,則行為是不確定的。
您同時將ptrData
指定為pszDest
和參數字符串,因此您的代碼具有未定義的行為 。 使用StringCchPrintf()
時必須使用單獨的緩沖區:
case ID_SPEAK_PLAY:
text_size = SendMessage(h_edit, WM_GETTEXTLENGTHW, 0, 0) + 1;
ptrData = new wchar_t[text_size];
SendMessage(h_edit, WM_GETTEXTW, text_size, (LPARAM)ptrData);
speak_size = text_size + 100;
speakData = new wchar_t[speak_size];
StringCchPrintf(speakData, speak_size, L"<voice required = \"Gender=Female;Age=Teen\"> %s", ptrData);
pVoice->Speak(speakData, SPF_ASYNC | SPF_IS_XML, NULL);
delete [] speakData;
delete [] ptrData;
break;
另外,只需跳過StringCchPrintf()
並讓WM_GETTEXT
直接填充單個緩沖區:
case ID_SPEAK_PLAY:
{
const wchar_t *xml = L"<voice required = \"Gender=Female;Age=Teen\"> ";
const int xml_size = lstrlenW(xml);
text_size = SendMessage(h_edit, WM_GETTEXTLENGTHW, 0, 0);
ptrData = new wchar_t[text_size + xml_size + 1];
lstrcpyW(ptrData, xml);
SendMessage(h_edit, WM_GETTEXTW, text_size+1, (LPARAM)(ptrData+xml_size));
pVoice->Speak(ptrData, SPF_ASYNC | SPF_IS_XML, NULL);
delete [] ptrData;
break;
}
以我不知道的其他方式改變聲音。
可以在調用ISpVoice::Speak()
之前調用ISpVoice::Speak()
ISpVoice::SetVoice()
方法,而不是在文本前面插入XML。 使用SpEnumTokens()
可以知道安裝了哪些聲音,或者使用SpFindBestToken()
可以搜索符合您所需條件的聲音。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.