Распознавание речи, ч.2: OpenAI whisper
Доброго времени суток
10 лет назад безуспешно искал варианты распознавания речи. Не нашел, смирился
Сегодня решил вернуться к вопросу. Вспомнил, что в новостях проскакивал RTranslator 2.0.0 и 2.0.1
В описании сказано, что он использует модель ИИ «OpenAI whisper». Так, становится все интереснее :)
Идем в официальный репозиторий openai/whisper . Где-то рядом лежит инструкция, как скачать языковые модели
Итак, поехали
- Запускаю игровой комп с нормальной видюхой (вообще не обязательно, но для quick start пусть так)
- создаем venv (раньше это называлось virtualenv. среда, в которую изолированно ставятся пакеты, чтобы не разводить бардак)
router@europe:venv$ python3 -m venv whisper
router@europe:venv$ . whisper/bin/activate
(whisper) router@venv:venv$ cd whisper/
- теперь скачиваем whl пакеты. Т.к. они очень большие. Чтобы в следующий раз не качать
Пакет с openai whisper называется «openai-whisper» (не путать с другими из кучи мусора pypi)
(whisper) router@venv:venv$ mkdir distribs
(whisper) router@venv:venv pip3 download openai-whisper -d distribs/ -v
[...]
(whisper) router@venv:venv$ pip3 download setuptools wheel -d distribs/ -v
[...]
- отлично, теперь эти же пакеты же устанавливаем (в venv «whisper»)
(whisper) router@europe:venv$ pip3 install --no-index --find-links distribs/ openai-whisper
- скачиваем языковые модели
Ссылки можно взять изwhisper/lib64/python3.11/site-packages/whisper/__init__.py
(см выше ссылку на обсуждение в github)
Я выбрал модели tiny (хватит даже интеграшки) и turbo (хорошая видюха позволяет)
После скачивания нужно положить в ~/.cache/whisper/
# в 2024 году лучше скачивать не от нас
# хотя не проверял, может и не блокировали...
curl -x socks5h://127.0.0.1:5555 -O 'https://openaipublic.azureedge.net/main/whisper/models/d3dd57d32accea0b295c96e26691aa14d8822fac7d9d27d5dc00b4ca2826dd03/tiny.en.pt'
curl -x socks5h://127.0.0.1:5555 -O 'https://openaipublic.azureedge.net/main/whisper/models/aff26ae408abcba5fbf8813c21e62b0941638c5f6eebfb145be0c9839262a19a/large-v3-turbo.pt'
# актуальные ссылки нужно брать из __init__.py пакета openai-whisper
- берем видеофайл и выдираем из него звук
(опять же, пока это первое знакомство. возможно, whisper сам бы это сделал, не знаю)
ffmpeg -i 01.Introduction.mp4 -vn -ar 44100 -ac 2 -b:a 192k 01.Introduction.mp3
- пробуем
# сначала модель tiny
(whisper) router@europe:test$ whisper 01.Introduction.mp3 --model tiny.en
/opt/venv/whisper/lib/python3.11/site-packages/whisper/__init__.py:150: FutureWarning: You are using `torch.load` with `weights_only=False` (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pickle data which will execute arbitrary code during unpickling (See https://github.com/pytorch/pytorch/blob/main/SECURITY.md#untrusted-models for more details). In a future release, the default value for `weights_only` will be flipped to `True`. This limits the functions that could be executed during unpickling. Arbitrary objects will no longer be allowed to be loaded via this mode unless they are explicitly allowlisted by the user via `torch.serialization.add_safe_globals`. We recommend you start setting `weights_only=True` for any use case where you don't have full control of the loaded file. Please open an issue on GitHub for any issues related to this experimental feature.
checkpoint = torch.load(fp, map_location=device)
[00:00.000 --> 00:07.400] In my 20-plus years, working in and around this industry, you start to pick up a couple
[00:07.400 --> 00:08.560] of things.
[00:08.560 --> 00:10.920] Like for example, the pace of technology.
[00:10.920 --> 00:15.560] It is sort of an established fact here in IT that the pace of the things that we work
[...]
# и с моделью turbo
(whisper) router@europe:test$ whisper 01.Introduction.mp3 --model turbo
[...]
Detecting language using up to the first 30 seconds. Use `--language` to specify the language
Detected language: English
[00:00.000 --> 00:07.400] In my 20-plus years working in and around this industry, you start to pick up a couple
[00:07.400 --> 00:08.400] of things.
[00:08.400 --> 00:10.920] Like, for example, the pace of technology.
[00:10.920 --> 00:15.560] It is sort of an established fact here in IT that the pace of the things that we work
- в другом терминале смотрю загрузку видюхи
# это с моделью tiny
router@europe:~$ nvidia-smi
[...]
| 0 NVIDIA GeForce RTX 3060 On | 00000000:01:00.0 Off | N/A |
| 51% 45C P2 40W / 170W | 1858MiB / 12288MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
[...]
| 0 N/A N/A 5777 C /opt/venv/whisper/bin/python3 1782MiB |
# а это с моделью turbo
[...]
| 0 NVIDIA GeForce RTX 3060 On | 00000000:01:00.0 Off | N/A |
| 82% 53C P2 123W / 170W | 5542MiB / 12288MiB | 86% Default |
[...]
| 0 N/A N/A 5777 C /opt/venv/whisper/bin/python3 5466MiB |
Текст в обоих случаях распознался одинаково, можно не насиловать видюху самой тяжелой моделью, а взять самую простую
Вот они, эти ваши нейросети. 10 лет назад я о таком мог только мечтать. А сейчас оно просто работает :)
Теперь надо для очистки совести завернуть этот в какой-нибудь sandbox и перенести на свой ноут. Хотя можно и забить - на игровом компе чувствительных данных нет, можно там гонять