
Транскрибировать всю мою жизнь
TLDR: speech2md позволяет хорошо транскрибировать речь на смеси языков и разделять её на дикторов на NVIDIA GPU с 16Gb памяти. Я встроил его в автоматический сценарий, так что записи с телефона автоматически конвертируются в текстовые заметки.
Распознавание речи вообще не новая штуковина, существовала давно-давно. Более того, на каждом телефоне есть голосовой ввод на клавиатуре. И он даже работает хорошо. Но есть моменты.
Во-первых, что касается меня, я часто мешаю языки в речи. Я могу говорить по-русски, добавлять кучу англоязычных терминов, потом вставить парочку чешских слов, дальше продолжить на русском или английском.
И вот с таким маленькие модели, которые установлены на телефонах, уже справляются не очень. Нужны модели побольше. Я использую слово “модель”, потому что сейчас практически все распознавание речи делается специальными большими языковыми моделями (LLM) со специальным энкодером для речи.
К счастью,
большие модели есть и доступны в том числе в облаке через API. Да и не то чтобы они очень дорогие. Например, gpt4o-transcribe стоит меньше доллара за час речи при отличном качестве распознавания на смеси языков. Для важных встреч и коротких заметок вполне подходит (хотя и тут есть моменты).
Но, что если задаться целью записывать все, что я говорю, а потом это распознавать и потихоньку собирать данные для построения модели самого себя?
Отмечу сразу этический вопрос. Чаще всего я говорю не сам с собой, а с кем-то. И у собеседника всегда нужно спрашивать разрешение на запись.
Но даже если я буду бубнить свои идеи и размышления просто гуляя по комнате, то наберется довольно много аудио. Вообще мне нравится такой формат работы с мыслью, когда есть только я, диктофон и воображение. Летом можно заменить комнату на парк рядом с домом. А в рабочее время гулять между клумб у офиса.
Дальше с этими файлами нужно что-то делать. Конечно, их дешево хранить как аудиозаписи, но в формате текста с ними гораздо проще работать. Но если их набирается несколько часов за неделю, то это не так уж и дёшево. Плюс упомянутый выше gpt4o-transcribe не умеет генерировать тайм коды для каждого слова (alignment) и не умеет вычленять разных говорящих людей (diarization). Поэтому я давно подумывал о своем решении, которое бы умело все, сразу и хорошо, а заодно я бы мог запускать его на своем железе. У меня как раз есть компьютер с Nvidia RTX 3090, который почти всегда включен.
На прошлых выходных я в очередной раз посмотрел, какие есть модели для распознавания речи, и после нескольких экспериментов остановился на Qwen3 ASR 1.7B. Это довольно новый релиз от Alibaba, который, вероятно, лучше всего на планете распознает диалекты китайского. Но ладно, она поддерживает больше сотни языков и с европейскими работает тоже на уровне. Максимальная длина файла - до 20 минут. Есть в двух вариантах на 600 миллионов параметров (примерно 2Gb в оперативной памяти) и 1,7 миллиарда (в 4-5 гигабайт должна влезть). Хороший размер для MacBookа или игровой видеокарты. Они даже сделали библиотеку для python-а, чтобы запускать ее можно быстро и удобно. Класс, хотя, по какой-то причине эта библиотека требует довольно старые версии зависимостей. И не работает с последними релизами python-а. Зато на моем компьютере это позволяет распознавать речь примерно в 200 раз быстрее реального времени. И час речи можно распознать секунд за 15-20.
Чтобы распознавать файлы длиннее чем 20 минут, я сперва нахожу моменты тишины в оригинальном аудио и разбиваю на кусочки по моментам тишины так, чтобы длина каждого кусочка была 15-20 минут. Чем длиннее кусочек, тем лучше модель поддерживает консистентность. Поэтому стоит стараться держать их ближе к верхней границе. И предположение о том, что на 5 минут речи найдется момент тишины, тоже верно. Для поиска тишины я использую ffmpeg.
Сама модель на выходе дает лишь текст, не уточняя, в какой момент аудио оно было сказано. К счастью, для этой задачи есть еще одна модель: Qwen3 ForcedAligner 0.6B. Она работает всего с 11 языками, но позволяет разметить, в какой момент было сказано каждое слово. Правда, поддерживает максимум 5 минут речи за раз. Точные временные метки слов нужны для субтитров и на следующем этапе, если у нас много людей и мы хотим понять, кто и что сказал. Пакет pyannote, пожалуй, самое популярное решение для этой задачи.
Теперь для записанных аудио встреч у меня есть markdown файлы формата:
## SPEAKER-01
What was that?
## SPEAKER-00
Да нет, ничего, все в порядке.
Оно иногда ошибается и может выдумать пару слов или приписать последнее сказанное одним человеком другому, но в целом я очень доволен результатом.
Все эти инструменты я завернул в одно приложение для командной строки speech2md. В своей текущей форме оно работает только на Linux и только с картами Nvidia, но не должно быть проблемой поддержать и macOS с новыми Apple Silicon чипами.
Конечно я не писал весь код руками (в отличие от этой статьи) и активно использовал ИИ агентов, но все равно я чувствую, что научился новому прикладному навыку и добавил инструмент в свою копилку.
Еще я сделал автоматизацию на телефоне через Tasker. Как только я записываю аудио на своем телефоне, оно через приложение Folder Sync отправляется на мой домашний NAS, который через Syncthing синхронизирует его с десктопом, а там другая автоматизация, которая следит за новыми аудиофайлами, распознает их и помещает готовые транскрипты в мой Obsidian. Цепочка длинная, но работает гладко. И до появления файла в моём хранилище обычно проходит меньше минуты.
Теперь нужно настроить еще и автоматическую экстракцию знаний из этих заметок и организовать все в LLM WIKI?
Или придумать более сложный сценарий. Например, наговаривать все свои мысли во время ревью кода, параллельно записывая, какое изменение я сейчас читаю. Дальше можно при помощи LLM выбросить все ругательства и автоматически опубликовать лишь дельные комментарии. Но это проект уже на другие выходные.