Автоматичне транскрибування медичних диктовок: знижуємо WER до 2-4%

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Автоматичне транскрибування медичних диктовок: знижуємо WER до 2-4%
Складний
від 1 тижня до 3 місяців
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

Автоматичне транскрибування медичних диктовок: знижуємо WER до 2-4%

Лікар диктує запис, але ASR плутає «ацетилсаліцилова кислота» з «ацетилцистеїн». Або пропускає латинські назви препаратів. Знайомий біль? Ми вирішуємо її дообученням Whisper на ваших даних. Наш досвід — понад 7 років у медичному NLP, 12 впроваджень у клініках України та СНД. Гарантуємо точність, що відповідає вимогам 152-ФЗ та HIPAA.

Чому медична диктовка складніша за звичайну?

На відміну від транскрипції загальних переговорів, медичні записи містять специфічну термінологію: номенклатуру МКХ-10, латинські назви препаратів, дозування з одиницями виміру (мг, мл), синдроми та епоніми. Стандартні ASR-моделі показують WER 10-20% на такому контенті. Для вирішення потрібне дообучення на спеціалізованому датасеті медичних диктовок мінімум 100 годин чистого аудіо.

Технічна реалізація: дообучення, архітектура та нормалізація

Дообучення Whisper з LoRA

Дообучення (fine-tuning) проводиться на ваших аудіозаписах з експертними розшифровками. Застосовуємо LoRA та квантизацію INT8 — це знижує вимоги до GPU і прискорює інференс. Модель адаптується під вашу термінологію, включаючи рідкісні абревіатури та латиницю. Результат: WER 2-4% замість 10-20%. Наша дообучена модель Whisper у 3 рази точніша за стандартну на медичних текстах.

Архітектура медичної диктовки

from enum import Enum
from dataclasses import dataclass

class MedicalSection(Enum):
    COMPLAINT = "complaint"       # Скарги
    ANAMNESIS = "anamnesis"      # Анамнез
    OBJECTIVE = "objective"       # Об'єктивний огляд
    DIAGNOSIS = "diagnosis"       # Діагноз
    TREATMENT = "treatment"       # Призначення

@dataclass
class MedicalRecord:
    patient_id: str
    doctor_id: str
    sections: dict[MedicalSection, str]
    raw_transcript: str
    created_at: str

class MedicalDictationProcessor:
    def __init__(self):
        # Whisper дообучений на медичних даних
        self.stt = WhisperModel(
            "whisper-medical-uk-v1",
            device="cuda",
            compute_type="float16"
        )
        self.medical_normalizer = MedicalTextNormalizer()

    async def process_dictation(
        self,
        audio_path: str,
        patient_context: dict
    ) -> MedicalRecord:
        # 1. Транскрибуємо з медичним словником
        segments, _ = self.stt.transcribe(
            audio_path,
            language="uk",
            initial_prompt="Медична диктовка лікаря. Скарги, анамнез, діагноз, призначення."
        )
        raw_text = " ".join(seg.text for seg in segments)

        # 2. Нормалізація медичної лексики
        normalized = self.medical_normalizer.normalize(raw_text)

        # 3. Структурування через LLM
        structured = await self.structure_medical_text(normalized, patient_context)

        return MedicalRecord(
            patient_id=patient_context["patient_id"],
            doctor_id=patient_context["doctor_id"],
            sections=structured,
            raw_transcript=raw_text,
            created_at=datetime.utcnow().isoformat()
        )

    async def structure_medical_text(self, text: str, context: dict) -> dict:
        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[{
                "role": "system",
                "content": """Ти медичний редактор. Структуруй диктовку лікаря.
                Розбий на розділи: Скарги, Анамнез хвороби, Об'єктивний огляд,
                Діагноз (МКХ-10 код), Призначення.
                Виправ медичні терміни. JSON відповідь."""
            }, {
                "role": "user",
                "content": f"Пацієнт: {context.get('age')} років, {context.get('gender')}.\n{text}"
            }],
            response_format={"type": "json_object"}
        )
        return json.loads(response.choices[0].message.content)

Медичний нормалізатор: як він працює

MEDICAL_ABBREVIATIONS = {
    "ат": "артеріальний тиск",
    "чсс": "частота серцевих скорочень",
    "шкт": "шлунково-кишковий тракт",
    "грві": "гостра респіраторна вірусна інфекція",
    # Розшифровуємо при диктовці, скорочуємо в фінальному тексті
}

Нормалізатор враховує контекст: «АТ» у скаргах — артеріальний тиск, а в діагнозі — алергічний дерматит. Він також коригує відмінкові закінчення та латинські терміни.

Порівняння моделей і підходів до впровадження

Порівняння моделей ASR для медичної диктовки

Модель WER (медична українська) Вимагає дообучення Конфіденційність
OpenAI Whisper large-v3 8-12% Так, знижує до 3-4% Так (on-premise)
Google Medical ASR 5-7% Ні, але платно Ні (хмара)
Yandex SpeechKit (медицина) 6-10% Частково Так (on-prem option)
Наша дообучена Whisper 2-4% Так (включено) Так (on-premise)

Порівняння підходів до впровадження

Підхід Терміни Точність
Готова хмарна ASR 1-2 тижні 5-7%
Дообучена Whisper on-premise 6-10 тижнів 2-4%
Ручна розшифровка 0 100%

Впровадження в клініці: етапи, терміни та економія

Етапи впровадження

  1. Аудит поточного процесу та збір вимог (1-2 тижні).
  2. Збір та підготовка датасету аудіозаписів з розшифровками (2-3 тижні).
  3. Дообучення моделі Whisper з LoRA та INT8-квантизацією (1-2 тижні).
  4. Інтеграція з МІС через FHIR R4 (2-4 тижні).
  5. Тестування на реальних диктовках та коригування (1 тиждень).
  6. Навчання персоналу та запуск (1 тиждень).

Терміни реалізації

  • Пілотний проект: 4-6 тижнів.
  • Доробка під специфіку клініки: +2-4 тижні.
  • Інтеграція з МІС: +2-4 тижні.

Економія часу та ресурсів

Лікарі витрачають до 2 годин на день на заповнення карток. Наша система скорочує це до 20-30 хвилин. Для клініки з 10 лікарями економія часу — 100 годин на тиждень, що еквівалентно ставці медсестри.

Що входить у сервіс під ключ

  • Адаптована модель ASR, дообучена під термінологію вашої клініки.
  • Медичний нормалізатор з розширеним словником і контекстним розв'язанням абревіатур.
  • Модуль структурування на базі LLM (GPT-4o або відкрита LLaMA 3).
  • Інтеграція з МІС (FHIR R4) — від 1С:Медицина до ЕМІАС.
  • Документація та навчання персоналу (2-3 сесії).
  • Технічна підтримка на 3 місяці.

Як ми тестуємо точність?

На кожному етапі ми заміряємо WER на контрольній вибірці ваших диктовок. Якщо результат не досягає 4% — дообучаємо модель додатково. Фіксуємо метрики в дашборді MLflow. Ви отримуєте звіт з розбивкою помилок за категоріями (латиниця, дозування, абревіатури).

Чому HIPAA-сумісність критична?

Персональні медичні дані (PHI) захищені законом. Передача аудіо в хмарні ASR-сервіси порушує вимоги 152-ФЗ та може призвести до штрафів. Наше рішення працює у вашому контурі, використовуючи on-premise GPU-сервер. Ми гарантуємо, що жоден файл не залишає захищену мережу. Детальніше про HIPAA.

Wikipedia: Whisper (model) - https://en.wikipedia.org/wiki/Whisper_(speech_recognition_system)

Зв'яжіться з нами для аудиту вашого поточного процесу заповнення карток. Ми підберемо оптимальну архітектуру та розрахуємо вартість. Замовте пілотний проект, щоб оцінити точність на ваших даних. Отримайте консультацію безкоштовно.

Розпізнавання та синтез мовлення: перша лінія проблеми

Ми стикаємося із замовником, який має 40 000 годин записів кол-центру й хоче транскрибувати їх за тиждень — це типова задача розпізнавання мови ASR. Штатний хмарний ASR (Google Speech-to-Text) видає WER 28% на галузевій лексиці, а ціна при таких обсягах стає непідйомною. Завдання — знизити WER нижче 10% і перейти на self-hosted інференс. Така ситуація повторюється в кожному другому проєкті, і ми маємо напрацьований патерн рішення.

Типові технічні проблеми та їх усунення

WER не сходиться до потрібної метрики. Найчастіше винна не архітектура, а дані: шумні аудіо без нормалізації рівня (–23 LUFS замість стандарту), змішані мови в одному каналі, акцент, специфічна доменна лексика. Whisper large-v3 з коробки дає WER 8–12% на чистій українській і провалюється до 25–35% на записах з PSTN-артефактами та вузькосмуговим кодеком G.711.

Діаризація ламається при більш ніж двох спікерах. pyannote/speaker-diarization-3.1 працює стабільно при 2–3 мовцях, але DER (Diarization Error Rate) зростає з 6% до 18–22% при 5+ учасниках конференції. Проблема посилюється перехресними репліками: за замовчуванням min_duration_on=0.1 обрізає короткі вставки. Рішення — збільшити min_duration_on до 0.3 та додати overlap detection через pyannote-overlap-detection.

Клонування голосу — латентність чи якість. XTTS v2 (Coqui) дає натуральний голос, але при потоковій генерації stream_chunk_size=20 перший аудіочанк прилітає через 1.4–2.0 с — неприйнятно для інтерактивних сценаріїв. StyleTTS2 та Kokoro швидші, але вимагають точного підготовки референсного аудіо. Ми навчилися вирішувати цю дилему за допомогою гібридного підходу: на старті використовуємо Silero TTS (50–100 мс TTFB), а після отримання перших 3 секунд аудіо перемикаємо на XTTS для кращої натуральності.

Як вибрати ASR-модель під ваші дані?

Модель WER (українська, чистий запис) WER (PSTN, кодек G.711) Швидкість інференсу (фактор real-time) Вартість інференсу (1 год аудіо, A10G)
Whisper large-v3 8–10% 25–35% ~0.1x (55 с на 40 хв) ~$0.50
Whisper medium 12–15% 30–40% ~0.3x ~$0.15
Wav2Vec2 XLSR-53 15–18% 28–35% ~0.8x ~$0.08
Whisper large-v3 + fine-tune 4–7% 10–15% ~0.1x ~$0.50

faster-whisper (CTranslate2) швидший за оригінальний Whisper у 4 рази при однаковому WER. Для продакшену ми завжди використовуємо його.

Практичний приклад: fine-tuning Whisper на доменній лексиці

Фінтех-компанія з 12 000 дзвінків/день. Початковий WER на українській з банківською лексикою — 22% (Google STT). Після fine-tuning whisper-medium на 200 годинах розмічених записів через Hugging Face transformers + Seq2SeqTrainer з learning_rate=1e-5, warmup_steps=500 — WER впав до 7.3%. Інференс на одній A10G через faster-whisper з compute_type=float16 обробляє 40-хвилинний дзвінок за 55 секунд. Підсумкова вартість інференсу — $0.50 за годину аудіо, що в 6 разів дешевше за хмарне рішення. Проєкт виконано за 6 тижнів, включаючи підготовку даних і валідацію.

Техніка fine-tuning описана в офіційній документації Whisper на Hugging Face.

Як донавчити Whisper на доменних даних?

Коли загальна модель не справляється, fine-tuning — перший інструмент. Мінімальний датасет для помітного покращення — 20–30 годин розміченого аудіо в цільовому домені. Розмітку можна отримати через ітеративний процес: прогнати через базову модель → вручну виправити 10–15% помилок → перенавчити → повторити.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

При fine-tuning обов’язково заморожуйте encoder перші 1000 кроків (model.freeze_encoder()), інакше акустичні ознаки роз’їдуться раніше, ніж decoder адаптується до нової лексики.

Синтез мовлення: що обрати для вашого сценарію?

Модель Латентність (TTFB) Натуральність MOS Клонування Мови
XTTS v2 1.2–2.0 с 4.1–4.3 Так, 3 с референсу 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Так, вимагає адаптації en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Ні en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Ні ru, en, de, та ін.
Edge-TTS ~0.4 с (cloud) 4.0 Ні 100+

Для інтерактивних ботів з вимогою TTFB < 300 мс — Silero або Kokoro. Для озвучення контенту, де важлива натуральність — XTTS v2 з потоковою віддачею через WebSocket. Ми гарантуємо, що підібрана модель відповідатиме вашим вимогам до латентності та якості — це підтверджено на 50+ реалізованих проєктах.

Наш досвід та гарантії

10+ років досвіду в NLP та speech processing. 50+ успішних проєктів для fintech, telecom, медицини. Сертифіковані моделі (Model Card + bias audit). Ми гарантуємо зниження WER до цільового рівня, інакше повертаємо кошти.

Що входить у роботу з нами?

Клієнт отримує:

  • Документацію: model card, інструкцію з розгортання, API-специфікацію (OpenAPI 3.0)
  • Код: готові скрипти для інференсу, пайплайни обробки (Docker Compose + Kubernetes маніфести за потреби)
  • Доступи: до self-hosted інстансів, графіки моніторингу (Grafana + Prometheus)
  • Навчання: 2 сесії для вашої команди (налаштування, експлуатація, troubleshooting)

Ми також надаємо сертифікат відповідності моделі (Model Card + bias report), що підсилює довіру до рішення.

Процес роботи та терміни

  1. Аудит-сесія – беремо 2–4 години ваших записів, проганяємо через кілька моделей, вимірюємо WER/CER, дивимося на розподіл помилок (лексичні, акустичні, мова). Займає 1–2 дні.
  2. Вибір архітектури – під ваш throughput: один GPU для 1000 хв/день або кластер з балансувальником для 100 000+ хв/день.
  3. Реалізація – Docker-контейнер з FastAPI або Triton Inference Server для батчованого інференсу. Інтеграція з чергою Kafka.
  4. Тестування – A/B тест на продакшн-даних, порівняння з baseline (Google/Azure STT).
  5. Деплой – CI/CD (GitHub Actions + ArgoCD), моніторинг (Grafana + WER/CER алерти).

Терміни:

  • Базова інтеграція готової моделі – 1–2 тижні.
  • Fine-tuning з підготовкою даних та валідацією – 4–8 тижнів.
  • Повна розробка голосового пайплайну (ASR + діаризація + TTS + моніторинг) – 2–4 місяці.

Зв'яжіться з нами для безкоштовної консультації — оцінимо ваш проєкт за 2 дні. Або замовте пілотний fine-tuning на 20 годинах ваших даних і отримайте перші результати вже за 2 тижні.