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 тижні.







