ElevenLabs через Ofox: как создать, сохранить и проверить первую озвучку
Подключите ElevenLabs через Ofox с Python или cURL: настройки голоса, сохранение MP3, проверка результата и разбор ошибок. Код и реальное аудио доступны для скачивания.
Чтобы сгенерировать речь через Ofox, отправьте текст на /v1/audio/speech, указав API-ключ Ofox, идентификатор модели elevenlabs/eleven_v4, совместимый идентификатор голоса и поддерживаемый аудиоформат. Сохраните успешный бинарный ответ как аудиофайл, а затем проверьте, что он декодируется. Файл с именем speech.mp3 ещё не доказывает, что запрос сработал: ошибка авторизации, сохранённая под этим именем, всё равно останется JSON-файлом.
В этом руководстве показан запрос, успешно выполненный 10 октября 2026 года. Исходный сценарий на английском языке, приведённый ниже, дал MP3 длительностью 10,00 секунды, а отдельный запрос к Scribe преобразовал это аудио в текст. Вы можете изучить результаты в скачиваемых файлах и клиенте. Это один успешный пример работы через шлюз Ofox, а не проверка надёжности или утверждение, что через этот маршрут доступны все функции ElevenLabs.
Что получится в итоге
Результат — готовая к воспроизведению озвучка, исходный текст, конфигурация запроса без секретов и небольшая запись о проверке. Озвучку можно использовать в продуктовом видео или передать в процесс транскрибации. Чтобы повторить запрос через Ofox, не нужно открывать видеоредактор, клонировать голос или иметь собственный платный аккаунт ElevenLabs. Нужен API-ключ Ofox с доступом и достаточным балансом, а настроенный маршрут к вышестоящему провайдеру должен работать.
В примере используется существующий идентификатор голоса. Новый голос здесь не регистрируется, и голос человека не клонируется. Если позже вы выберете голос, связанный с реальным человеком, получите необходимое разрешение и отдельно проверьте применимые права. Успешный запрос на синтез не даёт права выдавать себя за другого человека или использовать его голос в любых публикациях.
Скачайте полный комплект для работы. В него входят audio_api.py, comparison.txt, elevenlabs.mp3 и сохранённые метаданные ответа. Клиент использует переменные среды для аутентификации и останавливается при неуспешных запросах, а не отправляет автоматически повторный POST-запрос, который может тарифицироваться.
Аудиопример ElevenLabs
1. Подготовьте ключ, инструменты и точный текст
Установите Python, пакет requests и FFmpeg с ffprobe. Для самого HTTP-запроса достаточно HTTP-клиента; FFmpeg нужен здесь для проверки декодирования и длительности — это критерии приёмки результата. Убедитесь, что команды доступны в том же терминале, из которого будете запускать руководство:
python3 -m pip install requests
ffmpeg -version
ffprobe -version
Задайте OFOX_API_KEY с помощью вашего обычного менеджера секретов или приватной конфигурации среды. Не помещайте ключ в статью Markdown, исходный файл, снимок экрана или закоммиченный .env. Если вы уже экспортировали переменную, предоставленный клиент прочитает её напрямую. Скрипт намеренно не выводит заголовок Authorization.
Для первого теста используйте текст из comparison.txt:
A clear product video starts with a clear brief. Show the real interface, explain one useful task, and check the exported video before sharing it.
Сохраните файл в UTF-8. При поиске неисправности оставляйте формулировку без изменений: если одновременно менять текст, голос, модель и формат, причину ошибки будет сложнее определить. Для многоязычного проекта подготовьте и проверьте сценарий отдельно для каждого языка, прежде чем генерировать озвучку: перевод и синтез речи — разные операции.
Если готовите собственный текст, расшифруйте непонятные сокращения и устраните неоднозначность в датах до отправки. «October 15, 2026» однозначнее, чем «10/15». Требуемое произношение нужно проверять в готовом аудио, а не считать гарантированным по текстовому превью. В примере нет обещаний насчёт конкретной эмоции или управления произношением: через этот шлюз такие возможности не проверялись.
2. Укажите модель и голос в полях шлюза
В проверенном запросе есть четыре основных параметра содержимого:
| Поле | Проверенное значение | Почему это важно |
|---|---|---|
model | elevenlabs/eleven_v4 | Идентификатор модели Ofox с префиксом провайдера |
voice | JBFqnCBsd6RMkjVDRZzb | Идентификатор голоса, принятый в этом тесте |
response_format | mp3_22050_32 | Запрошенный пресет MP3, а не имя файла |
speed | 1.0 | Переданное значение скорости, не гарантирующее длительность |
Перед использованием другой модели или формата проверьте актуальную страницу модели ElevenLabs. Не заменяйте точный идентификатор отображаемым названием и не считайте, что имя голоса от другого провайдера подойдёт в качестве идентификатора ElevenLabs.
Эндпоинт Ofox и нативный API ElevenLabs — разные интерфейсы. В примерах для нативного API идентификатор голоса может находиться в пути, а поля могут быть специфичны для провайдера. В этом руководстве указывайте голос в поле JSON, показанном ниже, и используйте базовый URL Ofox. Передача в адаптер всех параметров из документации нативного API сама по себе не проверяет совместимость.
Пример намеренно сделан небольшим. Добавляйте поле языка, другой голос или расширенную настройку только после проверки, что текущий маршрут Ofox принимает их. Если вы создаёте универсальную обёртку, храните параметры конкретных провайдеров в отдельном объекте конфигурации, а не представляйте все модели синтеза речи как взаимозаменяемые.
3. Создайте первый MP3 с проверенным клиентом Python
В каталоге с распакованным комплектом выполните команду:
python3 audio_api.py speech \
--engine elevenlabs \
--text comparison.txt \
--output my-first-voiceover.mp3
Укажите новое имя выходного файла. Клиент откажется использовать уже существующий путь, чтобы следующий эксперимент случайно не перезаписал результаты предыдущего. Вместе с метаданными ответа он сохраняет конфигурацию отправленного содержимого, а ключ получает только из переменной среды.
При успехе клиент проверяет тип ответа, сохраняет байты, определяет длительность аудио и пытается декодировать файл. Ожидаемый результат — MP3 и метаданные, а не JSON-объект со ссылкой на аудиофайл. В случае ошибки изучите отдельную запись об ошибке; не передавайте такой ответ в видеоредактор, как будто это речь.
В нашем примере сервер вернул HTTP 200 с типом audio/mpeg; размер файла составил 40 456 байт, а ffprobe определил длительность в 10,00 секунды. По замеру клиента запрос занял 2,861 секунды. Это время включает условия сети и обработки именно этого запроса; оно не равно времени до первого аудиофрагмента и не гарантирует такую задержку со стороны сервиса.
Прослушайте или скачайте фактический пример ElevenLabs. При документировании запроса не изменяйте исходное аудио. Если для видео вы нормализуете громкость или обрежете тишину, сохраните результат отдельным редакционным файлом, чтобы другие разработчики могли изучить исходный ответ.
4. Воспроизведите HTTP-запрос с помощью cURL
Следующий альтернативный вариант записывает ответ во временный файл и перемещает его на место целевого только после успешного HTTP-ответа:
python3 - <<'PY'
import json
from pathlib import Path
payload = {
'model': 'elevenlabs/eleven_v4',
'voice': 'JBFqnCBsd6RMkjVDRZzb',
'input': Path('comparison.txt').read_text().strip(),
'response_format': 'mp3_22050_32',
'speed': 1.0,
}
Path('speech-request.json').write_text(json.dumps(payload))
PY
curl --fail-with-body --silent --show-error \
https://api.ofox.ai/v1/audio/speech \
-H "Authorization: Bearer $OFOX_API_KEY" \
-H 'Content-Type: application/json' \
--data-binary @speech-request.json \
--output speech-response.tmp \
&& mv speech-response.tmp curl-voiceover.mp3
Это альтернативный способ отправить запрос, а не обязательный второй платный вызов. Если запустить оба клиента, речь будет сгенерирована дважды. Успешный результат в статье получен с помощью предоставленного клиента Python; фрагмент cURL показывает эквивалентную сборку запроса.
Если у вас старая версия cURL без --fail-with-body, используйте клиент Python или отдельно проверяйте HTTP-статус, прежде чем принимать выходной файл. При ошибке во временном файле может сохраниться полезное тело ответа. Удалите его или поместите в архив только после того, как изучите ошибку; не переименовывайте неуспешный ответ в файл .mp3 только ради попытки открыть его в проигрывателе.
5. Проверьте файл, прежде чем считать задачу выполненной
С помощью ffprobe проверьте фактический контейнер и аудиопоток, а затем декодируйте весь файл:
ffprobe -v error -show_entries \
stream=codec_name,sample_rate,channels:format=duration \
-of json my-first-voiceover.mp3
ffmpeg -v error -i my-first-voiceover.mp3 -f null -
Отсутствие ошибок при декодировании — техническая проверка. Она не покажет, правильно ли произносится название бренда, подходит ли пауза для монтажной склейки и соответствует ли голос аудитории. Перед публикацией прослушайте экспорт целиком на обычной громкости и сравните его с утверждённым текстом.
В нашем примере отдельный запрос на транскрибацию Scribe вернул те же слова, но с отличиями в пунктуации. Это полезная дополнительная проверка, но не замена прослушиванию: система распознавания речи может нормализовать ошибки или не заметить нежелательный звук. Совпадение результата второй модели с текстом не доказывает идеальное качество аудио.
В практической записи о приёмке укажите версию входного текста, модель, голос, запрошенный формат, фактическую длительность, результат проверки декодирования и того, кто проверил произношение. Если какие-то пункты ещё не проверены, так и укажите. Успешный запрос API с непроверенным содержимым готов к редакционной проверке, но не обязательно к использованию в рекламной кампании.
6. Подгоните озвучку под видео, не скрывая проблему с хронометражем
Планируйте видео с учётом измеренной длительности озвучки. Тот же текст с другим голосом или при следующей генерации может занять другое время. Значение speed 1.0 не гарантирует, что результат впишется в десятисекундный таймлайн.
Если озвучка длиннее видеоряда, перед экспортом продлите или перестройте соответствующую сцену. Если она короче, осознанная пауза в изображении может быть лучше, чем растягивание речи. Не используйте режим выбора самого короткого потока, не выяснив, может ли он обрезать конец видео или озвучки.
В связанном руководстве Ofox по озвучке видео показано, как измерить аудио и собрать MP4. Чтобы подготовить субтитры с фактическими временными метками, а не угадывать границы реплик по длине текста, воспользуйтесь руководством по транскрибации Scribe и созданию субтитров SRT.
Не смешивайте пример разработки с маркетинговым утверждением. Это аудио показывает, что при зафиксированной конфигурации запрос вернул пригодный файл. Оно не доказывает, что голос одинаково хорошо справится с любым языком, техническим термином или форматом коммерческой публикации.
7. Учитывайте стоимость и не путайте единицы измерения
У стоимости генерации речи должна быть указана единица измерения. Цену за символы текста, аудиотокены и секунды транскрибации нельзя сравнивать, просто поставив соответствующие числа рядом. Условия для нужной конфигурации проверяйте на странице модели и в записи о тарификации конкретного запроса в аккаунте.
Размер файла и время выполнения запроса мы не называем тарифицируемым использованием. Загрузка файла объёмом 40 килобайт не означает какой-либо конкретной платы. В руководстве сохранены модель и параметры запроса, чтобы вы могли сверить их с соответствующей записью в истории использования своего аккаунта. Оценка по каталогу не выдаётся за окончательную сумму, начисленную за этот пример.
В рабочем процессе учитывайте отдельно принятые результаты, повторы и отклонённые варианты. Десять запрошенных вариантов, из которых получена одна утверждённая озвучка, дают другую фактическую стоимость, чем один успешный вариант. Учитывайте все тарифицируемые вызовы, а затем рассчитывайте стоимость принятого результата. Одна лишь более низкая номинальная ставка не доказывает, что весь процесс окажется дешевле.
8. Найдите точный этап, на котором возникла ошибка
| Симптом | Что проверить | Безопасное следующее действие |
|---|---|---|
| HTTP 401 с упоминанием квоты | Тело ответа и ID запроса | Проверьте, какой аккаунт или маршрут провайдера использовался; не считайте автоматически, что баланс Ofox исчерпан |
| HTTP 401 с упоминанием учётных данных | Переменную среды с ключом и способ аутентификации | Исправьте источник учётных данных, не выводя ключ |
| HTTP 400 или неподдерживаемый формат | Сочетание модели, голоса и формата | Вернитесь к проверенной конфигурации, затем меняйте по одному полю |
| Очень маленький «MP3» не воспроизводится | Тип содержимого и первые байты ответа | Прочитайте ответ как текст; повторите генерацию только после устранения причины |
| Тайм-аут, исход запроса неизвестен | Журналы провайдера или запроса | Прежде чем повторять вызов, выясните, завершился ли он |
| Не хватает слов или результат не подходит | Исходное аудио и текст | Измените текст или конфигурацию голоса и сохраните новый вариант |
В ходе подготовки этого руководства предыдущие попытки вернули ошибку квоты вышестоящего провайдера, хотя баланс кошелька Ofox отображался как положительный. После восстановления маршрута новые вызовы завершились успешно. Это данные о тех запросах, а не правило, согласно которому любая ошибка 401 связана с балансом провайдера.
Часто задаваемые вопросы
- Нужно ли указывать в этом примере ключ ElevenLabs?
- Нет. В примере используется API-ключ Ofox для аутентификации в шлюзе Ofox. Нативная интеграция с ElevenLabs использует другой способ аутентификации.
- Можно ли использовать любое имя голоса?
- Не стоит исходить из того, что можно. Успешный запрос использовал точный идентификатор, указанный выше. Перед заменой на отображаемое имя или голос другого провайдера проверьте совместимость.
- Почему сохранённый MP3 содержит JSON?
- Вероятно, сервер вернул ошибку, а ваш клиент сохранил её, не проверив HTTP-статус и тип ответа. Сначала прочитайте текст ошибки: смена расширения её не исправит.
- Означает ли HTTP 200, что озвучку уже можно публиковать?
- Нет. Этот статус подтверждает успешный ответ, но не редакционное одобрение. Перед публикацией декодируйте файл, проверьте его полную длительность и прослушайте, нет ли пропущенных слов, проблем с произношением или несоответствий по времени.


