3

我正在从以下位置检索声音:

http://translate.google.com/translate_tts

并将其写入 WAV 文件,当我双击该文件时,声音播放正常,但是当我使用 python 中的 WAVE 模块打开它时,它给了我这个错误:

wave.Error:文件不以 RIFF id 开头

我想知道是否有办法打开这个文件,或者是否可以在不写之前播放声音。

以下是相关代码:

url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % (lang, text)
hrs = {"User-Agent":
       "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"}

request = urllib.request.Request(url, headers = hrs)
page = urllib.request.urlopen(request)

fname = "Play"+str(int(time.time()))+".wav"
file = open(fname, 'wb')
file.write(page.read())
file.close()

读取这个文件的代码是:

INPUT_FRAMES_PER_BLOCK = 1024

wf = wave.open(fname, 'r')

pa = pyaudio.PyAudio()

stream = pa.open(format=pa.get_format_from_width(wf.getsampwidth()),
                 channels=wf.getnchannels(),
                 rate=wf.getframerate(),
                 output=True)

data = wf.readframes(INPUT_FRAMES_PER_BLOCK)

while data != '':
    stream.write(data)
    data = wf.readframes(INPUT_FRAMES_PER_BLOCK)

stream.stop_stream()
stream.close()

pa.terminate()

提前致谢!我正在使用 Python 3 顺便说一句。

4

2 回答 2

3

您遇到此错误是因为您尝试播放的文件不是WAV.

谷歌翻译生成的声音被编码为MP3.

至于如何MP3用 Python 播放声音,我建议你阅读这个 StackOverflow 问题

(基本上你必须安装一些像Pyglet这样的库)

于 2013-05-02T01:58:40.793 回答
0

或者,如果你想要一个 wav 文件,你可以安装一些东西把它转换成一个 wav 文件。Pymedia 是一个很好的模块。为当前版本的 python 制作的 pymedia 版本可能很难找到,但是,我找到了一个很好的地方:http ://www.lfd.uci.edu/~gohlke/pythonlibs/#pymedia

这是一个将 mp3 文件转换为 wav 文件并在文件系统中保存 wav 文件的函数:

def dumpWAV( name ):
    import pymedia.audio.acodec as acodec
    import pymedia.muxer as muxer
    import time, wave, string, os
    name1= str.split( name, '.' )
    name2= string.join( name1[ : len( name1 )- 1 ] )
    # Open demuxer first
    dm= muxer.Demuxer( name1[ -1 ].lower() )
    dec= None
    f= open( name, 'rb' )
    snd= None
    s= " "
    while len( s ):
        s= f.read( 20000 )
        if len( s ):
            frames= dm.parse( s )
            for fr in frames:
                if dec== None:
                    # Open decoder
                    dec= acodec.Decoder( dm.streams[ 0 ] )
                r= dec.decode( fr[ 1 ] )
                if r and r.data:
                    if snd== None:
                        snd= wave.open( name2+ '.wav', 'wb' )
                        snd.setparams( (r.channels, 2, r.sample_rate, 0, 'NONE','') )
                    snd.writeframes( r.data )

您可能只想播放 mp3,但在 python 中播放 wav 文件要容易得多。比如pygame对mp3文件的支持是有限的,但是它总是可以播放一个wav文件。

于 2013-12-21T18:47:46.210 回答