Как определить, насколько сходна речевая запись с другой речевой записью?

Я хотел бы создать программу для определения того, насколько закрыта аудиозапись пользователя для другой записи, чтобы исправить произношение пользователя. Например:

  • Я записываю себя, говоря "Доброе утро".
  • Я даю запись иностранному студенту "Доброе утро".
  • Сравните его запись с моим, чтобы узнать, достаточно ли его произношение.

Я видел это в некоторых инструментах изучения языка (я считаю, что Розетта Стоун делает это), но как это делается? Обратите внимание, что мы имеем дело только с речью (а не, скажем, с музыкой). Какие алгоритмы или библиотеки я должен изучить?

Ответы

Ответ 1

Многие люди, кажется, предлагают какое-то расстояние редактирования, что ИМО является совершенно неправильным подходом для определения сходства двух речевых моделей, особенно для шаблонов, столь же коротких, как подразумевается в OP. Конкретные алгоритмы, используемые распознаванием речи на самом деле, почти противоположны тому, что вы хотели бы использовать здесь. Проблема распознавания речи заключается в разрешении многих подобных произношений тому же представлению. Проблема здесь состоит в том, чтобы взять несколько немного отличающихся произношений и получить какое-то значимое расстояние между ними.

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

Во-первых: Предполагая, что у вас есть некоторый фрагмент аудио без какой-либо фильтрации. Так же, как это было бы получено от микрофона. Первым шагом является устранение фонового шума. Для этого существует несколько разных методов, но я собираюсь предположить, что то, что вы хотите, - это то, что будет хорошо работать, без невероятно сложного в реализации.

  • Отфильтруйте аудио, используя модуль scipy filtering здесь. Есть много частот, которые собирают микрофоны, которые просто не полезны для категоризации речи. Я бы предложил либо Bessel, либо фильтр Butterworth, чтобы гарантировать, что ваша волна будет продолжаться с помощью фильтрации. Основные частоты для повседневной речи обычно составляют от 800 до 2000 Гц (ссылка), поэтому разумное отсечение будет примерно таким же, как 300-4000 Гц, убедитесь, что вы ничего не потеряли.
  • Ищите наименее активную часть речи и предположите, что это разумное представление фонового шума. На этом этапе вам захочется запустить серию преобразований Фурье вдоль ваших данных (или создать спектрограмму) и найти часть вашей речевой записи, которая имеет самый низкий среднечастотный отклик. После того, как у вас есть этот снимок, вы должны вычесть его из всех других точек в вашем примере аудио.
  • На этом этапе должен быть аудиофайл, который в основном является только вашей речью пользователя, и должен быть готов к сравнению с другим файлом, который прошел этот процесс. Теперь мы хотим фактически закрепить звук и сравнить этот клип с некоторым основным клипом.

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

  • Создайте спектрограмму рассматриваемого звукового файла (example). Результатом этого является в конечном итоге изображение, которое может быть представлено как 2-мерный массив значений частотной характеристики. Спектрограмма по существу является преобразованием Фурье с течением времени, когда цвет соответствует интенсивности.

  • Используйте OpenCV (имеет привязки python, пример), чтобы запустить обнаружение blob на вашей спектрограмме. Эффективно это будет искать большой красочный blob в середине вашей спектрограммы и дать вам некоторые ограничения на это. Эффективно, что это должно сделать, возвращается значительно более редкая версия исходного 2d-массива, который только представляет речь. (Предполагая, что ваш аудиофайл будет иметь некоторые трейлинг файлы на переднем и заднем концах записи)

  • Нормализовать два капли для учета различий в скорости речи. Все говорят на разных скоростях, и поэтому ваши капли, вероятно, будут иметь разные размеры вдоль оси x (время). Это, в конечном счете, приведет к повышению уровня проверки вашего алгоритма, который вам не нужен для скорости речи. Этот шаг не нужен, если вы также хотите, чтобы они говорили на той же скорости, что и главная копия, но я бы предложил. В принципе, вы хотите растянуть более короткую версию, умножив ее на временную ось на некоторую константу, равную только отношению длин двух ваших блоков.

  • Вы также должны нормализовать две капли на основе максимальной и минимальной интенсивности для учета людей, говорящих на разных томах. Опять же, это зависит от вашего усмотрения, но чтобы исправить это, вы должны найти аналогичные коэффициенты для общего диапазона интенсивностей, которые у вас есть, а также две максимальные интенсивности записи и убедитесь, что эти два значения совпадают между вашими 2-мя массивами.

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

  • Лично я бы предложил использовать метрику, такую ​​как сходство с косинусом, чтобы определить разницу между двумя вашими блоками, но это не единственное решение и, хотя это даст вам быструю проверку, вы можете сделать лучше.

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

  • Это может быть излишним, но вы можете предположить, что есть определенные области речи, которые имеют более или менее важное значение для оценки различий между блоками (может быть, неважно, использует ли кто-то длинный я вместо короткого i, но ag вместо ak может быть совсем другим словом). Для чего-то подобного вам нужно разработать маску для разностного массива на предыдущем шаге и умножить на нее все ваши значения.

  • Какой бы метод вы ни выбрали, теперь вы можете просто установить порог разницы и убедиться, что разница между двумя блоками ниже желаемого порога. Если это так, захваченная речь достаточно похожа на правильность. В противном случае попробуйте еще раз.

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

Ответ 2

Идея: То, как биотехнологии выравнивают две последовательности белка, выглядит следующим образом: каждая последовательность представлена ​​в виде строки на алфавите, поскольку (A/C/G/T - это разные типы белков, которые не имеют к нам отношения), где каждая буква (здесь, вход) представляет собой определенную аминокислоту. Качество выравнивания (его оценка) рассчитывается по подобию каждой пары соответствующих записей, а также количеству и длине пустых записей, которые необходимо вставить для создания этого выравнивания.

Тот же алгоритм (http://en.wikipedia.org/wiki/Needleman-Wunsch_algorithm) может использоваться для произношения, от частот замещения в ряде альтернативных произношений. Затем вы можете рассчитать оценки выравнивания, чтобы измерить сходство между двумя произношениями так, чтобы они были чувствительны к различиям между фонемами. Меры сходства, которые могут быть использованы здесь, - это расстояние Левенштейна, частота ошибок фонемы и частота ошибок слов.

Алгоритмы Минимальное количество вставок, исключений и замен, необходимых для преобразования одной последовательности в другую, - это расстояние Левенштейна. Дополнительная информация на http://php.net/manual/en/function.levenshtein.php Частота ошибок Phoneme (PER) - это расстояние Левенштейна между предсказанным произношением и произношением произношения, деленное на число фонем в произношении произношения. Частота ошибок в словах (WER) - это доля предсказанных произношений с по меньшей мере одной ошибкой фонемы до общего количества произношений.

Источник: Прошла ли стажировка в UW-Madison

Ответ 3

Musicg api https://code.google.com/p/musicg/ имеет звуковой генератор отпечатков пальцев и бомбардир вместе с исходным кодом, чтобы показать, как это делается.

Я думаю, что он ищет самую похожую точку в каждом треке, а затем оценивает, насколько он может соответствовать.

Он может выглядеть примерно как

import com.musicg.wave.Wave
   com.musicg.fingerprint.FingerprintSimilarity
   com.musicg.fingerprint.FingerprintSimilarityComputer
   com.musicg.fingerprint.FingerprintManager

double score =
new FingerprintsSimilarity(
    new Wave("voice1.wav").getFingerprint(),
    new Wave("voice2.wav").getFingerprint() ).getSimilarity();

Ответ 5

вы можете использовать Musicg https://code.google.com/p/musicg/, как предположил roy zhang. В андроиде просто включите файл musicg jar в свой проект Android и используйте его. Пример:

import com.musicg.wave.Wave;
import com.musicg.fingerprint.FingerprintSimilarity;


        //somewhere in your code add
        String file1 = Environment.getExternalStorageDirectory().getAbsolutePath();
        file1 += "/test.wav";

        String file2 = Environment.getExternalStorageDirectory().getAbsolutePath();
        file2 += "/test.wav";

        Wave w1 = new Wave(file1);
        Wave w2 = new Wave(file2);


        FingerprintSimilarity fps = w1.getFingerprintSimilarity(w2);
        float score = fps.getScore();
        float sim = fps.getSimilarity();



        Log.d("score", score+"");
        Log.d("similarities", sim+"");

Удачи.

Ответ 6

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

Возможно, HMM будет полезен здесь (скрытые марковские модели). Также смотрите здесь: http://htk.eng.cam.ac.uk/

Ответ 7

Если это только для проверки произношения [конечно, с другим акцентом], вы можете сделать это:

Шаг 1: Используя какой-то речевой инструмент [say диктатура драконов], вы можете иметь текст с собой.

Шаг 2: сравните строку или сформированное слово и сравните ее со строкой, которая фактически должна была быть объявлена.

Шаг 3: Если вы обнаружите какое-либо несоответствие в строках, это означает, что слово написано неправильно. И вы можете предложить правильное произношение.