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)

Жаль, что не могу добавить ссылку в старый топик - он уже в архиве

теперь скачиваем whl пакеты. Т.к. они очень большие. Чтобы в следующий раз не качать

цифры в МиБ:

(whisper) router@europe:venv$ du -smx distribs/ whisper/
2762    distribs/
5236    whisper/

и размеры языковых моделей:

(whisper) router@europe:venv$ ls -lh ~/.cache/whisper/
total 1,6G
-rw-r--r-- 1 router router 1,6G окт  1 15:05 large-v3-turbo.pt
-rw-r--r-- 1 router router  73M окт  1 14:52 tiny.en.pt
router ★★★★★
() автор топика
Последнее исправление: router (всего исправлений: 2)

Текст в обоих случаях распознался одинаково, можно не насиловать видюху самой тяжелой моделью, а взять самую простую

Ненай, у меня простая артефачит сильно. Перегонял 30-40 минутные лекции на ноуте (интел, встройка) - по скорости приемлемо распознало. Минут 15-20, ЕМНИП - то есть в любом случае быстрее чем слушать и выписывать :)

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

У меня дело не во времени - инглиш на слух не очень. Технические термины, которые часто читаю - норм. А общая лексика, когда докладчик украшает речь, делает меня грустным пандой

router ★★★★★
() автор топика

что в новостях проскакивал RTranslator 2.0.0 и 2.0.1

И whisper.cpp 1.6.0 от того же автора. :)

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

когда докладчик украшает речь

Обучение с фразеологическим словарём полезно не только для человеков, но и для нейросеток.

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

У меня дело не во времени - инглиш на слух не очень. Технические термины, которые часто читаю - норм. А общая лексика, когда докладчик украшает речь, делает меня грустным пандой

Так ты сразу и переводи, и попроси еще на абзацы разбить и выделить ключевые слова жирным

google gemini бесплатный ключ дает до 1500 запросов в день и до 1млн токенов в минуту, это практически безлимит. и он распознает голосовые не хуже виспера, и мощный комп не нужен

https://kunsun-imgs.dns.army/i/3fd51131-f282-412e-8220-b7cc311361b2.jpg

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

Может вопрос глупый и не в кассу, но это можно только для распознавания из аудио приспособить или есть шансы распознавать фразы на ходу и накрутить управление компом на основе этого?

Интересен был бы вариант Распознать речь -> Привести в какой-то токенизированный вид(возможно с помощью другой сетки) -> По ключевым токенам выполнить команду. Такое вообще реально на данном этапе развития сделать? Я имею ввиду сделать конечно без облаков и всяких облачных ассистентов.

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

Распознать речь… выполнить команду.

Попробуй, произнеся с одинаковыми паузами фразу «казнить нельзя помиловать», выполнить эту команду :)

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

Технически сделать голосовой запрос скачать тебе последнюю серию Властелина колец (без рекламы 3 топора) с торентов по голосовому запросу сейчас не проблема (без облаков). И при необходимости конвертнуть в твоё разрешение экрана. Другой вопрос, что никто это не делает.

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

Меня скорее интересуют варианты «выключи компьютер через 5 минут», «поиск в гугле по следующей фразе ...», «написать новое письмо», «запустить стим\рабочий рдп\подключится к рабочему впн».

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

Не проблема, только для запуска LLM локально нужна будет минимум rtx 3090 24 GB. Плюс написать склейку между операционкой и LLM для передачи/мапинга голосовых команд на скрипты, потому что современные ОС так и остались по уровню развития на уровне 80-х годов.

Хотя LLM может сама скрипты генерить и думаю на простых командах галлюцинаций быть не должно. Тогда нужно будет просто запускать то, что тебе LLM-ка выдала. Плюс потребуется от 4-х rtx 3090 24 GB, если у тебя более сложные команды пойдут на генерацию скриптов.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 4)
Ответ на: комментарий от Xintrea

Было про управление компом. Там можно распознать голосовой ввод и выполнить скрипт. А откуда взялся андроид?

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

Это copilot в винде умеет, но пока он очень слаб, но каждые пару недель они докидывают новых команд для него. В android, ios, mac os это обещают, но всё еще где-то в будущем.

Чтобы на линуксе локально так делать вроде не всплывало серьезных проектов т.к. под каждый DE придется пилить свои привязки пока ИИ не станет достаточно умным чтобы сам прокликать на экране. Другой вариант: просить на python коде сделать что нужно и запускать его сразу.

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

Последняя LLAMA картинки может распознавать, а значит и UI виджеты скорее всего распознает. Софт для кликанья по экрану давно существует, в том числе и API к нему. Скрипты на питоне можно заранее через большие LLM модели нагенерить и привязать к командам. Так что технически всё готово, нужно просто склеить, банальная рутина.

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

т.к. под каждый DE придется пилить свои привязки

DE тут всё же боком, в линуксе большую часть(если не всё) можно сделать из cli. Т.е. на команды-токены нужно просто дать возможность вешать cli-команды. Выключить компьютер systemctrl poweroff, перезагрузка reboot. Включить VPN nm-cli ...

Вопрос в удобном способе настройки этого, пусть даже в конфигурационном файле, хотя лучше бы через гуй.

HomeAssistant предложенный выше, придется неслабо так программировать для получения чего-то похожего.

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

Да, но пока то что я вижу по reddit это что люди подобное на коленке пилят под свои задачи, придется на python написать код для такого или склеить из кучи hello world с гитхаба.

Ну и галлюцинации никто не отменял, pixtral часто отвечает неверно по деталям изображения, llama с зрением большая не влазит в 4090, а у маленькой те же проблемы, даже после склейки огромная вероятность что жать будет не туда, а в контекст не будет влазить даже 3 скриншота экрана.

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

Это средняя модель, а большу позже выпустят. Получается x5 rtx 3090 24 GB или 2500 USD… Кстати, а не в курсе сильно падает производительность, если этот кластер из GPU посадить на PCIe 1x слоты? У меня от майнинга остались райзеры и материнка на 12 слотов PCIe 1x, вот и думаю как оно там заработает.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от Loki13

Можно, только всё равно оно ошибается иногда, так что пока печатать и быстрее и надёжнее. Тем более я уже работал говорящей головой - голос быстро срывается когда ты по 8 часов в день говоришь и постоянные ларингиты когда простужаешься. Печатать по 8 часов в день быстрее и менее напряжно.

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

Хз, я целый день на работе [s]ору[/s] говорю командирским голосом, чтобы всем было слышно на складе. Как-то привык, дело тренировки.

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

Глупости пишешь. Чтоб такие простые команды распознавало с приемлемым качеством (если у тебя конечно фоном не воют сирены и не играет музыка, а ты сам при этом не говоришь при помощи синтезатора речи) хватает сраного квантованного виспера который работает на 1660 видяхе с 6 гигами видеопамяти.

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

Там проблема что когда у тебя 1 склейка даёт 1 % ошибок, то 10 последовательных склеек дадут уже не 1% ошибок а на выходе будет каша. Ошибки мало того что копятся, так ещё и быстро наступает критический момент когда качество входных данных делается плохим и ошибка от плохих данных уже не 1% а все 10%. Да это можно технически сделать, но работы там довольно много а у конечных юзеров железа нужного мало.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от foror

Э, тут всё хуже. Иначе на сраных офисных пекичах давно бы кластеры по 100 гигов видеопамяти развернули в условных школах/вузах/офисах. Там нужна именно 1 видяшка на 80 гигов памяти, которая стоит около 2-3 лямов деревянных.

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

Попробуй лекции читать. Когда ты орёшь там перерывы между оранием. Рявкнул и отдыхаешь минуту-две. А когда ты диктор/занимаешься озвучкой/лектор то говорить надо и правильным тоном, и с нужными интонациями и без отдыха.

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

Не нужно именно 80 GB на одной карте, всё это из коробки распределяется на несколько GPU и работает с хорошей скоростью. Причем слои нейронки можно распределить по GPU разными способами: горизонтально или вертикально. Вертикально это как раз на случай, если у тебя пропускная шина узкая. Но я читал на реддите и так не понял будет на x1 нормально работать LLAMA или нет.

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

хватает сраного квантованного виспера

Так эти команды затем нужно обработать правильно. Я уже не говорю о генерации новых скриптов в реальном времени, под новые команды. У минимальной нейронки не хватит на это мозгов.

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

Рявкнул и отдыхаешь минуту-две

Так и команды нейронке в таком же темпе нужно отдавать. Лекции ей читать не надо.

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

Кстати, а не в курсе сильно падает производительность, если этот кластер из GPU посадить на PCIe 1x слоты?

Не в курсе, я пока не решаюсь под ИИ что-то собрать серьезное отдельно и гоняю на 4090 с планами обновить потом до 5090.

Да и тяжело оправдать вложения большие когда mistral бесплатно миллиард токенов дает в месяц, гугл миллион в минуту кажется и прочие сервисы с подписками уровня $20 за месяц безлимита.

WSL_user
()
Ответ на: комментарий от peregrine

Можно, только всё равно оно ошибается иногда, так что пока печатать и быстрее и надёжнее.

Когда ты сидишь перед клавиатурой - без вопросов. А попробуй попечатать лежа на кровати в 2 метрах от компьютера. А иногда так и хочется не вставая с кровати скомандовать sudo poweroff(это просто пример, вариантов может быть масса).

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13

Я бы в CAD голосом детали проектировал, а то задолбаешься мышкой кликать. Потом ещё туннельный синдром в указательном пальце получить.

Прямоугольник со сторонами 30 мм на 50 мм. А, нет исправь 50 на 60. Сделай extrude на 20 мм. Выбор плоскости, следующая, следующая. Новая поверхность, круг в центре, операция удаления. И т.д.

Было бы круто.

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

чем распределять то? Хадуп тяжелый требует тяжелую голову.

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

Новая поверхность, круг в центре, операция удаления.

ИИ не может распознавать без обращения к локальному контексту на каждом шаге.

а то задолбаешься мышкой кликать

А так задолбаешься языком уточнять постоянно изменяющийся контекст :)

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

ИИ не может распознавать без обращения к локальному контексту на каждом шаге.

А мне не надо распознавать, мне надо, чтобы CAD предоставило API, к которому я привяжу команды для создания и редактирования детали. Наверное во FreeCAD что-то такое можно на питон-скриптах мутануть.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от quickquest

А так задолбаешься языком уточнять постоянно изменяющийся контекст :)

Ну, когда меня настигал туннельный-синдром, я менял указательный палец, на средний при клацании мышкой. По итогу указательный восстанавливался, пока я использовал ресурс среднего. А тут получается, если и у среднего ресурс выйдет, можно на язык переключить «клацание».

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

А мне не надо распознавать

Ага, потому, что текущий контекст у тебя в голове, а у ИИ головы нету. Оно не понимает команду «круг в центре». В центре чертежа, или узла, или детали, или … ?
Изменить текущий фокус редактирования мышкой проще и быстрее, чем глаголить языком, какой элемент чертежа ты имел ввиду.

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

Или активной плоскости. Это как горячие клавиши, только продвинутее. Допустим криволинейные штуки на этом не сделаешь, а вот сказать отверстия по центру на трубах с отступами под болт m8, даже быстрее будешь делать. А если ещё именование узлам сделать, то можно и сборку детали на этом же принципе делать.

Можно серьёзно упростить UI, если это из коробки встраивать в тот же CAD. Зачем мне там 100500 кликов по форме для тестирования нагрузки? Просто говоришь сделай мне нагрузку 5 тонн, на поверхность FooBar при стандартной гравитации и погнали.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от quickquest

Окна удобнее переключать. Сразу говоришь, какая тебе деталь нужна и окно открывается, а не пытаешься мышкой найти нужное окно в куче вкладок. Не тянешься к клавиатуре, чтобы шорткат нужные нажать и затем имя набирать.

foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)

update.

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

Да, можно и напрямую видеофайлы подбросить

Текст в обоих случаях распознался одинаково, можно не насиловать видюху самой тяжелой моделью, а взять самую простую

С русским существенно хуже, даже в модели turbo. Местами даже пропуски. Вот, начала вообще нет:

[00:00.000 --> 00:02.000]  Чувырла
[00:30.000 --> 00:32.000]  Ну что же делать, все привыкли
[00:32.000 --> 00:34.000]  В общем, городочек у нас
[00:34.000 --> 00:35.000]  можно сказать симпатичный
[00:35.000 --> 00:37.000]  И мы привыкли думать, что старый
[00:37.000 --> 00:38.000]  Но арабам и евреям смешно
[00:41.000 --> 00:43.000]  У них там по несколько тысяч лет города
[00:44.000 --> 00:46.000]  У нас в городе живут три вида людей
[00:46.000 --> 00:48.000]  Это бандюки
[00:52.000 --> 00:54.000]  Алкоголики
[00:54.000 --> 00:56.000]  Сюся, мне неплохо
[00:56.000 --> 00:58.000]  Мне тоже
[00:58.000 --> 01:01.900]  Идиоты, к которым мы, собственно, и относимся
[01:01.900 --> 01:07.320]  Говорят, даже однажды в нашем городе видели нормального человека
[01:07.320 --> 01:11.060]  Но вёл он себя как-то странно и провёл в городе всего 10 минут
[01:11.060 --> 01:17.200]  Вот в этом замечательном городе и живёт наша тоталитарная хекта
[01:17.200 --> 01:18.460]  Ой, да мне не нравится
[01:18.460 --> 01:21.080]  Ну хорошо, хорошо, тогда наша тайная ложа
[01:21.080 --> 01:26.640]  Этого идиота зовут Выпендрёжник, ну и выражается он соответственно
[01:26.640 --> 01:30.740]  А это вот топает Лапкин, девица вздорная и замысловатая
[01:30.740 --> 01:32.660]  Из-за неё только вообще-то всё и началось
[01:32.660 --> 01:37.120]  Надо же, город усеян дохлыми зайцами
[01:37.120 --> 01:41.520]  Что ли вылечить эту заразу и воспитать?
[01:42.840 --> 01:46.700]  Вот так оно и бывает, история пишется дохлыми зайцами
[01:46.700 --> 01:53.600]  Потом, эта ужата скотина оказалась мало того, что говорящей
[01:53.600 --> 01:57.160]  Всё, не могу больше молчать
[01:57.160 --> 02:02.260]  Я разумное существо, не могу срать под себя и питаться травой
[02:02.260 --> 02:05.880]  Мясо, мясо, мясо, мясо
[02:05.880 --> 02:10.500]  Но я весьма обжорливым существом, хрен знает с какой планеты
[02:10.500 --> 02:15.620]  Меня зовут Бо, у меня тарелка в кустах под Выборгом
[02:15.620 --> 02:18.000]  С тех пор заяц Бо поселился у Лапкина

а это особенно повеселило:

Сюся, мне неплохо

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

Забавный момент, оно ловит голос, не слышный человеку при текущей громкости

В том же Магазинчике Бо:

[04:48.440 --> 04:55.120]  Мы сидели и курили
[04:55.120 --> 04:58.060]  Начинался новый день
[04:58.060 --> 05:03.340]  Субтитры сделал DimaTorzok
[05:03.340 --> 05:06.400]  Субтитры сделал DimaTorzok

Последние 2 фразы человеческое ухо вообще не слышит

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

Вот, начала вообще нет:

А хотя… Больше похоже на баг. Если язык не английский, то первые 30 секунд (автоопределение языка) пропадают из результата

router ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.