簡體   English   中英

如何將文本轉換為語音以及如何將字符插入char數組

[英]how to change Text to Speech voice and how to insert characters into char array

我需要更改“ 文字轉語音”引擎的聲音。 當選擇菜單( ID_SPEAK_PLAY )時,我得到一個編輯框的文本並簡單地閱讀它。

我的情況可以通過兩種方式解決:

  1. 在不使用strncat或涉及創建其他wchar_t*緩沖區的其他函數(內存問題)的情況下,將XML代碼插入ptrData StringCchPrintf無法正常工作。
  2. 以我不知道的其他方式改變聲音。

這是我的代碼:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM