Как я уже много раз говорил, мы публикуем исходный код нашего перевода видео, который используется на сайте langswap.app. В коде в какой-то момент было много know-hows, но последняя итерация была больше на упрощение и на ускорение пайплайна.
Сейчас под капотом там следующее:
Сначала мы разделяем аудио на речь и фоновые звуки здесь
https://github.com/langswap-app/langswap/blob/main/langswap/ml/speech_to_text_service/speech_to_text_manager.py
Фоновые звуки (музыку, шум) нам нужно оставить как есть.
Затем с помощью whisper распознаём всё что там есть.
https://github.com/langswap-app/langswap/blob/main/langswap/ml/speech_to_text_service/asr_vad_client.py
и уточняем границы распознанного с помощью VAD. Присваиваем сегментам спикера.
Потом просим Gemma-4-E2B перевести нам всё и считаем гласные. Если сильно уехали по длине, просим гемму переделать 1-2 раза.
https://github.com/langswap-app/langswap/blob/main/langswap/ml/translation_service/translator_llamacpp_client.py
Потом, с новыми текстами, синтезируем речь через OmniVoice, используя исходный аудио сегмент как референс.
https://github.com/langswap-app/langswap/blob/main/langswap/ml/text_to_speech_service/tts_omnivoice_client.py
В конце, заменяем аудиодорожку на видео и добавляем watermark что переведено с помощью langswap
https://github.com/langswap-app/langswap/blob/main/langswap/ml/ffmpeg/__init__.py
В целом, это довольно простой, казалось бы, пайплайн, но как же долго и много это раз переизобреталось, вносились новые ТТС системы, изобретались способы контроля длины речи. В последней итерации, я удалил большую часть кода, чтобы вам было проще ориентироваться и контрибьютить.
https://github.com/langswap-app/langswap
Обязательно ставьте лайк на репе! Мне это очень важно.
Почитать про этот перевод на forbes:
https://www.forbes.ru/tekhnologii/554358-masinal-naa-ozvucka-v-cem-zaklucautsa-problemy-ii-dublaza
Спасибо что были подписаны всё это время!