Озвучка русских и иностранных текстов через платформу OpenAI.
Скрипт пакетно озвучивает все текстовые файлы (.txt/.md) из каталога texts/ голосами OpenAI TTS и сохраняет результаты в audio/. Поддерживаются форматы вывода wav/mp3/flac/aac/opus/pcm.
Основа — модель
gpt-4o-mini-tts. Стиль озвучки задаётся через «паспорт» диктора (passport), а список голосов — вvoices.
- Python 3.10+
- Библиотека
openai(официальный SDK) - Учётная запись OpenAI и API-ключ
Установка зависимостей:
pip install --upgrade openai- Создайте структуру каталогов и поместите тексты:
project/
TextToSpeech.py # ваш скрипт
texts/ # сюда кладём .txt / .md
01_euclid.txt
02_archimedes.md
audio/ # создаётся автоматически
- Установите API-ключ (рекомендуется через переменную окружения):
-
macOS / Linux:
export OPENAI_API_KEY="sk-...your_key..."
-
Windows PowerShell:
$env:OPENAI_API_KEY="sk-...your_key..."
- Запустите:
python TextToSpeech.pyГотовые файлы окажутся в audio/ с именами вида:
audio/01_euclid_ballad.flac
audio/01_euclid_marin.flac
В коде задайте массив:
voices = ["ballad", "marin"] # можно: coral, verse, sage, alloy, echo, shimmer, ashПримечание:
marinна некоторых аккаунтах доступен только через Realtime API. Если получите ошибку «unsupported voice», исключитеmarinиз списка или используйте другой голос.
fileFormat = "flac" # варианты: "wav", "mp3", "flac", "aac", "opus", "pcm"- Максимальная совместимость для «проиграть везде» —
wav. - Для публикации/хранения —
mp3илиflac.
Правьте строку passport под нужный стиль. Рекомендации:
- Чётко формулируйте темп, паузы и манеру (академичная, тёплая, нейтральная).
- Для сложных фамилий ставьте ударения:
Архиме́д,Пифаго́р,Пуа́нкаре́. - Для терминов используйте короткие паузы и разметку текстом (многоточия, перенос строки перед определением).
CONCURRENCY = 5Если ловите рейт-лимиты или 429 — уменьшите значение. Если всё стабильно — можно аккуратно увеличить.
Скрипт берёт все .txt и .md из texts/ (без вложенных папок), сортирует по имени. Кодировка входа — UTF-8.
- Длинные тексты лучше разбивать на абзацы. В текущей версии скрипт читает файл целиком; если планируете длинные лекции, подумайте о разбиении на части и склейке с «тишиной» (например, 300–700 мс) между блоками.
- Сложные имена и иностранные слова: заранее помечайте ударения и пишите «как читается» в скобках при первом употреблении.
- Финальный звук: для публикаций можно слегка обработать файл (EQ, де-эссер, нормализация). Это делается уже вне скрипта отдельными скриптами, либо на монтаже.
401 Unauthorized: неверный или отсутствующийOPENAI_API_KEY.400 Bad Request / unsupported voice: выбранныйvoiceне поддерживается вашей моделью/аккаунтом — замените голос.429 Rate Limit: уменьшитеCONCURRENCY, добавьте повтор с задержкой.- «Белый шум» при проигрывании: как правило, связано со стримингом MP3 как PCM. Лучше сохранять в файлы — просто откройте итоговый
wav/mp3/flacв нормальном плеере. Для стриминга в память используйтеwav/pcm.
- Вы владеете выходным контентом (озвучкой), при условии соблюдения правил OpenAI и законов юрисдикции вашей страны.
- Нельзя имитировать реальных людей без согласия; избегайте вводящего в заблуждение использования голоса.
- Проверьте авторские права на исходные тексты, если это не ваши материалы.
Как выбрать голос под материал?
- Исторический нарратив, биографии —
marin(жен) илиballad(муж). - Объяснения/доказательства —
verse. - Промо/тизеры —
coral.
Почему именно flac по умолчанию?
Сжимается без потерь (архив качества). Если нужна максимальная совместимость — поставьте wav или добавьте конверсию в mp3.
Можно ли читать не только .txt и .md?
Да, расширьте фильтр в функции CollectInputFiles и добавьте парсинг нужных форматов (например, .rst).
- Авторазбиение длинных файлов на части и склейка с точными паузами.
- Словарь ударений для фамилий/терминов (автоподстановка а́кутов).
- Маппинг голоса по префиксу файла:
bio_* -> marin,theorem_* -> verse,promo_* -> coral.
Создайте простой Dockerfile на базе python:3.11-slim, установите openai, скопируйте проект и передайте OPENAI_API_KEY через --env/.env. Это удобно для CI/CD.