我的目標是在按下按鈕時錄製聲音。在「if」條件下錄製音頻導致靜態
第一步實際上是錄製音頻。下面的腳本就像一個魅力:
import alsaaudio, wave, numpy
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, "default:CARD=C525")
inp.setchannels(1)
inp.setrate(44100)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
inp.setperiodsize(1024)
w = wave.open('test.wav', 'w')
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(44100)
while True:
l, data = inp.read()
a = numpy.fromstring(data, dtype='int16')
print numpy.abs(a).mean()
w.writeframes(data)
test.wav文件就像一個魅力和聲音正常被記錄。
現在我只想按下按鈕時錄製音頻。我正在使用帶有按鈕的GrovePi。該按鈕效果很好。它檢測到正在按下的按鈕,它會生成.wav文件,但它生成的音頻文件包含純靜態文件。
import time
import grovepi
import alsaaudio
import os
import wave
import numpy
button = 4 #grovepi D4
grovepi.pinMode(button,"INPUT")
inputSoundDevice = "default:CARD=C525"
path = os.path.realpath(__file__).rstrip(os.path.basename(__file__))
def start():
print "started"
while True:
if grovepi.digitalRead(button) == 1:
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, inputSoundDevice)
inp.setchannels(1)
inp.setrate(44100)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
inp.setperiodsize(1024)
time.sleep(.5)
print "inp setup"
w = wave.open('test.wav', 'w')
w.setnchannels(1)
w.setsampwidth(2)
w.setframerate(44100)
print "wave setup"
while(grovepi.digitalRead(button) == 1):
l, data = inp.read()
a = numpy.fromstring(data, dtype='int16')
print numpy.abs(a).mean()
w.writeframes(data)
time.sleep(.5)
w.close()
inp = None
print "closed"
start()
任何人都可以指出我正確的方向來解決這個問題嗎?我無法弄清楚這一點。
測試: 這些行動導致相同的靜態音頻文件:
- 而按鈕已經按下了按鈕一次
- 終止後按下
- 終止腳本終止腳本按下按鈕後的腳本兩次
- 用循環計數器替換按鈕並記錄循環計數是否在20到40之間以確保該按鈕是不是問題。
錯誤與numpy的
File "buttonWhilePressedLight.py", line 43, in <module>
start()
File "buttonWhilePressedLight.py", line 34, in start
a = numpy.fromstring(data, dtype='int16')
ValueError: string size must be a multiple of element size
「打印L」,而在與numpy的註釋掉
started
inp setup
wave setup
940
-32
940
-32
940
<-etc,etc,etc->
closed
什麼測試都做了些什麼?您是否嘗試過按下按鈕,然後按下按鈕時終止腳本?您是否嘗試按下按鈕並釋放它(一次),然後終止腳本? ... ... ...我不知道Python的,所以我不知道這是否是顯著,但:你按下按鈕,第二次,腳本調用'INP = alsaaudio.PCM(...)'和'W =波。打開('test.wav','w')'第二次,沒有從第一次初始化清理。 ...... ... ......另外,你有兩個'hasRecorded = True'語句;看起來你只需要一個。 – Scott
也許讀取按鈕狀態需要很長時間,音頻會被超出。你可以通過調用'time.time()'前後調用多長時間來進行民意調查,並且採取差異。這是秒數的浮點數。 – meuh
您可能會在[樹莓派具體](http://raspberrypi.stackexchange.com/)stackexchange網站的更多幫助。 – meuh