[TOC]
Небольшое пояснение про данные:
$ soxi mix_<...>.mp3
Input File : 'mix_<...>.mp3'
Channels : 1
Sample Rate : 8000
Precision : 16-bit
Duration : 00:01:44.40 = 835200 samples ~ 7830 CDDA sectors
File Size : 313k
Bit Rate : 24.0k
Sample Encoding: MPEG audio (layer I, II or III)
В Google SpAPI и Ya.Sp.Kit просят Sample Rate 16k или 44.1k. Однако, сконвертированное вполне распознают. Для OpenSource систем, судя по форумам, собирают модели оптимизированные под определенный Sample Rate.
Я взял первые 10-15 секунд от одного из треков и проверял на нем все доступные системы.
Умеет русский, получается даже не очень плохо:
{
"result":[
{
"alternative":[
{
"transcript":"Добрый день компания? Здравствуйте ваш номер телефона сегодня звонили вам по насосу"
},
{
"transcript":"Добрый день компонента? Здравствуйте ваш номер телефона сегодня звонили вам по насосу"
},
{
"transcript":"Добрый день компонента? Здравствуйте Ваш номер дали телефона сегодня звонили вам по насосу"
},
{
"transcript":"Добрый день компания? Здравствуйте Ваш номер дали телефона сегодня звонили вам по насосу"
},
{
"transcript":"добрый день Здравствуйте ваш номер телефона сегодня звонили вам по насосу"
}
],
"final":true
}
],
"result_index":0
}
Принимает отрывки 10-15 секунд максимум. Обычно приходит два ответа, первый пустой, во втором может быть много альтернатив.
- Для использования очевидно нужно резать файлы, а затем склеивать то, что получится.
- Больше 50 запросов делать пока нельзя. Так что это тупик. Разве что как GNDT рассматривать, хотя качество.. ну так.
Google Speech API не вариант.
Умеет русский, принимает более длинные файлы
<?xml version="1.0" encoding="utf-8"?>
<recognitionResults success="1">
<variant confidence="-4.2">Добрый день компания strategy не слышалось здравствуйте ваш номер дали телефон еще не звонили вам по насосу возможно товары как июля надо оплатить чтобы мне надо вам счет да мне надо выставить счет для начала вот на той же компании</variant>
<variant confidence="0">Добрый день компания strategy не слышалось здравствуйте ваш номер дали телефон еще не звонили вам по насосу возможно также и ура завтра надо оплатить чтобы мне надо вам счет да мне надо выставить счет для начала вот на той же компании</variant>
<variant confidence="0">Добрый день компания strategy не слышалось здравствуйте ваш номер дали телефон еще не звонили вам по насосу возможно товары как июля надо оплатить чтобы мне надо вам счет да мне надо выставить счет для начала в 1 компания</variant>
<variant confidence="0">Добрый день компания strategy не слышалось здравствуйте ваш номер дали телефон еще не звонили вам по насосу возможно также и ура завтра надо оплатить чтобы мне надо вам счет да мне надо выставить счет для начала в 1 компания</variant>
<variant confidence="0">Добрый день компания strategy ни случилось ваш номер дали телефон еще не звонили вам по насосу возможно товары как июля надо оплатить чтобы мне надо вам счет да мне надо выставить счет для начала вот на той же компании</variant>
</recognitionResults>
Больше определенного размера файлы не берет (90 секунд по длине или 1Мб по размеру). На mp3 валится=
Похоже придется резать. Но есть приятная штука: Я.спич.кит умеет потоковое распознавание так что можно порезать файл по репликам и грузить по websockets: [https://tech.yandex.ru/speechkit/cloud/doc/dg/concepts/speechkit-dg-recogn-docpage/#request][]
(К сожалению, потоковый варианты получился не очень)
Для SpeechKit Mobile квота известна — это 10к запросов в день. Для общего SK не понятно, но по интересным применениям предлагают общаться.
Как вариант.
Речь пойдет о тех вариантах, для которых есть русская языковая модель на сайте VoxForge.
Sphinx, ISIP, Julius, HTK:
CMU Sphinx, считается хорошим фреймворком для распознавания речи. Есть базы (акустическая модель, языковая модель и словарь произношения ) для разных языков, в том числе и для русского.
Получается не очень:
000000000: с звонка часто раз-раз и с вашей дочери не варевом по полу
Судя по всему, нужно предварительно обрабатывать файлы, и готовить модельки. Кроме того, с длинными фрагментами не работает.
Как вариант — резать на реплики, распознавать и сшивать результаты.
Требуется много работы, кроме подготовки звуковых файлов, нужно еще обучить систему, у нее много степеней свободы, помимо языковых моделек.
Игра с имеющимися параметрами и предварительным разделением голосов от шума с помощью pyFASST ничего особенного не дала.
ISIP стар.
Not yet.
Скомпилировал, но еще не попробовал.
Not yet.
Вариантов несколько:
-
Blind Audio Source Separation, Audio Source Separation.
-
Или по спектрограммам, глазами чаще всего разница видна.
Попробовал библиотеку pyFASST [https://github.com/wslihgt/pyfasst][].
Много-много настроек, с ними надо что-то уметь делать, или запилить схему с обратной связью. С наскоку получилось разделить немного голоса от шума.
Поэтому пока разметил пару файлов, если с распознаванием сложится, можно попробовать научить классификатор выделять реплики по голосам.
Я руками разметил пару файлов (ориентируясь в основном по спектрограмме), порезал скриптом и покидал в Ya.Speech Kit, затем склеил обратно. Результат для файла mix_13040_17016_<...>
получается примерно такой:
0 S:
{'confidence': '-0.19'}: Добрый день компания процесс лечения случалось
{'confidence': '0'}: Добрый день компания strategy не случилось
{'confidence': '0'}: Добрый день компания процесс лечения случилось
{'confidence': '0'}: Добрый день компания процесс лечения сущность
{'confidence': '0'}: Добрый день компаний процесс лечения случалось
1 C:
{'confidence': '0.9'}: Здравствуйте ваш номер дали телефон еще не звонили вам по насосу
{'confidence': '0'}: А здравствуйте ваш номер дали телефон еще не звонили вам по насосу
2 S:
{'confidence': '0.91'}: Возможно
{'confidence': '0'}: Возможна
3 C:
{'confidence': '0.79'}: Товары
{'confidence': '0'}: Товаре
4 S:
{'confidence': '0.16'}: Да
{'confidence': '0'}: Да прям
{'confidence': '0'}: Да я
{'confidence': '0'}: Да да
{'confidence': '0'}: Ура ура
5 C:
{'confidence': '0'}: Умер беседе как будто надо оплатить чтобы
{'confidence': '0'}: Умер беседе как будто надо оплатить что бы
{'confidence': '0'}: Умер же беседе как будто надо оплатить чтобы
{'confidence': '0'}: Умер беседе как то надо оплатить чтобы
{'confidence': '0'}: Беседе как будто надо оплатить чтобы
6 S:
{'confidence': '-0.99'}: Мне надо вам счет да мне надо выставить счет для начала вот на то сюда идет компании проплачивать
{'confidence': '0'}: Мне надо вам счет да мне надо выставить счет для начала вот на той же компании проплачивать
{'confidence': '0'}: Мне надо вам счет да мне надо выставить счет для начала вот на то сюда идет компании прочитать
{'confidence': '0'}: Мне надо вам еще от да мне надо выставить счет для начала вот на то сюда идет компании проплачивать
{'confidence': '0'}: Мне надо вам счет да мне надо выставить счет для начала вот на то сюда идет компания проплачивать
7 C:
8 S:
{'confidence': '-0.46'}: От частного лица
{'confidence': '0'}: От компании
{'confidence': '0'}: Отшатнулись кампаний
{'confidence': '0'}: Отчетная кампания
{'confidence': '0'}: Отшатнулись компании
9 C:
{'confidence': '0.67'}: Дорога
{'confidence': '0'}: Да да да
10 S:
{'confidence': '-0.9'}: Я тогда на частное лицо фамилия имя отчество выставляющая и вы оплачиваете его и все мы отправляем вам на флеш
{'confidence': '0'}: Я тогда на частное лицо фамилия имя отчество выставляющая и вы оплачиваете его и все мы отправляем данных
{'confidence': '0'}: Я тогда на частное лицо фамилия имя отчество выставляющее и вы оплачиваете его и все мы отправляем вам на флеш
{'confidence': '0'}: Я тогда на частное лицо фамилия имя отчество выставляющее и вы оплачиваете его и все мы отправляем данных
{'confidence': '0'}: Я тогда на частное лицо фамилия имя отчество выставляющая и вы оплачиваете его и все мы отправляем вам на фарш
11 C:
{'confidence': '0.07'}: Истечению времени
{'confidence': '0'}: Истечении времени
{'confidence': '0'}: Истечении этого времени
{'confidence': '0'}: Истечении какого времени
{'confidence': '0'}: Истечению этого времени
12 S:
{'confidence': '0.65'}: Концу следующей недели он будет кирове
{'confidence': '0'}: Концу следующей недели он будет в кирове
13 C:
{'confidence': '0.87'}: Пятница
{'confidence': '0'}: Пятница да
14 S:
{'confidence': '0.99'}: Да
15 C:
{'confidence': '-0.91'}: Так ладно хорошо
{'confidence': '0'}: Так ладно хорошо пинком подъехать
{'confidence': '0'}: Так ладно хорошо как пинком подъехать
{'confidence': '0'}: Так ладно хорошо пеньком подъехать
{'confidence': '0'}: Так ладно хорошо как пеньком подъехать
16 S:
{'confidence': '-0.77'}: Пальто напечатаны 60
{'confidence': '0'}: Так я вам пальто напечатаны 60
{'confidence': '0'}: Электронный почтовый счет
{'confidence': '0'}: Пальто напечатаны счет
{'confidence': '0'}: Мы поиграли почитали счет
17 C:
{'confidence': '0.99'}: Полигоны
18 S:
{'confidence': '0.99'}: Конечно
19 C:
{'confidence': '-0.06'}: Я 8 кирове просто уже
{'confidence': '0'}: Я 8 кирове просто ужас
{'confidence': '0'}: Я 8 тире просто уже
{'confidence': '0'}: Я 8 тире просто ужас
{'confidence': '0'}: Я 8 кирове прошел уже
20 S:
{'confidence': '-0.99'}: Надо жить у нас qiwi терминал том что никто не выписывать иностранцам дальнему все писают в городе пермь
{'confidence': '0'}: Надо жить у нас qiwi терминал а что никто не выписывать иностранцам дальнему все писают в городе пермь
{'confidence': '0'}: Надо жить у нас qiwi терминал то что никто не выписывать иностранцам дальнему все писают в городе пермь
{'confidence': '0'}: Надо жить у нас qiwi терминал что никто не выписывать иностранцам дальнему все писают в городе пермь
{'confidence': '0'}: Надо жить у нас qiwi терминал том что никто не выписывать у нас так далее но все писают в городе пермь
21 C:
{'confidence': '0.83'}: Перми
{'confidence': '0'}: Переместить
22 S:
{'confidence': '0.99'}: Да
23 C:
{'confidence': '0.82'}: А
{'confidence': '0'}: Тракта
{'confidence': '0'}: То
24 S:
{'confidence': '0.74'}: Склад вообще в москве
{'confidence': '0'}: What вообще в москве
25 C:
{'confidence': '0.99'}: Ладно хорошо
26 S:
{'confidence': '0.74'}: Хорошо
{'confidence': '0'}: Хороша
Такого качества на из-коробочном CMU Sphinx получить пока не удалось.
У Яндекса есть кастомные предложения, например [SpeechKit Box][https://tech.yandex.ru/speechkit/box/].