Как обойти капчу, используя звук

в 10:42, , рубрики: captcha, pocketsphinx, python, speech recognition, капча

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


Не будем томить интригами специалистов в области speech recognition, сразу заявив, что никакая собственная система распознавания голоса под заявленные цели не разрабатывалась. В статье используется старый добрый Pocketsphinx, но с определенной степенью настройки.

Подготовка.

«Забегаешь в офис к конкурентам, у которых голосовое управление на компах, кричишь «Судо эрэм минус эрэф хоум» и убегаешь.» Из комментов.

Итак, капча предлагает себя прослушать, нажав на соответствующую кнопку. Если сохранить полученный звуковой файл, то можно выяснить, что он представляет из себя короткий отрезок аудио в .mp3. При этом, как выяснилось, капчи предлагаются с озвучкой женским голосом или мужским. «Рисунок» одних и тех же звуков, произнесенных мужчиной и женщиной разный:
Как обойти капчу, используя звук - 2
Озвучивают они как буквы (причем русские), так и цифры.
На первый взгляд все грустно. Но есть и позитивный момент в том, что звуки для одинаковых букв совпадает.

Пока эти знания не сильно помогают. Как это все затолкать в пакет Сфинкса?

Установка Pocketsphinx, русской звуковой модели.

*На хабре есть статья, где звук скармливают онлайн google переводчику через перенаправление вывода звука. И на этом можно было закончить данный пост, если бы все это работало для данного случая.

Установка самого Pocketsphinx на windows (да и на linux) не сильно замысловата — скачать, установить.

Так как по умолчанию pocketsphinx идет с английской языковой, акустической моделями, словарем, понадобится все то же самое для русского языка.
Скачаем русский вариант — ссылка.

После распаковки русской модели в структуре файлов можно попробовать тестовый .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

.
После скачивания утилиты 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'),

Теперь, после отработки кода:
Как обойти капчу, используя звук - 3
Правда надо ждать как до второго пришествия, код очень медленно работает — около 20 сек.

Сконвертируем аудио капчи по тому же принципу из mp3 в wav и скормим аудио от капчи. Взглянем на работу кода:
Как обойти капчу, используя звук - 4

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

Посмотрим как улучшить результат и одновременно его ускорить.

Словарь

.
Понадобится собственный словарь. В данном случае он будет состоять из всех букв русского алфавита (кроме ь, ы, ъ) и цифр.
Все символы надо поместить в обычный текстовый файл по одному в каждой строке в кодировке UTF-8.

Теперь надо сконвертировать словарь.
Понадобится установка perl (он нужен для работы конвертатора).
Далее скачаем проект для конвертации ru4sphinx.

И конвертируем ранее созданный словарь:
C:ru4sphinx-masterru4sphinx-mastertext2dict> perl dict2transcript.pl my_dictionary.txt my_dictionary_out.txt.
На выходе получаем словарь для работы:
Как обойти капчу, используя звук - 6

Расширение словаря надо переименовать из .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')

Прогоним через программу и посмотрим результат:
Как обойти капчу, используя звук - 7
Лучше, но так же медленно и не все буквы правильно определились.

Создадим собственную модель

.
Это позволит в разы увеличить скорость работы и немного точность результата.
Пойдем коротким путем из инструкции.
Зайдем по ссылке и загрузим на сайт наш словарь, ранее созданный в формате .txt (не .dic!):
Как обойти капчу, используя звук - 8
Нажмем «Compile...». На выходе можно скачать полученный пакет в архиве .tgz (он содержит все необходимые файлы):
Как обойти капчу, используя звук - 9

Далее из архива возьмем файл с расширением .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'),

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

Не все символы распознаются корректно, и если вместо правильной букву выдает другой символ, то можно вручную поправить ранее созданный словарь .dic, сопоставив соответствие буквы.
Например, вместо буквы а, выводит э. Необходимо взять строку из словаря э:
э r y
и перенести(удалив старую) ее, поменяв букву:
а r y
Но так как буква «а» уже есть в словаре, то к букве надо добавить "(2)" (или 3,4), вообщем, порядковый номер, в зависимости сколько звуков уже есть в словаре:
a(2) r y

Заново конвертировать словарь не нужно. Таким нехитрым способом можно «подобрать» фонемы всех букв, почти.

Cherchez la femme.

Модель и словарь работают, но не с женским голосом. Если озвучка капчи женская, то на выходе не получаем ничего. Это и хорошо и плохо одновременно. Сначала о хорошем.
Если при запуске программы ничего не распознало — значит мы имеем дело с женским голосом, так можно фильтровать «женские» капчи.

Но что с ними делать?
Здесь надо поработать с конвертацией.
Например, с «мужской» капчей частота была 16000, а для женской «подойдет» 24000:
ffmpeg -i acap(3).mp3 -ar 24000 acap(3)2.wav
Как обойти капчу, используя звук - 11

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

Полезные ссылки:
1. home-smart-home.ru/raspberry-pi-pocketsphinx-offlajn-raspoznavanie-rechi-i-upravlenie-golosom
2.https://itnan.ru/post.php?c=1&p=351376
3. ru.wikipedia.org/wiki/Cherchez_la_femme

Файлы:
1. Программа.
2. Модель.
3. Русская модель.
4. Словарь.
5.Тестовые капчи.
6. ffmpeg.
7. Пачка капч.

Автор: zoldaten

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js