← Все проекты

Android · офлайн-распознавание речи

Помощник психолога

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

Kotlin sherpa-onnx GigaAM v3 Диаризация silero VAD DOCX без зависимостей

Отладочная сборка для Android

Версия 1.7 · 202 МБ · от 18.08.2026

Войти и скачать

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

Сборка отладочная и подписана отладочным ключом: Android спросит разрешение на установку из неизвестного источника. В магазины такая сборка не выкладывается.

Зачем это нужно

Психолог ведёт записи после приёма. Надиктовать быстрее, чем набрать, — но обычные диктофоны с расшифровкой отправляют запись на чужой сервер. Для разговора с клиентом это неприемлемо: содержание сессии не должно покидать телефон ни при каких условиях.

Приложение делает всю работу на устройстве: пишет речь, распознаёт русский, различает голоса собеседников и сохраняет готовый документ Word. Интернет ему не нужен ни на одном шаге.

Гарантия, которую можно проверить

Обещание «мы не передаём ваши данные» проверить нельзя — это слова. Здесь вместо слов свойство системы: у приложения нет разрешения выходить в сеть. В манифесте нет строки, без которой Android не пропустит наружу ни байта:

<uses-permission android:name="android.permission.INTERNET" />

Поэтому любая попытка что-то отправить отклоняется самой системой — не совестью разработчика. Проверяется за десять секунд: включите авиарежим, приложение продолжит работать целиком.

У пользователя спрашивают одно разрешение — микрофон. Ещё три приложение объявляет для себя: работать со свёрнутым экраном и показывать ход расшифровки в уведомлении. Часовая запись обрабатывается часами, и без этого система прервала бы работу на середине. Доступа к данным или к сети они не дают.

Как устроено

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

01

Кто где говорит

pyannote + голосовые отпечатки

Модель сегментации находит границы речи, вторая считает «подпись» голоса на каждом участке. Похожие подписи собираются в кластеры — по кластеру на человека. Число собеседников заранее не задаётся.

02

Что сказано

GigaAM v3, модель Сбера

Реплики каждого голоса распознаются подряд и подписываются: «Голос 1», «Голос 2». Модель ставит знаки препинания и заглавные сама — среди открытых русских моделей это умеет только она. Имён приложение не знает, их проставляет психолог перед сохранением.

Решения внутри

Не только своя запись

Можно открыть готовый файл — диктофонную запись, голосовое из мессенджера. Частота приводится к 16 кГц свёрткой с окном sinc, а не отбрасыванием отсчётов: иначе высокие частоты завернулись бы вниз призвуками и распознавание испортилось бы.

Word без единой библиотеки

Файл .docx — это ZIP с XML внутри. Он собирается вручную, поэтому в проекте нет ни Apache POI, ни его тридцати мегабайт зависимостей: только то, что нужно для валидного документа.

Одна модель вместо трёх подходов

Перебрали три: Whisper знаки ставил, но на русском ошибался; русский zipformer точнее, но в его словаре одни строчные буквы; GigaAM v3 от Сбера умеет и то, и другое — в словаре есть точка, запятая, тире и заглавные. Платой идёт размер: 215 МБ против 70.

Абзацы по паузам

Знаки препинания даёт модель, а границы абзацев — паузы: они и так известны из разбиения на реплики. Смена говорящего тоже начинает новый абзац.

Без живых субтитров

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

Границы решения

Локальная обработка стоит скорости — об этом честнее сказать до начала работы, чем после.

Расшифровка идёт дольше записи

Минута приёма обрабатывается несколько минут на среднем телефоне: считать приходится на процессоре телефона, без всякой помощи извне. Поэтому это отдельная кнопка с прогрессом, а не автоматика.

Приложение тяжёлое

Больше 200 МБ, из них 215 занимает сама модель распознавания. Это цена работы без интернета: обычные диктофоны столько не весят, потому что считают на чужом сервере.

Час приёма считается часами

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

Телефон греется

Обычное следствие вычислений на устройстве при длинной записи.

Что дальше
  • Модели отдельным файлом вместо хранения в сборке — приложение станет втрое легче, а гарантия приватности сохранится: файл принимается через системный выбор, без выхода в сеть.
  • Модель полегче как отдельная сборка: часть работы обходится и меньшей ценой, если запись обычно с одним говорящим.

Нужно похожее?

Опишите задачу в двух строках — отвечу в течение рабочего дня. Исходный код этого проекта и демо покажу по запросу.

Обсудить задачу Другие проекты