【问题标题】:Raspberry Pi convert Pyaudio Wav to Flac 48000hz + Google SpeechRaspberry Pi 将 Pyaudio Wav 转换为 Flac 48000hz + Google Speech
【发布时间】:2013-12-06 13:20:22
【问题描述】:

我面临以下问题:

我用 Pyaudio 录制声音并将其保存为 Wav。 Wav 文件是 48000hz(没有其他速率工作(采样率错误,但那是另一回事)) Wav 文件听起来不错,现在我想将 wav 转换为 flac 以将其发送到 google 语音 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 的问题有关,但我不知道它可能是什么。

Wav 文件:

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 并想测试一下,突然它在没有改变任何东西的情况下工作。

求你的帮助。 来自德国的问候, 弗洛尔

【问题讨论】:

  • 我刚刚针对 48 kHz WAV 文件测试了相同的命令,并从另一端得到了 48 kHz FLAC 文件。你能修改你的问题并发布'file '(输入文件)和'file '(正在生成什么)的输出吗?我想就这两个文件获得第二意见,并排除在另一层处理不当的可能性。
  • 我对帖子进行了编辑,我不知道为什么有些部分可以正常工作,而另一些则不能(比如 google api,我 100% 确定everythink 工作正常,因为我没有更改任何关于 google 的内容api,我刚刚插入了一个 now 麦克风,不得不将速率更改为 48khz)

标签: python audio raspberry-pi pyaudio avconv


【解决方案1】:

我同意 - 为我工作:

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

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2020-02-13
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多