Skip to main content
 首页 » 编程设计

python之Raspberry Pi 将 Pyaudio Wav 转换为 Flac 48000hz + Google Speech

2025年05月04日7Leo_wl

我面临以下问题:

我用 Pyaudio 录制声音并将其保存为 Wav。 Wav 文件是 48000hz(没有其他速率有效(采样率错误,但那是另一个故事)) Wav 文件听起来不错,现在我想将 wav 转换为 flac 以将其发送到 google speech api。

问题是 avconf 将我的 48khz 输入 wav 转换为 8khz flac(使用 -ar 48000)。 flac 文件只是白噪音,我已经尝试了很多,但即使谷歌也没有答案;)

注意:它对我来说工作正常,使用其他 16Khz 的麦克风完全没有问题。 无论是 Pyaudios 采样率错误还是 avconv 问题。

代码如下:

录音:

   chunk = 2048 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 
RATE = 48000 
THRESHOLD = 525 #The threshold intensity that defines silence signal (lower than). 
SILENCE_LIMIT = 3 #Silence limit in seconds. The max ammount of seconds where only silence is recorded. When this time passes the recording finishes and the file is delivered. 
 
#open stream 
p = pyaudio.PyAudio() 
 
stream = p.open(format = FORMAT, 
                channels = CHANNELS, 
                rate = RATE, 
                input = True, 
                frames_per_buffer = chunk) 
 
print "* listening. CTRL+C to finish manually." 
all_m = [] 
data = '' 
rel = RATE/chunk 
slid_win = deque(maxlen=SILENCE_LIMIT*rel) 
started = False 
 
while (True): 
    data = stream.read(chunk) 
    slid_win.append (abs(audioop.avg(data, 2))) 
 
    if(True in [ x>THRESHOLD for x in slid_win]): 
        if(not started): 
            print "starting record" 
        started = True 
        all_m.append(data) 
    elif (started==True): 
        print "finished" 
        #the limit was reached, finish capture and deliver 
        filename = save_speech(all_m,p) 
        result=stt_google_wav(filename) 
        #reset all 
        started = False 
        #slid_win = deque(maxlen=SILENCE_LIMIT*rel) 
        #all_m= [] 
        print "Google STT Done" 
        stream.close() 
        p.terminate() 
        return result 

和:

def save_speech(data, p): 
filename = 'output_'+str(int(time.time())) 
# write data to WAVE file 
data = ''.join(data) 
wf = wave.open(filename+'.wav', 'wb') 
wf.setnchannels(1) 
wf.setsampwidth(p.get_sample_size(pyaudio.paInt16)) 
wf.setframerate(48000) 
wf.writeframes(data) 
wf.close() 
print "finished saving wav: %s" % filename 
return filename 

转换为 Flac:

os.system("avconv -i "+ filename+".wav  -y -ar 48000 "+ filename+ ".flac") 

编辑 1:

Flac 实际上是 48khz,我不知道为什么 mplayer 向我显示 flac 是 8khz,我在我的电脑上播放它并且 flac 是完美的,无论如何 google api 似乎有问题,因为它没有返回任何内容。 我假设 Rasberry 上 mplayer 的白噪声问题与 google Api 的问题有关,但我不知道它可能是什么。

音频文件:

output_1385413929.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 48000 Hz 

Flac 文件:

output_1385413929.flac: FLAC audio bitstream data, 16 bit, mono, 48 kHz, 204800 samples 

已解决: 我不知道为什么,我打开我的 pi 并想测试一下,突然它没有改变任何东西就工作了。

感谢您的帮助。 来自德国的问候, 弗洛

请您参考如下方法:

我同意 - 为我工作:

me@raspberrypi /mnt/share/Audio/xxxxxx $ file sample_audio.wav  
sample_audio.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 8000 Hz 
me@raspberrypi /mnt/share/Audio/xxxxxx $ file sample_audio.flac  
sample_audio.flac: FLAC audio bitstream data, 16 bit, stereo, 48 kHz, 9131406 samples