- PVSM.RU - https://www.pvsm.ru -
На просторах интернета до сих пор остаются актуальными капчи, которые в качестве опции предлагают прослушать текст с картинки, нажав на соответствующую кнопку. Если кому-то знакома картинка ниже и/или есть интерес как ее обойти, используя систему оффлайн распознавания звука, предлагается к прочтению.
Не будем томить интригами специалистов в области speech recognition, сразу заявив, что никакая собственная система распознавания голоса под заявленные цели не разрабатывалась. В статье используется старый добрый Pocketsphinx, но с определенной степенью настройки.
«Забегаешь в офис к конкурентам, у которых голосовое управление на компах, кричишь «Судо эрэм минус эрэф хоум» и убегаешь.» Из комментов.
Итак, капча предлагает себя прослушать, нажав на соответствующую кнопку. Если сохранить полученный звуковой файл, то можно выяснить, что он представляет из себя короткий отрезок аудио в .mp3. При этом, как выяснилось, капчи предлагаются с озвучкой женским голосом или мужским. «Рисунок» одних и тех же звуков, произнесенных мужчиной и женщиной разный:
Озвучивают они как буквы (причем русские), так и цифры.
На первый взгляд все грустно. Но есть и позитивный момент в том, что звуки для одинаковых букв совпадает.
Пока эти знания не сильно помогают. Как это все затолкать в пакет Сфинкса?
*На хабре есть статья [1], где звук скармливают онлайн google переводчику через перенаправление вывода звука. И на этом можно было закончить данный пост, если бы все это работало для данного случая.
Установка самого Pocketsphinx на windows (да и на linux) не сильно замысловата — скачать [2], установить.
Так как по умолчанию pocketsphinx идет с английской языковой, акустической моделями, словарем, понадобится все то же самое для русского языка.
Скачаем русский вариант — ссылка [3].
После распаковки русской модели в структуре файлов можно попробовать тестовый .wav файл decoder-text.wav cо следующим кодом на python:
import os
from pocketsphinx import AudioFile, get_model_path, get_data_path
#from pocketsphinx import Pocketsphinx
model_path = get_model_path()
data_path = get_data_path()
config = {
'verbose': False,
'audio_file': os.path.join(data_path, 'C://python3//decoder-test.wav'),
'buffer_size': 2048,
'no_search': False,
'full_utt': False,
'hmm': os.path.join(model_path, 'C://python3//zero_ru_cont_8k_v3//zero_ru.cd_cont_4000'),
'lm': os.path.join(model_path, 'C://python3//zero_ru_cont_8k_v3//ru.lm'),
'dict': os.path.join(model_path, 'C://python3//zero_ru_cont_8k_v3//ru.dic')
}
audio = AudioFile(**config)
for phrase in audio:
print(phrase)
Должно вывести в строку содержание аудиофайла: «илья ильф евгений петров золотой телёнок».
Если не вывело (как и в моей ситуации), то необходимо сконвертировать decoder-test.wav в другой аудиоформат.
Для этого понадобится ffmpeg.
.
После скачивания утилиты ffmpeg, положим decoder-test.wav в C:python3ffmpegbin.
Далее в командной строке конвертируем:
ffmpeg -i decoder-test.wav -ar 16000 decoder-test-.wav
Далее исправим в коде python ссылку на исходный аудиофайл:
'audio_file': os.path.join(data_path, 'C://python3//decoder-test-.wav'),
Теперь, после отработки кода:
Правда надо ждать как до второго пришествия, код очень медленно работает — около 20 сек.
Сконвертируем аудио капчи по тому же принципу из mp3 в wav и скормим аудио от капчи. Взглянем на работу кода:
Невесть какой, но результат есть. Было гораздо хуже, если если бы ничего не вывело. Как с женским голосом:
Посмотрим как улучшить результат и одновременно его ускорить.
.
Понадобится собственный словарь. В данном случае он будет состоять из всех букв русского алфавита (кроме ь, ы, ъ) и цифр.
Все символы надо поместить в обычный текстовый файл по одному в каждой строке в кодировке UTF-8.
Теперь надо сконвертировать словарь.
Понадобится установка perl (он нужен для работы конвертатора).
Далее скачаем проект для конвертации ru4sphinx [4].
И конвертируем ранее созданный словарь:
C:ru4sphinx-masterru4sphinx-mastertext2dict> perl dict2transcript.pl my_dictionary.txt my_dictionary_out.txt.
На выходе получаем словарь для работы:
Расширение словаря надо переименовать из .txt в формат .dic, а сам файл положить в доступное место.
В коде python укажем расположение словаря, закомментировав старый словарь:
#'dict': os.path.join(model_path, 'C://python3//zero_ru_cont_8k_v3//ru.dic')
'dict': os.path.join(model_path, 'C://python3//my_dict.dic')
Прогоним через программу и посмотрим результат:
Лучше, но так же медленно и не все буквы правильно определились.
.
Это позволит в разы увеличить скорость работы и немного точность результата.
Пойдем коротким путем из инструкции [5].
Зайдем по ссылке [6] и загрузим на сайт наш словарь, ранее созданный в формате .txt (не .dic!):
Нажмем «Compile...». На выходе можно скачать полученный пакет в архиве .tgz (он содержит все необходимые файлы):
Далее из архива возьмем файл с расширением .lm(наша модель).
Поправим python скрипт распознавания, заменив модель на вновь изготовленную:
#'lm': os.path.join(model_path, 'C://python3//zero_ru_cont_8k_v3//ru.lm'),
'lm': os.path.join(model_path, 'C://python3//my_model//1896.lm'),
Пробуем:
Работает заметно быстрее — менее секунды, кроме того, все буквы определены.
Но тут необходима небольшая ремарка.
Не все символы распознаются корректно, и если вместо правильной букву выдает другой символ, то можно вручную поправить ранее созданный словарь .dic, сопоставив соответствие буквы.
Например, вместо буквы а, выводит э. Необходимо взять строку из словаря э:
э r y
и перенести(удалив старую) ее, поменяв букву:
а r y
Но так как буква «а» уже есть в словаре, то к букве надо добавить "(2)" (или 3,4), вообщем, порядковый номер, в зависимости сколько звуков уже есть в словаре:
a(2) r y
Заново конвертировать словарь не нужно. Таким нехитрым способом можно «подобрать» фонемы всех букв, почти.
Модель и словарь работают, но не с женским голосом. Если озвучка капчи женская, то на выходе не получаем ничего. Это и хорошо и плохо одновременно. Сначала о хорошем.
Если при запуске программы ничего не распознало — значит мы имеем дело с женским голосом, так можно фильтровать «женские» капчи.
Но что с ними делать?
Здесь надо поработать с конвертацией.
Например, с «мужской» капчей частота была 16000, а для женской «подойдет» 24000:
ffmpeg -i acap(3).mp3 -ar 24000 acap(3)2.wav
Все звуки определились (в каждой строке по звуку), но их соответствие хромает.
Лучше создать отдельный словарь под женскую модель и далее ее править.
Однако, это для самостоятельного изучения.
Полезные ссылки:
1. home-smart-home.ru/raspberry-pi-pocketsphinx-offlajn-raspoznavanie-rechi-i-upravlenie-golosom [5]
2.https://itnan.ru/post.php?c=1&p=351376
3. ru.wikipedia.org/wiki/Cherchez_la_femme [7]
Файлы:
1. Программа [8].
2. Модель [9].
3. Русская модель [10].
4. Словарь [11].
5.Тестовые капчи [12].
6. ffmpeg [13].
7. Пачка капч [14].
Автор: zoldaten
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/329400
Ссылки в тексте:
[1] статья: https://habr.com/ru/post/412285/
[2] скачать: https://pypi.org/project/pocketsphinx/#downloads
[3] ссылка: https://sourceforge.net/projects/cmusphinx/files/Acoustic%20and%20Language%20Models/Russian/zero_ru_cont_8k_v3.tar.gz/download
[4] ru4sphinx: https://github.com/zamiron/ru4sphinx
[5] инструкции: http://home-smart-home.ru/raspberry-pi-pocketsphinx-offlajn-raspoznavanie-rechi-i-upravlenie-golosom/
[6] ссылке: http://www.speech.cs.cmu.edu/tools/lmtool-new.html
[7] ru.wikipedia.org/wiki/Cherchez_la_femme: https://ru.wikipedia.org/wiki/Cherchez_la_femme
[8] Программа: https://yadi.sk/d/Q_1-7GvDH-l4OA
[9] Модель: https://yadi.sk/d/hPK4SGgDyDeJzA
[10] Русская модель: https://yadi.sk/d/A5HuxO_iDJ5dGA
[11] Словарь: https://yadi.sk/d/DzNuCGNJ1oVTtA
[12] Тестовые капчи: https://yadi.sk/d/yxSWaxWv1FsTmQ
[13] ffmpeg: https://yadi.sk/d/Ypv5a6f-uiKFGQ
[14] Пачка капч: https://yadi.sk/d/EbiID-Lgd_2YGg
[15] Источник: https://habr.com/ru/post/466599/?utm_source=habrahabr&utm_medium=rss&utm_campaign=466599
Нажмите здесь для печати.