gpt4 book ai didi

python - 在按键按下事件上多次调用 on_press 回调

转载 作者:太空宇宙 更新时间:2023-11-04 05:04:22 28 4
gpt4 key购买 nike

我试图在按下按钮时从我的麦克风录音,问题是我正在使用的库无法检测到暂停事件。它仅在按下时检测,这会发生一次,这意味着麦克风仅记录一个样本。

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()

我正在使用 pynput用于键盘事件和 pyaudio 用于记录。它似乎记录了何时按下 cmd_l 并在我释放时停止。问题是生成的音频文件不包含任何内容,或者非常短,只有 0.19 秒。

我想这可能与流有关。read 必须被多次调用,并且按键只被记录一次,因此只记录了一个样本。

但如果是这种情况,我如何让它多次调用 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

我尝试了一种不同的方法,引入了两个线程,一个监视键盘,另一个整理录音。但是此解决方案不断丢帧,因此实际上没有记录任何内容?..

怎么会呢?

最佳答案

你可以做类似 this answer 的事情在单独的线程上定期运行函数的地方。似乎是最简单的解决方案。

关于python - 在按键按下事件上多次调用 on_press 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44901146/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com