кодирование mp3 из аудиопотока PyTTS - PullRequest
1 голос
/ 04 февраля 2010

Я работаю над текстом, преобразующим текст в речь, в аудиофайлах mp3, используя python 2.5.

Я использую pyTSS в качестве модуля преобразования текста в речь python для преобразования текста в аудио .wav-файлы.(в pyTTS невозможно напрямую кодировать в формате mp3).Поэтому после этого я кодирую эти wav-файлы в формате mp3, используя кодировщик командной строки lame.

Теперь проблема заключается в том, что я хотел бы вставить (в частности, в аудиофайл mp3, между двумяслова) конкретный внешний звуковой файл (например, звуковое предупреждение) или (если возможно, сгенерированный предупреждающий звук).

Вопросы:

1) Я видел, что PyTTS имеет возможность сохранять аудиопоток в файле или в потоке памяти.используя две функции:

tts.SpeakToWave (файл, текст) или tts.SpeakToMemory (текст)

Использование функции tts.SpeakToMemory (текст), и с помощью PyMedia я смог сохранитьmp3 напрямую, но mp3-файл (при воспроизведении) звучит непонятно, как дональд дак!:-) Вот фрагмент кода:

            params = {'id': acodec.getCodecID('mp3'), 'bitrate': 128000, 'sample_rate': 44100, 'ext': 'mp3', 'channels': 2}

            m = tts.SpeakToMemory(p.Text)
            soundBytes = m.GetData()

            enc = acodec.Encoder(params)

            frames = enc.encode(soundBytes)
            f = file("test.mp3", 'wb')
            for frame in frames:
                f.write(frame)
            f.close()

Не могу понять, в чем проблема?!?Эта возможность (если она будет работать правильно), было бы хорошо пропустить шаг преобразования файлов wav.

2) В качестве второй проблемы мне нужно объединить аудиофайл mp3 (полученный из модуля преобразования текста в речь)с определенным звуком предупреждения.

Очевидно, было бы здорово, если бы я мог объединить потоки текста в аудиопамяти (после модуля преобразования текста в речь) и поток звука предупреждения, прежде чем кодировать всю аудиопамятьПоток в уникальный mp3-файл.

Я также видел, что библиотеки tksnack могут объединять аудио, но они не могут записывать mp3-файлы.

Я надеюсь, что все понятно.: -)

Большое спасибо за ваши ответы на мои вопросы.

Giulio

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Я не думаю, что PyTTS выдает данные PCM по умолчанию (т. Е. 44100 Гц, стерео, 16 бит). Вы должны проверить формат следующим образом:

memStream = tts.SpeakToMemory("some text")
format = memStream.Format.GetWaveFormatEx()

... и передайте его правильно acodec. Поэтому вы можете использовать атрибуты format.Channels, format.BitsPerSample и format.SamplesPerSec.

Что касается вашего второго вопроса, если звуки имеют одинаковый формат, вы сможете просто передать их все в enc.encode, один за другим.

0 голосов
/ 04 февраля 2010

не могу дать здесь однозначного ответа, извините.Но есть несколько проб и ошибок: я бы посмотрел на документацию модуля pymedia, чтобы проверить, есть ли какие-либо качественные конфигурации, которые вы можете установить.

И другой трюк в том, что в отличие от волнового или необработанного звука, вы не сможете просто объединить аудио в формате mp3: какое бы решение вы ни выбрали, вам придется объединять / микшировать свои звуки, пока они не сжаты.(без кодирования), а затем генерировать аудио в кодировке mp3.

Кроме того, иногда у нас просто возникает ощущение, что запись файла на диск и повторное преобразование вместо того, чтобы делать это в «один шаг», неудобна - в то время как в практикепрограммное обеспечение делает это точно негласно, даже если мы сами не указываем файл.Если вы работаете в Unix-подобной системе, вы всегда можете создать специальный файл FIFO (с помощью команды mkfifo) и отправить туда свои .wav-данные для encodin в отдельном процессе (используя lame): для ваших программ это будет выглядеть так, как будто выиспользуя промежуточный файл, но на самом деле вы этого не сделаете.

...