2010-02-04 96 views
1

我使用python 2.5工作文本到語音轉換文本,在音頻mp3文件中。從PyTTS的音頻流編碼mp3

我用pyTSS爲Python文本到語音模塊,音頻.wav文件轉換文本(在pyTTS是不可能的MP3格式的直接編碼)。那之後,我使用lame命令行編碼器以mp3格式編碼這些wav文件。

現在,問題是,我想插入(特別是在兩個單詞之間的音頻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

我不認爲PyTTS產生默認的PCM數據(即44100赫茲,立體聲,16位)。你應該檢查這樣的格式:

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

......並將它正確地交給acodec。因此,您可以使用屬性format.Channels,format.BitsPerSampleformat.SamplesPerSec

至於你的第二個問題,如果聲音格式相同,你應該可以簡單地把它們全部傳遞給enc.encode,一個接一個。

0

無法在此處提供確切答案,抱歉。但是有一些試驗和錯誤:我會查看pymedia模塊的文檔來檢查是否有可以設置的任何質量配置。

另一個問題是,與波形或原始音頻不同,您將無法簡單地連接mp3編碼音頻:無論您達到何種解決方案,您都必須在解壓縮時對音頻進行連接/混音(未編碼),然後生成mp3編碼的音頻。另外,有時候我們只是有一種感覺,即將磁盤記錄到磁盤並重新報告,而不是在「一步」中做這件事很尷尬 - 而在實際中,軟件會在幕後做到這一點,即使我們不會不要自己指定一個文件。如果你使用的是類Unix系統,你總是可以創建一個FIFO特殊文件(使用mkfifo命令)並將yoru .wav數據發送到一個單獨的進程(使用跛腳)進行編碼:對於您的程序,它看起來就像是使用中間文件,但實際上不會。