2013-11-21 38 views
2

我面临以下问题:树莓派转换Pyaudio WAV到拉克48000hz +谷歌语音

我录制的声音与Pyaudio,并将其保存为WAV。 Wav文件是48000hz(没有其他比率的作品(采样率错误,但多数民众赞成在其他故事)) Wav文件听起来不错,现在我想要将WAV转换为FLAC发送到谷歌语音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 

AND:

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 

转换为后手:

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

编辑1:

Flac实际上是48khz,我不知道为什么mplayer会告诉我flac是8khz,我在我的电脑上播放它,并且flac是完美的,反正google api似乎有问题,因为它什么都不返回。 我假设Rasberry上的mplayer的白噪声问题与google Api的问题相关,但我不知道它可能是什么。

wav文件:

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

拉克文件:

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

解决: 我不知道为什么,我打开我的PI和想考四周,突然它的工作没有改变任何东西。

Ty for your help。来自德国 问候, 弗洛

+0

我只是测试,对一个48 kHz的WAV文件相同的命令,并得到了48 kHz的FLAC文件从另一端。你能修改你的问题并发布'file '(输入文件)和'file '(正在生成什么)的输出吗?我想对这两个文件得到第二个意见,并排除在另一个层次上处理不当的可能性。 –

+0

Ty我做了一篇文章的编辑,我不知道为什么有些部分工作,其他人不(像谷歌API,我100%肯定everythink作品,因为我没有改变任何有关谷歌API,我只是插入一个现在麦克风,不得不改变速度到48khz) –

回答

1

我同意 - 工程上下行对我来说:

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