как сделать функцию типа IsWordPronounceable(SomeWord:String): boolean;

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

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


person XBasic3000    schedule 27.05.2010    source источник
comment
Я бы начал с лингвистических правил, ага: когда последовательность букв произносима [в конкретном языке]?. Если вам повезет, вы можете перевести эти правила в код.   -  person Andreas Dolk    schedule 27.05.2010
comment
@Andreas_D я использую английский язык.   -  person XBasic3000    schedule 27.05.2010
comment
Что не так с реализацией, которую обеспечивает SAPI?   -  person Eric Brown    schedule 01.06.2010


Ответы (4)


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

Начните с загрузки словаря английских слов (или любого другого языка, вам просто нужен словарь слов, которые «произносимы»). Затем возьмите каждое слово из словаря и разбейте его на блоки по 3 буквы. Таким образом, слово «словарь» можно разделить на «дик», «икт», «кти», «тио», «ион», «она», «нар» и «ари». Затем добавьте каждый трехбуквенный блок из всех слов в словаре в коллекцию, которая сопоставляет трехбуквенный блок с тем, сколько раз он появляется. Что-то вроде этого:

"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 и т. д. Я думаю, потребуется немного помассировать, чтобы сделать это правильно.

person Dean Harding    schedule 27.05.2010
comment
Одно слово: сизигия. Бьюсь об заклад, ваш порог должен быть очень низким, чтобы ваш алгоритм пометил это как произносимое. - person DJClayworth; 27.05.2010
comment
спасибо за идею. я попробовал, и это работает, но дело в том, что это огромная библиотека. ищу другие варианты.... - person XBasic3000; 01.06.2010

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

person Francesca    schedule 27.05.2010
comment
у вас есть точка. но если у вас есть представление о том, как получить фонемы из голосового ввода. Пожалуйста, опубликуйте это. мне это может понадобиться ... спасибо - person XBasic3000; 01.06.2010

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

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

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

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

person Rob Elliott    schedule 27.05.2010
comment
у меня нет проблем с преобразованием текста в речь, он говорит все. но при преобразовании речи в текст он не может распознавать такие слова, как PLDT, XB3K, Max2D и т. д., даже если они помечены как ‹O›Max2D‹/O› - person XBasic3000; 27.05.2010

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

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

Благодарю.

person Parth    schedule 27.05.2010