Озвучка текста на любой язык при помощи OpenAI TTS

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63
logo.png


Небольшой, но удобный шаблон для озвучки текста почти на любой язык от OpenAI. Шаблон работает как с маленькими текстами, так и с большими, разрезая их на части и потом склеивая с помощью FFMPEG. Для работы необходим токен от OpenAI, зарубежная прокся и сам текст, который нужно озвучить. На выбор несколько голосов озвучки. разделённый на мужские и женские.

img1.pngimg2.png


Входные настройки:

Куда скачивать - папка куда будут скачиваться файлы
Откуда брать текст - если короткий текст, то выбираем из входных и вписываем его в текстовое поле ниже
Токен OpenAi - сам токен чата
Прокси - ну тут и ежу понятно. Прокси в формате login:pass@ip:port
Голоса - выбор голоса озвучки


Мужские голоса:

alloy — молодой, энергичный, чёткий
echo — тёплый, уверенный, немного хрипловатый
fable — мягкий, спокойный, чуть мечтательный
onyx — глубокий, грубоватый
sage — зрелый, уравновешенный, интеллигентный тон

Женские голоса:

ash — лёгкий, молодой, нейтрально-дружелюбный
ballad — тёплый, выразительный, с лёгкой эмоциональной окраской
coral — яркий, живой, немного игривый
nova — профессиональный, чёткий, подходит для новостей, озвучки
verse — мягкий, плавный, слегка мелодичный


Как работает шаблон?


Шаблон разделён на два режима: работа с коротким текстом (до 4000 символов включая пробелы и всякие точки), так и с длинными текстами, которые он будет нарезать по 500 символов и потом склеивать. Вся работоспособность зависит только от баланса вашего ключа. Если короткий текст мы пихаем в входные, то длинный в текстовый файл в корневой папке шаблона. На примере длинного текста рассмотрим работу шаблона. Шаблон берёт текст и нарезает его с помощью простого regex [\w\W]{0,500}\s и кладёт в список построчно (500 символов это затычка, резать можно спокойно до 4000 символов, достаточно поменять значение в кубике с regex). Далее берёт каждую строку и экранирует :

Экранирование:
    string input = project.Variables["text"].Value;
    string json = JsonConvert.SerializeObject(input);
    return json.Substring(1, json.Length - 2);
Далее идёт простой запрос на :

img3.pngimg4.png

Кстати, кому нужно дороже, но лучше качеством, можно использовать другую модель tts-1-hd вместо tts-1.

Далее перемещает и задаёт имя по счётчику. После завершения скачивания получает все пути файлов и создаёт список для ffmpeg для склейки и выполняет простую команду -f concat -safe 0 -i "{-Variable.folder-}list.txt" -c copy "{-Variable.folder-}output.mp3".

PS: файл ffmpeg слишком жирный и не влез в прикреплённые файлы. Скачайте отдельно последнюю (а по идее любую) версию и киньте в папку с шаблоном

На выходе получаем готовый файл с озвучкой вашего текста. Надеюсь шаблон окажется вам полезен. Всем спасибо.








 

Вложения

Agent

Client
Регистрация
25.12.2018
Сообщения
210
Благодарностей
58
Баллы
28
Подскажите, а есть возможность подгонять длину аудио на разных языках под одно значение. Соответствующие тексты предварительно примерно адаптируются по объему. Но получается не точно. Нужно для изготовления аудио-дорожек для видео на ютуб.
P.S. Сам отвечу. Вот с таким параметром нужно запустить -y -i "{-Variable.folder-}\output.mp3" -filter:a "atempo=1.1" -c:a libmp3lame -q:a 2 "{-Variable.folder-}\output-2.mp3"
 
Последнее редактирование:
  • Спасибо
Реакции: DrunkDeath

DV_

Client
Регистрация
21.08.2020
Сообщения
127
Благодарностей
34
Баллы
28
А что там по ценам?
 

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63

DV_

Client
Регистрация
21.08.2020
Сообщения
127
Благодарностей
34
Баллы
28
:au:
А какие у вас объёмы, если не секрет?
 

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63

DV_

Client
Регистрация
21.08.2020
Сообщения
127
Благодарностей
34
Баллы
28
А в день/месяц?
 

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63

Agent

Client
Регистрация
25.12.2018
Сообщения
210
Благодарностей
58
Баллы
28
Как проверить длину аудиофайла? Пробовал запустить ffprobe.exe с такими параметрами с сохранением в переменную и выводом ошибки в переменную:
-show_entries format=duration -f lavfi -i amovie="{-Variable.file}" -of csv=p=0
Действие не выполняется. В переменную с ошибкой выводится только версия ffprobe.
В логе ошибка: Выполнение программы ...\ffprobe.exe Результат: 1
 

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63
Как проверить длину аудиофайла? Пробовал запустить ffprobe.exe с такими параметрами с сохранением в переменную и выводом ошибки в переменную:
-show_entries format=duration -f lavfi -i amovie="{-Variable.file}" -of csv=p=0
Действие не выполняется. В переменную с ошибкой выводится только версия ffprobe.
В логе ошибка: Выполнение программы ...\ffprobe.exe Результат: 1
Можно с FFMPEG https://zenno.club/discussion/threads/poluchit-prodolzhitelnost-video.33842/post-867838
 

Agent

Client
Регистрация
25.12.2018
Сообщения
210
Благодарностей
58
Баллы
28
Действие выполняется, в переменную ничего не записывается (галочка на "Записать STD out" стоит).
Только у меня файл mp3, в примере mp4. Путь свой поставил.
В переменную с ошибкой такое пишется:
Код:
ffmpeg version 2026-01-12-git-21a3e44fbe-full_build-www.gyan.dev Copyright (c) 2000-2026 the FFmpeg developers
  built with gcc 15.2.0 (Rev8, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-cairo --enable-fontconfig --enable-iconv --enable-gnutls --enable-lcms2 --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-liboapv --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libsvtjpegxs --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-openal --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint --enable-whisper
  libavutil      60. 23.100 / 60. 23.100
  libavcodec     62. 23.102 / 62. 23.102
  libavformat    62.  8.102 / 62.  8.102
  libavdevice    62.  2.100 / 62.  2.100
  libavfilter    11. 10.101 / 11. 10.101
  libswscale      9.  3.100 /  9.  3.100
  libswresample   6.  2.100 /  6.  2.100
Input #0, mp3, from 'C:\ЗДЕСЬ_ПУТЬ\output.mp3':
  Metadata:
    encoder         : Lavf60.16.100
  Duration: 00:01:44.21, start: 0.025057, bitrate: 129 kb/s
  Stream #0:0: Audio: mp3 (mp3float), 44100 Hz, mono, fltp, 128 kb/s, start 0.025057
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf62.8.102
  Stream #0:0: Audio: pcm_s16le, 44100 Hz, mono, s16, 705 kb/s
    Metadata:
      encoder         : Lavc62.23.102 pcm_s16le
[out#0/null @ 0000026fc9ccf940] video:0KiB audio:8976KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
size=N/A time=00:01:44.21 bitrate=N/A speed=1.83e+03x elapsed=0:00:00.05
P.S. Из темы по ссылке выше код на C# работает. Спасибо!
 
Последнее редактирование:

DrunkDeath

Client
Регистрация
24.12.2014
Сообщения
606
Благодарностей
433
Баллы
63
Действие выполняется, в переменную ничего не записывается (галочка на "Записать STD out" стоит).
Только у меня файл mp3, в примере mp4. Путь свой поставил.
В переменную с ошибкой такое пишется:
Код:
ffmpeg version 2026-01-12-git-21a3e44fbe-full_build-www.gyan.dev Copyright (c) 2000-2026 the FFmpeg developers
  built with gcc 15.2.0 (Rev8, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-cairo --enable-fontconfig --enable-iconv --enable-gnutls --enable-lcms2 --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-liboapv --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libsvtjpegxs --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-openal --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint --enable-whisper
  libavutil      60. 23.100 / 60. 23.100
  libavcodec     62. 23.102 / 62. 23.102
  libavformat    62.  8.102 / 62.  8.102
  libavdevice    62.  2.100 / 62.  2.100
  libavfilter    11. 10.101 / 11. 10.101
  libswscale      9.  3.100 /  9.  3.100
  libswresample   6.  2.100 /  6.  2.100
Input #0, mp3, from 'C:\ЗДЕСЬ_ПУТЬ\output.mp3':
  Metadata:
    encoder         : Lavf60.16.100
  Duration: 00:01:44.21, start: 0.025057, bitrate: 129 kb/s
  Stream #0:0: Audio: mp3 (mp3float), 44100 Hz, mono, fltp, 128 kb/s, start 0.025057
Stream mapping:
  Stream #0:0 -> #0:0 (mp3 (mp3float) -> pcm_s16le (native))
Press [q] to stop, [?] for help
Output #0, null, to 'pipe:':
  Metadata:
    encoder         : Lavf62.8.102
  Stream #0:0: Audio: pcm_s16le, 44100 Hz, mono, s16, 705 kb/s
    Metadata:
      encoder         : Lavc62.23.102 pcm_s16le
[out#0/null @ 0000026fc9ccf940] video:0KiB audio:8976KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
size=N/A time=00:01:44.21 bitrate=N/A speed=1.83e+03x elapsed=0:00:00.05
P.S. Из темы по ссылке выше код на C# работает. Спасибо!
Всё правильно. Из переменной ошибки и парсится. Вот внимательнее, в этом полотне есть строка: Duration: 00:01:44.21, start: 0.025057, bitrate: 129 kb/s Вот Duration и есть длительность.
PS: ааа, сразу не заметил, что всё норм))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)