Запись при нажатой клавише, остановка при отпускании клавиши

В настоящее время я пытаюсь сделать простой скрипт на Python для создания речевых данных.

Идея сценария заключается в том, что запись начинается с pyaudio, когда клавиша нажата и удерживается, и останавливает запись, когда клавиша отпущена.

В настоящее время я немного смущен тем, как я должен реализовать while key hold / stop at release mechanism.

я нашел эту библиотеку keyboard, но не может иметь смысла, включает ли это эту форму механизма?

2 ответа

Согласно этому коду в источнике библиотеки "клавиатура", он предоставляет такой механизм, чтобы определять, нажата ли клавиша в данный момент. так что вы можете просто сделать цикл while, чтобы проверить, выпустил ли пользователь этот ключ.

#/usr/bin/python
# file: __init__.py
# ...
def is_pressed(key):
    """
    Returns True if the key is pressed.
        is_pressed(57) -> True
        is_pressed('space') -> True
        is_pressed('ctrl+space') -> True
    """
    _listener.start_if_necessary()
    if is_number(key):
        return key in _pressed_events
    elif len(key) > 1 and ('+' in key or ',' in key):
        parts = canonicalize(key)
        if len(parts) > 1:
            raise ValueError('Cannot check status of multi-step combination ({}).'.format(key))
        return all(is_pressed(part) for part in parts[0])
    else:
        for event in _pressed_events.values():
            if matches(event, key):
                return True
        return False

Я столкнулся с подобной проблемой во время работы над проектом. Вот мой упрощенный подход, использующий толькоkeyboardмодуль.

Мы можем разделить проблему на 3 части:

  1. Ожидание нажатия клавиши
  2. Запись, пока клавиша нажата (удерживается)
  3. Остановить запись после выпуска ключа

Первая часть сложна, существует несколько решений, использующихlisteners,while Trueпетли,inputиraw_inputреализации. Я боролся с настройкой этих реализаций и продолжилkeyboard.wait(<your key choice>). Это блокирует программу до тех пор, пока не будет нажата выбранная клавиша. Если вы не передадите ни одного аргумента, он будет ждать нажатия любой клавиши.

Вторая часть решаетсяwhileцикл, который выполняется до тех пор, пока не будет нажата клавиша. После того, как первые две решены, третья часть встает на свое место какis_pressedимеет механизм, который определяет, удерживается/нажата ли клавиша. Именно на это указывает @Sajuuk в своем решении.

Вот реализация кода:

      import pyaudio
import keyboard

def audioRecord(object):
    chunk = 1024  # Record in chunks of 1024 samples
    sample_format = pyaudio.paInt16  # 16 bits per sample
    channels = 2
    fs = 44100  # Record at 44100 samples per second

    p = pyaudio.PyAudio()  # Create an interface to PortAudio

    # Open the stream
    stream = p.open(format=sample_format,
                                channels=channels,
                                rate=fs,
                                frames_per_buffer=chunk,
                                input=True)
    
    frames = []  # Initialize array to store frames

    # ----- Solution starts here -----
    print('Hold Space to record')
    keyboard.wait('space') # Waits for key press
    if keyboard.is_pressed('space'):
        print('Recording...')

        while keyboard.is_pressed('space'): # Records till key is pressed/held down
            data = stream.read(chunk)
            frames.append(data)

    # Stop and close the stream 
    stream.stop_stream()
    stream.close()
    # Terminate the PortAudio interface
    p.terminate()

    print('Finished recording')

Теперь вы можете обрабатывать эти кадры в соответствии с вашими требованиями. Сохраните его в файл или обработайте кадры напрямую. Всего пара рекомендаций, добавьтеtimeoutдляkeyboard.wait()чтобы избежать блокировки программы на неопределенный срок.

Надеюсь, этот ответ поможет, ура :)

Другие вопросы по тегам