ボタンを押しながらマイクから録音しようとしていますが、使用しているライブラリが保留イベントを検出できないという問題があります。それだけで私はキーボードイベントと記録のためpyaudio
ためを使用していますキー押下イベントでon_pressコールバックを複数回呼び出す
import pyaudio
import wave
from pynput import keyboard
CHUNK = 8192
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
frames = []
def on_press(key):
if key == keyboard.Key.cmd_l:
print('- Started recording -'.format(key))
try:
data = stream.read(CHUNK)
frames.append(data)
except IOError:
print 'warning: dropped frame' # can replace with 'pass' if no message desired
else:
print('incorrect character {0}, press cmd_l'.format(key))
def on_release(key):
print('{0} released'.format(
key))
if key == keyboard.Key.cmd_l:
print('{0} stop'.format(key))
keyboard.Listener.stop
return False
print("* recording")
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
..マイクが一つだけのサンプルを記録することを意味し、一度起こる押し、上検出します。 cmd_lが押されたときに記録されているように見えます。問題は、生成されたオーディオファイルに何も含まれていないか、または0.19秒という非常に短いです。
ストリームとの関係は複数回呼び出されなければならず、キー入力は1回だけ記録されるため、1つのサンプルだけが記録されます。
しかし、もしそうなら、どうすればstream.readを何度も呼び出させることができます。また、解放されていることを検出しながらも検出できますか? キーボードのon_holdメカニズムをサポートするライブラリがありますか?
スレッドで更新アプローチ:
from pynput import keyboard
import time
import pyaudio
import wave
CHUNK = 8192
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
frames = []
def callback(in_data, frame_count, time_info, status):
return (in_data, pyaudio.paContinue)
class MyListener(keyboard.Listener):
def __init__(self):
super(MyListener, self).__init__(self.on_press, self.on_release)
self.key_pressed = None
self.stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
stream_callback = self.callback)
print self.stream.is_active()
def on_press(self, key):
if key == keyboard.Key.cmd_l:
self.key_pressed = True
def on_release(self, key):
if key == keyboard.Key.cmd_l:
self.key_pressed = False
def callback(self,in_data, frame_count, time_info, status):
if self.key_pressed == True:
return (in_data, pyaudio.paContinue)
elif self.key_pressed == False:
return (in_data, pyaudio.paComplete)
else:
return (in_data,pyaudio.paAbort)
listener = MyListener()
listener.start()
started = False
while True:
time.sleep(0.1)
if listener.key_pressed == True and started == False:
started = True
listener.stream.start_stream()
print "start Stream"
elif listener.key_pressed == False and started == True:
print "Something coocked"
listener.stream.stop_stream()
listener.stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
started = False
私は1つのキーボードを監視する2つのスレッド、導入異なるアプローチを試み、他方は記録をソートします。しかし、この解決法はフレームを落とし続けるので、何も実際に記録されていないのですか?..
どうやって来ますか?
私は似たような解決策を試しました(あなたには私より多くのスレッドがあるようです)...しかし、私はあなたや私の記録できません、IOerrorを与え続けます。 – Smo