我正在尝试创建一个程序,实时从计算机获取音频并实时提供音符,但我遇到了这个问题:
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()
您想从麦克风读取数据,因此应将流作为输入流打开。在
input=True
的调用中设置PyAudio.open()
:
stream = p.open(format=pyaudio.paInt16,
channels=1,
rate=44100,
input=True)
您可能还需要在此调用中设置参数
frames_per_buffer
,例如frames_per_buffer=1024
。