Реализация AI-транскрибации голосовых сообщений в мобильном приложении
Голосовые сообщения в мессенджерах — бич корпоративного общения. 3-минутный войс вместо двух строк текста. Транскрибация решает это: нажал кнопку — получил текст, можно прочитать без звука, скопировать, найти по поиску.
Захват аудио из голосового сообщения
На практике мобильное приложение работает с двумя сценариями:
Запись внутри приложения. Пользователь записывает прямо в вашем приложении — нативный захват, полный контроль над форматом.
Импорт внешнего файла. Получили WAV/MP3/OGG из мессенджера через share sheet. На iOS — UTType.audio в UIDocumentPickerViewController. На Android — ACTION_GET_CONTENT с "audio/*".
Формат файла имеет значение. OGG Opus (формат Telegram) Whisper понимает нативно. AMR (старые Android-мессенджеры) — нужна конвертация. На сервере ffmpeg решает конвертацию любого формата:
import subprocess
def convert_to_mp3(input_path: str, output_path: str) -> None:
subprocess.run([
"ffmpeg", "-i", input_path,
"-ar", "16000", # 16kHz достаточно для речи
"-ac", "1", # моно
"-b:a", "32k", # 32kbps для речи
output_path
], check=True)
16kHz моно MP3 32kbps — оптимум для Whisper: качество не падает, размер файла минимален.
Whisper API: детали интеграции
import openai
client = openai.OpenAI()
def transcribe_audio(file_path: str, language: str = "ru") -> dict:
with open(file_path, "rb") as f:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language=language, # явное указание языка улучшает качность
response_format="verbose_json", # включает таймстампы и сегменты
timestamp_granularities=["word"] # таймстамп для каждого слова
)
return transcript
verbose_json + timestamp_granularities=["word"] дают таймстамп на каждое слово. На мобильном это позволяет реализовать «читай и слушай»: нажатие на слово в транскрипте → переход к этому моменту в аудио.
Параметр language критичен для смешанных записей. Без явного языка Whisper тратит первые секунды на детекцию — добавляет latency. Если приложение знает язык пользователя — передавайте всегда.
Latency: реальные цифры и оптимизация
Whisper API: 10-секундное сообщение обрабатывается за 0.5–1.5 с. 1-минутное — 3–8 с. Это время обработки на серверах OpenAI + сеть. Для пользователя неплохо, если показывать прогресс.
Для более низкой latency:
Deepgram Nova-2 — real-time streaming транскрипция, latency < 300 мс на коротких фрагментах. Дороже Whisper, но быстрее.
Локальный Whisper (self-hosted). faster-whisper на GPU (RTX 3090) обрабатывает 1 минуту аудио за 2–4 секунды. На CPU — 15–30 секунд. Если данные нельзя отправлять в облако — единственный вариант.
Клиентская транскрипция на iOS. SFSpeechRecognizer — нативный Apple Speech framework, работает на устройстве (с iOS 16), бесплатный, не требует отправки данных. Но: поддерживает только ограниченный набор языков, качество ниже Whisper, лимит 1 минута на запрос.
// iOS — локальная транскрипция через SFSpeechRecognizer
let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru-RU"))
let request = SFSpeechURLRecognitionRequest(url: audioURL)
request.shouldReportPartialResults = true
recognizer?.recognitionTask(with: request) { result, error in
guard let result else { return }
DispatchQueue.main.async {
self.transcriptText = result.bestTranscription.formattedString
}
}
Для коротких личных заметок SFSpeechRecognizer — хороший вариант без серверных расходов. Для корпоративных записей совещаний — Whisper или Deepgram.
Отображение транскрипта на мобильном
Простая транскрипция — просто текст. Хорошая транскрипция на мобильном:
- Интерактивный текст с таймстампами: нажал слово → аудио прыгает к этому моменту
- Пунктуация (Whisper восстанавливает её хорошо, но не идеально — иногда нужна постобработка)
- Параграфы по паузам (Whisper сегментирует аудио — используем
segmentsдля разбивки) - Кнопка копирования всего текста
- Поиск по тексту транскрипта
Для мессенджер-функциональности: транскрипт появляется стримингово — не ждём полного завершения, а показываем по мере готовности сегментов.
Постобработка транскрипта
Whisper иногда вставляет [Музыка], [Аплодисменты] в нотации Whisper, транскрибирует фоновый шум. Фильтруем:
import re
def clean_transcript(text: str) -> str:
# Удаляем нотации Whisper типа [Музыка], [Noise]
text = re.sub(r'\[.*?\]', '', text)
# Убираем лишние пробелы
text = re.sub(r'\s+', ' ', text).strip()
return text
Для бизнес-сценариев полезна LLM-постобработка: исправление имён собственных, терминов, добавление пунктуации там, где Whisper ошибся.
Этапы и сроки
Реализация захвата аудио и импорта файлов → серверная транскрипция (Whisper/Deepgram) с прогрессом → форматирование и постобработка → мобильный UI с интерактивным транскриптом → опционально: стриминг и локальный SFSpeechRecognizer для iOS.
Базовая транскрипция через Whisper с простым текстовым отображением — 1–2 недели. Полноценный инструмент с интерактивным текстом, таймстампами и постобработкой — 3–4 недели.







