LINUX.ORG.RU
ФорумTalks

Распознавание речи, ч.2: OpenAI whisper

 , , ,


1

3

Доброго времени суток

10 лет назад безуспешно искал варианты распознавания речи. Не нашел, смирился

Сегодня решил вернуться к вопросу. Вспомнил, что в новостях проскакивал RTranslator 2.0.0 и 2.0.1
В описании сказано, что он использует модель ИИ «OpenAI whisper». Так, становится все интереснее :)

Идем в официальный репозиторий openai/whisper . Где-то рядом лежит инструкция, как скачать языковые модели

Итак, поехали

  1. Запускаю игровой комп с нормальной видюхой (вообще не обязательно, но для quick start пусть так)
  2. создаем venv (раньше это называлось virtualenv. среда, в которую изолированно ставятся пакеты, чтобы не разводить бардак)
router@europe:venv$ python3 -m venv whisper
router@europe:venv$ . whisper/bin/activate
(whisper) router@venv:venv$ cd whisper/
  1. теперь скачиваем 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
[...]
  1. отлично, теперь эти же пакеты же устанавливаем (в venv «whisper»)
(whisper) router@europe:venv$ pip3 install --no-index --find-links distribs/  openai-whisper
  1. скачиваем языковые модели
    Ссылки можно взять из 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
  1. берем видеофайл и выдираем из него звук
    (опять же, пока это первое знакомство. возможно, whisper сам бы это сделал, не знаю)
ffmpeg -i 01.Introduction.mp4 -vn -ar 44100 -ac 2 -b:a 192k 01.Introduction.mp3

  1. пробуем
# сначала модель 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

  1. в другом терминале смотрю загрузку видюхи
# это с моделью 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 и перенести на свой ноут. Хотя можно и забить - на игровом компе чувствительных данных нет, можно там гонять

★★★★★

Последнее исправление: router (всего исправлений: 2)
Ответ на: комментарий от masa

Занятно, с простой моделью работает когда микрофон лежит в метре, а с whisper нужно прямо в микрофон говорить. Громкость произнесения и фразы - одинаковые.

Loki13 ★★★★★
()
Ответ на: комментарий от Loki13

Там есть порог тишины, в whisper_listener - silence_threshold. Можно уменьшить и будет срабатывать от меньшей громкости.

Еще может быть стоит проверить громкость микрофона в системе, увеличить и станет ок.

У меня Audio device: Intel Corporation Sunrise Point-LP HD Audio (rev 21), у него 100% это какой-то адский буст, лучше всего работает на 30% микрофона. Поэтому я даже встроил команду - «починить микрофон» :D

masa
()
Ответ на: комментарий от Loki13

Вообще я думал whisper будет сильно лучше по качеству, но не сказал бы, часть слов перевирает как и vosk.

Но он генерирует более «литературные» тексты с пунктуацией, иногда даже с эмоциями. Ставит восклицательные знаки, пишет капсом, на этом плюсы заканчиваются. Для ассистента это даже минус, пунктуацию все равно надо вычищать, а слова приводить в начальную форму.

masa
()
Ответ на: комментарий от praseodim

Проверил, в версиях без 'en'. Есть распознавание языка.

Выдирать аудио-файл - лишнее. whisper понимает и если сразу на вход подать видео-файл, причем создает файлы-субтитры в нескольких форматах.

Для русского языка разница между tiny и turbo очень заметная.

Например, вот результат на этом видео https://www.youtube.com/watch?v=StZaHBNWiOs

tiny

[00:00.000 --> 00:10.240]  Всем привет! На этом занятиям мы познакомимся со салбом бидом
[00:10.240 --> 00:12.840]  мере сетей, которые используют создаданных представленных
[00:12.840 --> 00:15.120]  видей последовательности. В том числе и для тексты
[00:15.120 --> 00:18.160]  по аудио. Это рекуентный нерон на сети.
[00:18.160 --> 00:22.300]  План занятия такой. Сначала мы поговорим
[00:22.300 --> 00:24.520]  общее идее рекуентного слоя и устройство
[00:24.520 --> 00:28.800]  рекуентный нерон на сети. Затем, обсудим в порвар пассернен,
[00:28.800 --> 00:32.280]  то есть как подавать данные на ход эрнен
[00:32.280 --> 00:35.680]  и получать с него цвету. Затем обсудим в акворт пасс,

а вот turbo

[00:00.000 --> 00:11.680]  Всем привет! На этом занятии мы познакомимся с особым видом нейросетей, которые используются для
[00:11.680 --> 00:17.000]  данных, представленных в виде последовательности, в том числе и для текстов и аудио. Это рекуррентная
[00:17.000 --> 00:24.000]  нейронная сеть. План занятия такой. Сначала мы проговорим общую идею рекуррентного слоя и
[00:24.000 --> 00:31.140]  устройства рекуррентной нейронной сети. Затем обсудим forward pass RNN, то есть как подавать данные на
[00:31.140 --> 00:37.320]  вход RNN и получать за него ответ. Затем обсудим backward pass,

Оно еще и распознает вставки на английском языке. Неожиданно.

Круто! Спасибо за наводку на whisper!

praseodim ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)