Это может делать наша нейросеть, распознающая человека по одному произнесенному слогу. Однако тема этой статьи не касается напрямую идентификации по голосу, хотя и будет связана с ней. Мы расскажем о нейросетевых фичах, так называемых d-vector, которые можно использовать в задачах обработки звука: от верификации до распознавания речи и эмоций.
В зависимости от частоты дискретизации, в одной секунде звука может содержаться от 8 до 48 тысяч чисел. Их можно представить как отклонения от равновесного положения мембраны динамика или микрофона. На самом деле такое описание звука избыточно: амплитуда сигнала в следующий момент времени сильно зависит от предыдущего, что намекает на то, что этот сигнал можно эффективно сжать без особой потери информации. Существует огромное количество способов снизить размерность сигнала, и большинство из них основано на физических свойствах звука и особенностях слуха человека.
Мем 1.
До того, как нейросети хорошо себя зарекомендовали (в широком смысле), сообщество работало с так называемыми hand-crafted признаками. Самыми известными и широко используемыми из них является Pitch и MFCC. Первый имеет физический смысл частоты колебаний голосовых связок, которые различаются, например, для разных людей, а также зависят от интонации. Идея мел-кепстральных коэффициентов (MFCC) основана на нелинейности восприятия звука человеком, а именно частоты и громкости. Человеку кажется, что один звук выше другого на какую-то величину, если в реальности их частоты отличаются в какое-то количество раз.
Эти и другие вручную вычисленные признаки являются необратимыми в том смысле, что какая-то часть сигнала теряется безвозвратно. В некоторых задачах это не критично, но хотелось бы придумать более универсальный и рабочий подход.
Ключиком к решению этой проблемы является преобразование Фурье. С помощью него можно представить звуковой сигнал как сумму волн с разными частотами и амплитудами. На самом деле речь не стационарна в том смысле, что ее спектр будет качественно разным в разные моменты времени. Это позволяет рассматривать его в частотно-временном представлении, с помощью спектрограмм.
Для построения спектрограммы нужно разбить звук на пересекающиеся участки (overlapping frames) длиной в несколько десятков миллисекунд, для каждого из них посчитать преобразование Фурье и записать их модули в столбцы на спектрограммах. Причем такое преобразование является почти взаимно-обратным, то есть с помощью обратного преобразования Фурье и алгоритма Гриффина-Лима можно восстановить исходный звуковой сигнал (на самом деле потеря информации есть, так как преобразование Фурье в общем случае комплексное, а спектрограмма — вещественнозначная, и, чтобы приближенно восстановить фазы, обычно используется итеративный алгоритм Гриффина-Лима). Итого, если взять логарифм от амплитуд, получатся вот такие картинки:
Спектрограмма 5 секунд речи.
И их удобно обрабатывать сверточными сетями.
В задачах обработки изображений часто применяется такой хак: существуют большие базы с примерами разных объектов (например, ImageNet). Можно обучить большую сетку распознавать их, а затем дообучить ее на нашей конкретной задаче, или взять выходной результат с одного из внутренних полносвязных слоев. Считается, что такая архитектура будет вычислять хорошие информативные фичи для входных картинок. Опыт подсказывает, что почти всегда результаты будут лучше, чем если бы мы обучали нейросеть с нуля.
Идея d-векторов (вообще d-vectors, но иногда их называют x-vectors) аналогична использованию предобученных на ImageNet сеток, за исключением того факта, что аналогичных баз для спектрограмм не существует. Как возможный выход из положения можно рассмотреть автоэнкодеры, но они априори не знают, на что нужно обращать внимание в спектрограмме, поэтому работают неудовлетворительно.
Внимание, начинается основная часть этой статьи.
Широко известна задача верификации человека по голосу, где нужно по входному отрезку речи определить, кто из имеющихся в базе людей его произнес. На самом деле построение таких систем — это отдельная наука, и существует множество разных надстроек (длительность речи; требуется ли, чтобы все говорили один и тот же текст; постановка one vs one или one vs all), которые критичны при разных условиях, но нам нужно обратить внимание на другое.
А именно: насколько качественными окажутся фичи, если мы предобучим сетку распознавать человека. Все делается ради признаков.
В этом нам поможет интуиция и статья 2015 года. В ней авторы обучают сетку распознавать человека по лицу (face recognition). Фишка этой работы состоит в использовании Triplet Loss.
Его идея очень простая: нормируем фичи с предпоследнего слоя так, чтобы они лежали на единичной сфере, и потребуем, чтобы точки из одного класса лежали близко, а из разных — далеко. Этого можно достичь так: для каждого обучающего примера (anchor) находим в выборке еще два из того же и из другого класса — positive и negative. Затем для этих троек точек формируем лосс:
\begin{equation}
\Big[ \Vert f(x^a) — f(x^p)\Vert — \Vert f(x^a) — f(x^n)\Vert + \alpha \Big]_+,
\end{equation}
где x — входная картинка, f — выход сетки после нормализации, alpha — вручную выбираемый параметр, [ ]_{+} — ReLU функция. Качественно, величина этого лосса равна нулю, если расстояние между точками anchor и positive больше расстояния между anchor и negative как минимум на alpha, и тем больше, чем меньше различие между двумя разными классами.
Иллюстрация того, что происходит с фичами после обучения с Triplet Loss.
Кстати, формировать тройки можно по-умному. В какой-то момент величина лосса станет маленькой, и для ускорения обучения можно искать negative примеры не среди всех остальных классов, а рассматривать только близкие к anchor. Но для больших датасетов это сложно, ведь нужно считать попарные расстояния между классами, которые меняются после каждой итерации обучения сети.
У Triplet Loss есть преимущество перед Categorical Crossentropy, которая используется при обычной классификации. Модель, обученная с кроссэнтропией, будет стараться запихнуть все точки одного класса во все более маленькую по объему область, и лишняя для конкретной задачи информация может теряться. А нам этого не хочется, ведь мы собираемся использовать нейросеть как генератор фичей, а не для верификации. Triplet Loss обладает этим свойством в гораздо меньшей степени: ему важнее разнести разные классы в разные области на единичной сфере, чем скучковывать один класс.
Мем 2.
Последнее, что нужно сделать перед обучением генератора фич на спектрограммах — определиться с их размерами. Очевидно, что точность классификации будет тем выше, чем больший промежуток времени мы будет рассматривать, но тем более “усредненными” получатся признаки. Поэтому, разумно использовать такую длину сигнала, чтобы в нее попадали 1-3 фонемы (слога) — половина секунды кажется подходящей.
Для обучения берем VoxCeleb2 датасет, где на каждого из 6300 спикеров приходится несколько отдельных аудиозаписей по несколько минут каждая (сделанные в разных условиях). Часть аудифайлов используем для обучения, а оставшиеся — для валидации, выбираем архитектуру сверточный сети, довешиваем на нее Triplet Loss и обучаемся.
Результаты получились очень крутыми. За почти 2 недели обучения на 1080Ti (да, так долго) точность классификации достигла 55%. Казалось бы, не очень много, но точность top-5 составляет 78%, а если мы рассмотрим только самую громкую половину фрагментов, а это в основном ударные гласные, то точность top-5 вырастет до 91%. Можно сказать, что мы умеем идентифицировать человека по одной его фразе с приличной точностью. Но это неважно.
Мем 3.
Ведь затевалось все для фичей, которые можно получить как выход с предпоследнего перед классификацией слоя нейросети. Мы проверили их на своих задачах, и везде результаты получались лучше, чем при использовании классических подходов для вычисления признаков. Например, в задаче распознавания эмоций использование d-векторов позволило обойти state-of-the-art на 4%, а соответствующая статья была принята на конференцию FICC 2019. Однако, распознавание эмоций — это совсем другая история, о которой мы расскажем потом.
Автор: Григорий Стерлинг sterling239, эксперт по глубокому обучению, Neurodata Lab.
Матчасть
В зависимости от частоты дискретизации, в одной секунде звука может содержаться от 8 до 48 тысяч чисел. Их можно представить как отклонения от равновесного положения мембраны динамика или микрофона. На самом деле такое описание звука избыточно: амплитуда сигнала в следующий момент времени сильно зависит от предыдущего, что намекает на то, что этот сигнал можно эффективно сжать без особой потери информации. Существует огромное количество способов снизить размерность сигнала, и большинство из них основано на физических свойствах звука и особенностях слуха человека.
Мем 1.
До того, как нейросети хорошо себя зарекомендовали (в широком смысле), сообщество работало с так называемыми hand-crafted признаками. Самыми известными и широко используемыми из них является Pitch и MFCC. Первый имеет физический смысл частоты колебаний голосовых связок, которые различаются, например, для разных людей, а также зависят от интонации. Идея мел-кепстральных коэффициентов (MFCC) основана на нелинейности восприятия звука человеком, а именно частоты и громкости. Человеку кажется, что один звук выше другого на какую-то величину, если в реальности их частоты отличаются в какое-то количество раз.
Эти и другие вручную вычисленные признаки являются необратимыми в том смысле, что какая-то часть сигнала теряется безвозвратно. В некоторых задачах это не критично, но хотелось бы придумать более универсальный и рабочий подход.
Ключиком к решению этой проблемы является преобразование Фурье. С помощью него можно представить звуковой сигнал как сумму волн с разными частотами и амплитудами. На самом деле речь не стационарна в том смысле, что ее спектр будет качественно разным в разные моменты времени. Это позволяет рассматривать его в частотно-временном представлении, с помощью спектрограмм.
Для построения спектрограммы нужно разбить звук на пересекающиеся участки (overlapping frames) длиной в несколько десятков миллисекунд, для каждого из них посчитать преобразование Фурье и записать их модули в столбцы на спектрограммах. Причем такое преобразование является почти взаимно-обратным, то есть с помощью обратного преобразования Фурье и алгоритма Гриффина-Лима можно восстановить исходный звуковой сигнал (на самом деле потеря информации есть, так как преобразование Фурье в общем случае комплексное, а спектрограмма — вещественнозначная, и, чтобы приближенно восстановить фазы, обычно используется итеративный алгоритм Гриффина-Лима). Итого, если взять логарифм от амплитуд, получатся вот такие картинки:
Спектрограмма 5 секунд речи.
И их удобно обрабатывать сверточными сетями.
В задачах обработки изображений часто применяется такой хак: существуют большие базы с примерами разных объектов (например, ImageNet). Можно обучить большую сетку распознавать их, а затем дообучить ее на нашей конкретной задаче, или взять выходной результат с одного из внутренних полносвязных слоев. Считается, что такая архитектура будет вычислять хорошие информативные фичи для входных картинок. Опыт подсказывает, что почти всегда результаты будут лучше, чем если бы мы обучали нейросеть с нуля.
Идея d-векторов (вообще d-vectors, но иногда их называют x-vectors) аналогична использованию предобученных на ImageNet сеток, за исключением того факта, что аналогичных баз для спектрограмм не существует. Как возможный выход из положения можно рассмотреть автоэнкодеры, но они априори не знают, на что нужно обращать внимание в спектрограмме, поэтому работают неудовлетворительно.
We need to go deeper
Внимание, начинается основная часть этой статьи.
Широко известна задача верификации человека по голосу, где нужно по входному отрезку речи определить, кто из имеющихся в базе людей его произнес. На самом деле построение таких систем — это отдельная наука, и существует множество разных надстроек (длительность речи; требуется ли, чтобы все говорили один и тот же текст; постановка one vs one или one vs all), которые критичны при разных условиях, но нам нужно обратить внимание на другое.
А именно: насколько качественными окажутся фичи, если мы предобучим сетку распознавать человека. Все делается ради признаков.
В этом нам поможет интуиция и статья 2015 года. В ней авторы обучают сетку распознавать человека по лицу (face recognition). Фишка этой работы состоит в использовании Triplet Loss.
Его идея очень простая: нормируем фичи с предпоследнего слоя так, чтобы они лежали на единичной сфере, и потребуем, чтобы точки из одного класса лежали близко, а из разных — далеко. Этого можно достичь так: для каждого обучающего примера (anchor) находим в выборке еще два из того же и из другого класса — positive и negative. Затем для этих троек точек формируем лосс:
\begin{equation}
\Big[ \Vert f(x^a) — f(x^p)\Vert — \Vert f(x^a) — f(x^n)\Vert + \alpha \Big]_+,
\end{equation}
где x — входная картинка, f — выход сетки после нормализации, alpha — вручную выбираемый параметр, [ ]_{+} — ReLU функция. Качественно, величина этого лосса равна нулю, если расстояние между точками anchor и positive больше расстояния между anchor и negative как минимум на alpha, и тем больше, чем меньше различие между двумя разными классами.
Иллюстрация того, что происходит с фичами после обучения с Triplet Loss.
Кстати, формировать тройки можно по-умному. В какой-то момент величина лосса станет маленькой, и для ускорения обучения можно искать negative примеры не среди всех остальных классов, а рассматривать только близкие к anchor. Но для больших датасетов это сложно, ведь нужно считать попарные расстояния между классами, которые меняются после каждой итерации обучения сети.
У Triplet Loss есть преимущество перед Categorical Crossentropy, которая используется при обычной классификации. Модель, обученная с кроссэнтропией, будет стараться запихнуть все точки одного класса во все более маленькую по объему область, и лишняя для конкретной задачи информация может теряться. А нам этого не хочется, ведь мы собираемся использовать нейросеть как генератор фичей, а не для верификации. Triplet Loss обладает этим свойством в гораздо меньшей степени: ему важнее разнести разные классы в разные области на единичной сфере, чем скучковывать один класс.
Мем 2.
Последнее, что нужно сделать перед обучением генератора фич на спектрограммах — определиться с их размерами. Очевидно, что точность классификации будет тем выше, чем больший промежуток времени мы будет рассматривать, но тем более “усредненными” получатся признаки. Поэтому, разумно использовать такую длину сигнала, чтобы в нее попадали 1-3 фонемы (слога) — половина секунды кажется подходящей.
Для обучения берем VoxCeleb2 датасет, где на каждого из 6300 спикеров приходится несколько отдельных аудиозаписей по несколько минут каждая (сделанные в разных условиях). Часть аудифайлов используем для обучения, а оставшиеся — для валидации, выбираем архитектуру сверточный сети, довешиваем на нее Triplet Loss и обучаемся.
Результаты получились очень крутыми. За почти 2 недели обучения на 1080Ti (да, так долго) точность классификации достигла 55%. Казалось бы, не очень много, но точность top-5 составляет 78%, а если мы рассмотрим только самую громкую половину фрагментов, а это в основном ударные гласные, то точность top-5 вырастет до 91%. Можно сказать, что мы умеем идентифицировать человека по одной его фразе с приличной точностью. Но это неважно.
Мем 3.
Ведь затевалось все для фичей, которые можно получить как выход с предпоследнего перед классификацией слоя нейросети. Мы проверили их на своих задачах, и везде результаты получались лучше, чем при использовании классических подходов для вычисления признаков. Например, в задаче распознавания эмоций использование d-векторов позволило обойти state-of-the-art на 4%, а соответствующая статья была принята на конференцию FICC 2019. Однако, распознавание эмоций — это совсем другая история, о которой мы расскажем потом.
Автор: Григорий Стерлинг sterling239, эксперт по глубокому обучению, Neurodata Lab.
Комментарии (7)
ZlodeiBaal
08.09.2018 12:15+1И как же с этой паршивой точностью:
точность классификации достигла 55%. Казалось бы, не очень много, но точность top-5 составляет 78%, а если мы рассмотрим только самую громкую половину фрагментов, а это в основном ударные гласные, то точность top-5 вырастет до 91%.
Вы планируете опознать по половине слова?
Для какого применения? Может сразу доступ к банковской ячейке по телефону?;)
phenik
08.09.2018 14:27+1Ключиком к решению этой проблемы является преобразование Фурье. С помощью него можно представить звуковой сигнал как сумму волн с разными частотами и амплитудами. На самом деле речь не стационарна в том смысле, что ее спектр будет качественно разным в разные моменты времени.
Может эффективнее использовать вэйвлет-преоборазование?ValdikSS
08.09.2018 15:36+1Нет, для аудио FFT значительно эффективнее.
Wavelet Sound ExplorerWhy hasn't this been done before? The main reason is because it takes a LOT of space to store the sound. A 5 minute mp3 file recorded at 44100 samples per second will contain 13230000 samples. In the frequency domain, each complex sample takes 8 bytes. So each frequency band (line in the image) that you are interested in would take about 100MB. The resulting wavelet transform would take up 218 GB.
Mobile1
08.09.2018 16:39Голос же легко подделать.
На Хабре уже была статья в прошлом году:
Создана первая технология для подделки любых голосов
terixoid
10.09.2018 12:23Пробовали ли вы обучать и использовать i-векторы?
astkristina Автор
10.09.2018 13:02Добрый день,
i-векторы не использовали — они не содержат информацию о том, что и как человек говорит, а только о том, кто говорит. Все затевалось для того, чтобы сделать хороший генератор фичей.
basilbasilbasil
на спектрограмме по вертикали идёт частота.
При препроцессинге можно сжать (compressor) диапазон голоса в 48дб (с отсечкой снизу — gate), это даст:
— меньше шума
— 8 вменяемых бит на амплитуду
— 8 бит на фазу для ДФТ(ДФТ — чтобы не терять фазу; а зачем терять, если можно не терять). Кодируете в цвет — получаете больше инфы для нейросети — вырастает качество распознавания.
Не благодарите.