Высококачественная транскрипция зашумлённых двухканальных телефонных звонков
В одном из наших недавних проектов возникла необходимость транскрибировать телефонные звонки с крайне низким качеством звука. Аудиозаписи было трудно разобрать: речь часто прерывалась перекрывающимися голосами оператора и клиента. Кроме того, на стороне клиента часто присутствовали фоновый шум и посторонние звуки, улавливаемые микрофоном. Вдобавок к этому, речь часто содержала смесь языков и суржик.
В предыдущих проектах мы успешно использовали модель WhisperX
, которая показала достойные результаты при удовлетворительном качестве аудио. Однако в данном случае полученные транскрипции оказались слишком низкого качества и непригодными для использования.
С выходом модели GPT-4o-transcribe
мы решили оценить её возможности. В отличие от Whisper, эта модель принимает детализированные подсказки (prompts), что позволяет значительно улучшить качество транскрипции. Кроме того, GPT-4o-transcribe
можно инструктировать распознавать реплики Оператора и Клиента. К сожалению, из-за отсутствия полноценной диаризации модель часто путает, кто из участников говорит.
Клиент возлагал большие надежды на проект, но остался недоволен первым результатом. Он требовал точной транскрипции, но не был готов выделить время или бюджет на сбор обучающих данных, аннотирование аудио или дообучение Whisper. Единственным улучшением по сравнению с исходными записями было то, что аудиоканалы оператора и клиента записывались отдельно.
Первая попытка (неудачная)
Первым логичным шагом было транскрибировать каждый канал отдельно с помощью Whisper, а затем объединить транскрипции по временным меткам. Этот подход не сработал. Whisper сильно «галлюцинирует» во время длинных пауз и на коротких репликах из одного слова. Кроме того, возвращаемые временные метки часто включали не только речь, но и окружающие участки тишины. Попытка скорректировать эти метки с помощью фильтра тишины из ffmpeg
тоже не дала удовлетворительных результатов.
Гибридный подход
Мы пересмотрели наш подход. GPT-4o-transcribe
выдаёт качественный текст, но без временных меток. Whisper
, напротив, даёт временные метки, но при этом сильно теряет в точности. Внимательный человек, сравнивая оба результата, вполне может восстановить точную структуру речи.
Так мы пришли к следующему пайплайну:
Финальный алгоритм
Транскрибировать канал клиента с помощью
gpt-4o-transcribe-mini
. Затем определить язык речи с помощьюGPT-4o
. Язык оператора известен заранее.-
Транскрибировать оба канала с помощью
whisper-1
.- Установить температуру в
0.0
. - Использовать языковой prompt с несколькими типичными фразами.
- Результат — в формате VTT с временными метками.
- Установить температуру в
-
Транскрибировать оба канала с помощью
gpt-4o-transcribe
.- Установить температуру в
0.1
. - Использовать подробные prompts, адаптированные к содержанию каждого канала.
- Установить температуру в
Prompt для Оператора:
Ты эксперт в области аудиотранскрипции.
1. Предоставленный аудиофайл содержит только реплики оператора из телефонного разговора.
2. Оператор представляет компанию "XXXXXX", работающую под торговой маркой "YYYYYYY", веб-сайт "ZZZZZZZZ".
3. Оператор рекламирует услуги кредитования. Он описывает условия, процесс выдачи кредита, процентные ставки, комиссии и сборы.
4. Клиент может задавать вопросы, соглашаться с условиями, отказываться от них или просить больше не звонить.
5. Разговор может вестись на языке Language1, языке Language2 или быть их сочетанием. Сохраняйте оригинальный язык реплик.
6. Качество аудио низкое. Исправляйте галлюцинации и нерелевантный контент.
Предоставь полную транскрипцию.
Промпт для Клиента:
Ты эксперт по расшифровке аудио.
1. Аудио содержит только реплики клиента.
2. Оператор продвигает кредитные услуги.
3. Клиент может спрашивать об условиях, ставках, комиссиях или отклонить предложение.
4. Клиент может запросить дополнительную информацию или отказаться от дальнейшего общения.
5. Язык может быть украинским, русским или смешанным. Сохраняйте оригинальные языки.
6. Качество аудио низкое. Исключайте галлюцинации и несвязанный контент.
Предоставьте полную расшифровку.
4. Сопоставить транскрипт GPT-4o
с временными метками Whisper
с помощью GPT-4.1
, используя следующий prompt:
Ты эксперт по анализу и восстановлению транскрипций телефонных звонков, связанных с продвижением кредитных услуг.
Я предоставлю два текста:
1. Транскрипция, созданная моделью gpt-4o-transcribe.
2. Транскрипция в формате VTT с помеченными по времени репликами от whisper-1.
Твоя задача — выровнять первую транскрипцию, используя временные метки из второй.
* Если тексты отличаются из-за галлюцинаций, используйте версию GPT-4o.
* Включите весь контент из GPT-4o.
* Если временная метка отсутствует, добавьте текст к следующей строке и скорректируйте время начала соответствующим образом.
Верни только итоговую транскрипцию в формате VTT.
5. Скорректировать временные интервалы реплик Оператора с использованием периодов тишины, полученных через фильтры ffmpeg
.
6. Повторить шаги 4–5 для транскрипта Клиента.
7. Объединить финальные VTT-транскрипты обоих каналов, обеспечив правильное распределение реплик по времени и по участникам разговора.
Заключение
Это решение не является ни быстрым, ни дешёвым — оно требует многократных вызовов моделей OpenAI. Однако результат — почти идеальная транскрипция, даже в тех случаях, когда Whisper
полностью проваливается.
Исходный код, адаптированный для работы с украинским и русским языками, можно найти здесь.