Комментарии 14
Доброго времени суток .
Если не тяжело , выложи пожалуйста, результат вывода русского текста в вав .
Играюсь в систему умный дом и голос формирую RHVoice , хочу сравнить качество
Работа с ffmpeg dll напрямую есть, но на паскале.
Я тоже игрался с Silero TTS и выяснил, что разные голоса имеют разное ограничение на максимальную длину обрабатываемого текста, 1000 символов уверенно тянет только eugene, а kseniya надо передавать не больше
895 символов (при этом некоторые тексты большего размера она может обработать, а другие - нет). Проверено тестами.
Взгляните на скрипт https://github.com/S-trace/silero_tts_standalone/blob/master/tts.py - возможно найдёте что-нибудь полезное для себя в def preprocess_text - эта функция обрабатывает текст и затем разделяет текст по границам предложений на чанки пригодные для озвучивания.
как в ffmpeg передать байты и получить результат в байтах
Может я не правильно понял... Почему бы не использовать поток (stream)?
Пакет ffmpeg-python (пример для видео):
import ffmpeg
stream = ffmpeg.input('input.mp4')
stream = ffmpeg.hflip(stream)
stream = ffmpeg.output(stream, 'output.mp4')
ffmpeg.run(stream)
Я хотел избавится от сохранения файлов на диск. В примере 'input.mp4' скорее всего лежит на диске, а я хотел чтобы он был в оперативной памяти, что-то типа временного файла в виде io.BytesIO или что-то такое. Это позволит избавиться от постоянного сохранения и удаления файлов на диске при конвертации через ffmpeg. И думаю вся система будет работать быстрее
Вроде, нашел способ передавать в байтах и получать в байтах без сохранения файла на диск, код будет типа такого. Попробую еще с помощью mmap, спасибо!
def wav_to_ogg_bytes(in_bytes: bytes) -> bytes:
command = [
"ffmpeg",
"-i", 'pipe:0', # stdin
"-f", "ogg", # format
"-acodec", "libvorbis", # codec
"pipe:1" # stdout
]
proc = subprocess.Popen(
command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
out_bytes, err = proc.communicate(input=in_bytes)
return out_bytes
Кстати, если знаете рабочий способ, как в ffmpeg передать байты и получить результат в байтах без сохранения файла на диск, то напишите в комментариях.
Посмотрите для примера
потребуется: https://github.com/kkroening/ffmpeg-python
Спасибо за статью! Я бы только в качестве совета порекомендовал реализовать основные методы tts, stt асинхронно, т.к. основная работа бота выполняется именно там, в этом а иначе мало смысла в использовании async пакетов.
Telegram бот с offline распознаванием голосовых и генерацией аудио из текста