2010-05-27 16 views
3

我想做一個函數IsWordPronounceable(SomeWord:String):boolean; 「英語」 我正在使用SAPI語音識別,我需要這個功能。我使用delphi編譯器,C/C#/ C++或任何語言都可以。請幫助。我不知道如何開始...如何使函數像IsWordPronounceable(SomeWord:String):boolean;

從一開始,我認爲添加語法規則可以解決問題。該場景突出顯示正在對用戶說的文本。但引擎無法識別不可聞的單詞。

+0

我會從語言學規則開始,iaw:「什麼時候是一個字母序列,用特定的語言說出來?」。如果你幸運的話,你可以用代碼翻譯這些規則。 – 2010-05-27 06:44:12

+0

@Andreas_D我使用英語。 – XBasic3000 2010-05-27 06:50:45

+0

SAPI提供的實現有什麼問題? – 2010-06-01 18:50:55

回答

4

這並不容易。我會這樣做的方式是通過一些簡單的統計分析。

首先下載英文單詞詞典(或任何語言,真的 - 你只需要一個可以「發音」的單詞字典)。然後,把字典中的每個單詞分解成3個字母的塊。所以給「詞典」這個詞,你會把它分解成「dic」,「ict」,「cti」,「tio」,「ion」,「ona」,「nar」和「ary」。然後將字典中所有單詞的每個三個字母塊添加到一個集合中,該集合將三個字母塊映射到它出現的次數。事情是這樣的:

「DIC」 - > 36365
「ICT」 - > 2721
「CTI」 - > 532

等等......接下來,通過規範化的數字將每個數字除以字典中的單詞總數。這樣,您可以將三個字母的組合映射到字典中包含該三個字母組合的百分比。

最後,實現您的IsWordPronounceable方法是這樣的:

bool IsWordPronounceable(string word) 
{ 
    string[] threeLetterBlocks = BreakIntoThreeLetterBlocks(word); 
    foreach(string block in threeLetterBlocks) 
    { 
     if (blockFrequency[block] < THRESHOLD) 
      return false; 
    } 
    return true; 
} 

顯然,還有你要「調整」的幾個參數。 THRESHOLD參數是一個參數,塊的大小也許會更好,爲2或3或4等。我想,這需要一點點的按摩才能讓它正確。

+0

一個字:「syzygy」。我敢打賭,你的算法必須非常低才能將其標記爲可發音。 – DJClayworth 2010-05-27 13:29:12

+0

thanx的想法。我嘗試了它,但它的工作原理是,它是一個巨大的庫。我尋找另一種選擇.... – XBasic3000 2010-06-01 03:45:04

-2

這意味着你不能只使用文本到語音轉換,但你還需要檢查給出的單詞是否符合每種語言。此外,您還需要使用培訓引擎來處理文本到語音數據。這樣該數據將可用於您的功能。

如果你只是要檢查的話(我的意思是沒有言語,只檢查單詞的有效性)的正確性,比codeka給出的答案是相當冷靜。您可以從特定語言的字典中查看它。

謝謝。

0

此功能通常由語音引擎自己處理。如果您的目標僅僅是讓文本到語音引擎發出一些事情並拼寫其他語言,除默認設置之外的語音引擎可以做足夠的工作。例如,請查看Acapela

要自己寫這個功能,我先打低掛果。

  • 支票 數字/不能發音字符的輸入,若發現
  • 檢查 無法針對 詞的詞典中的輸入,通過如果發現

一個更高級的類似codeka的溶液技術將建立一個有效的音節模式列表,然後匹配您的輸入與他們。可能有更復雜的技術,但要去那裏你需要熟悉linguistics

+0

我沒有文字到語音的問題,它說的一切。但是在語音到文本上它不能識別像PLDT,XB3K,Max2D等字。即使它標有 Max2D XBasic3000 2010-05-27 07:55:23

1

只是一個想法(也許瘋狂):我從來沒有嘗試過。
您可以將文本到語音的輸出輸入到語音到文本的輸入嗎?
然後在一個完美的世界裏,任何不被識別(或不匹配)的東西都是不可發音的。

+0

你有一點。但是如果你有關於如何從語音輸入中獲取音素的想法。請發佈。我可能需要它... thanx – XBasic3000 2010-06-01 03:47:50

相關問題