如何在Python中记录输出

问题描述 投票:0回答:1

我正在尝试创建一个程序,实时从计算机获取音频并实时提供音符,但我遇到了这个问题:

line 568, in read
    raise IOError("Not input stream",
OSError: [Erron Not input stream] -9975

我已经尝试了一切让它发挥作用,但无济于事。

这是代码:

import pyaudio
import numpy as np
from scipy.fftpack import fftfreq  # Adjust for your scipy version
from scipy.signal import find_peaks
import math

def process_audio(audio_data):
    """
    Processes an audio data array to detect potential musical notes.

    Args:
        audio_data (np.ndarray): A NumPy array representing the audio data.

    Returns:
        list: A list of detected musical notes (optional).
              Returns an empty list if no notes are detected.
    """

    fft = np.fft.fft(audio_data)

    # Adjust for scipy version (remove f_s if necessary)
    frequencies = fftfreq(len(audio_data))  # Consider removing f_s

    peak_indices, _ = find_peaks(np.abs(fft))
    peak_frequencies = frequencies[peak_indices]

    # Apply threshold (adjust threshold as needed)
    threshold = 0.1 * np.max(np.abs(fft))
    detectable_indices = peak_indices[np.abs(fft[peak_indices]) > threshold]
    detectable_frequencies = peak_frequencies[np.abs(fft[peak_indices]) > threshold]

    # Process detectable frequencies (consider averaging or other techniques)
    # ...
    # Example: Convert frequencies to notes
    detectable_notes = [determine_note(f) for f in detectable_frequencies]

    return detectable_notes


def determine_note(frequency):
    """
    Converts a frequency value to a musical note (implementation not shown).

    Args:
        frequency (float): The frequency value in Hz.

    Returns:
        str: The corresponding musical note (e.g., "C", "D#", "A", etc.).
    """

    # ... (código de conversión de frecuencia a nota similar a la opción 1)

# Main program

p = pyaudio.PyAudio()

# Open stream for playback (input=False)
stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                output=True,  # Set output=True for speaker playback (optional)
                input=False)  # Set input=False to record from speaker

while True:
    data = stream.read(1024)
    audio_data = np.frombuffer(data, dtype=np.int16)

    detected_notes = process_audio(audio_data)
    if detected_notes:
        print(f"Possible notes: {', '.join(detected_notes)}")
    else:
        print("No notes detected")

stream.stop_stream()
stream.close()
p.terminate()
python numpy math scipy
1个回答
0
投票

您想从麦克风读取数据,因此应将流作为输入流打开。在

input=True
的调用中设置
PyAudio.open()

stream = p.open(format=pyaudio.paInt16,
                channels=1,
                rate=44100,
                input=True) 

您可能还需要在此调用中设置参数

frames_per_buffer
,例如
frames_per_buffer=1024

© www.soinside.com 2019 - 2024. All rights reserved.