Как стать автором
Обновить

Комментарии 14

Доброго времени суток .

Если не тяжело , выложи пожалуйста, результат вывода русского текста в вав .

Играюсь в систему умный дом и голос формирую RHVoice , хочу сравнить качество

Здравствуйте! Вот ссылка на 3 файла wav с разным качеством. Silero поддерживает битрейт 8000, 24000 и 48000.

Еще вопрос и даже очень шкурный ))))


Silero нужен интернет ?

Для Silero и Vosk не нужен. Интернет нужен только для Telegram

Столкнулся с проблемой озвучки чисел и знаков +,-
Мой локальный говорит погоду и время .
Как решить эту задачу ?

Я просто менял их на текст, например, этот код делает числа словами

# Делаем числа буквами
text = self._nums_to_text(text)

Работа с 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.

Вроде, нашел способ передавать в байтах и получать в байтах без сохранения файла на диск, код будет типа такого. Попробую еще с помощью 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 пакетов.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации