как сделать функцию как IsWordPronounceable (SomeWord: String): логический; - PullRequest
3 голосов
/ 27 мая 2010

Я хотел бы сделать функцию IsWordPronounceable (SomeWord: String): boolean; "английский язык" Я работаю с распознаванием речи SAPI, и мне нужна эта функция. Я использую компилятор Delphi, C / C # / C ++ или любой другой язык в порядке .. пожалуйста, помогите. я не знаю с чего начать ...

с самого начала я думал, что добавление правила грамматики может решить проблему. сценарий - выделение текста, который говорится пользователю. но двигатель не может распознать слова, которые нельзя произнести.

Ответы [ 4 ]

4 голосов
/ 27 мая 2010

Это не совсем легко сделать. Я бы сделал это с помощью простого статистического анализа.

Начните с загрузки словаря английских слов (или любого другого языка, на самом деле - вам просто нужен словарь слов, которые можно произносить). Затем возьмите каждое слово в словаре и разбейте его на 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, и т. Д. Я думаю, потребуется немного помазать, чтобы все сделать правильно, я думаю.

1 голос
/ 27 мая 2010

Просто идея (может быть, сумасшедшая): я никогда не пробовал это.
Можете ли вы подать вывод текста в речь на вход речи в текст?
Тогда в идеальном мире все, что не распознается (или не совпадает), в конце концов, не произносится.

0 голосов
/ 27 мая 2010

Эта функциональность обычно обрабатывается самим речевым движком. Если ваша цель состоит в том, чтобы заставить движок преобразования текста в речь произносить одни слова и произносить по буквам другие, речевые движки, отличные от заданных по умолчанию, могут выполнять достаточную работу. Проверьте Акапела , например.

Чтобы написать эту функцию самостоятельно, я бы сначала нажал на низко висящий фрукт.

  • проверить вход для цифры / непроизносимые символы, не удалось, если найдено
  • проверить ввод по словарь слов, пройди если найден

Более продвинутый метод, аналогичный решению Codeka, заключался бы в создании списка допустимых шаблонов слогов и сопоставлении их с ними. Могут быть и более сложные приемы, но чтобы пройти туда, вам необходимо ознакомиться с языкознанием .

0 голосов
/ 27 мая 2010

Это означает, что вы не можете использовать только текст в речь, но вам также нужно проверить, что приведенные слова соответствуют языку или нет. Также вам нужно использовать механизм обучения для преобразования текста в речь. Чтобы эти данные можно было использовать для вашей функции.

Если вы хотите проверить только правильность слова (я имею в виду не речь, а только проверить правильность слова), то ответ, заданный codeka , довольно крутой Вы можете проверить это из словаря определенного языка.

спасибо.

...