1500 Гц в течение 100 мс, 1900 Гц в течение 300 мс, 1200 Гц в течение 10 мс. и 1900 Гц в течение 300 мс
И я ожидал, что мое решение будет печатать «звуковые сигналы», указывающие частоту и длину. Но мое решение игнорировало короткие звуковые сигналы в течение 10 мс (и после некоторого эксперимента я обнаружил, что мои решения игнорируют все звуковые сигналы короче на 100 мс (и это также увеличивает некоторые частоты)
Мой нерабочий решение:
Код: Выделить всё
import numpy as np
from scipy.io import wavfile
def extract_frequencies_and_durations(wav_path, frame_duration=0.02, freq_tolerance=5):
rate, audio_data = wavfile.read(wav_path)
if audio_data.ndim > 1:
audio_data = np.mean(audio_data, axis=1)
frame_length = int(rate * frame_duration)
frequencies = []
durations = []
current_freq = None
current_duration = 0
for i in range(0, len(audio_data), frame_length):
frame = audio_data[i:i + frame_length]
fft_spectrum = np.fft.fft(frame)
freqs = np.fft.fftfreq(len(fft_spectrum), 1 / rate)
magnitude = np.abs(fft_spectrum)
dominant_freq = abs(freqs[np.argmax(magnitude)])
if current_freq is None or abs(dominant_freq - current_freq) > freq_tolerance:
if current_freq is not None:
frequencies.append(current_freq)
durations.append(current_duration)
current_freq = dominant_freq
current_duration = frame_duration
else:
current_duration += frame_duration
if current_freq is not None:
frequencies.append(current_freq)
durations.append(current_duration)
return frequencies, durations
# output
wav_path = 'test.wav'
frequencies, durations = extract_frequencies_and_durations(wav_path)
for freq, dur in zip(frequencies, durations):
print(f"{freq:.2f}Hz - {dur * 1000:.2f}ms")
Подробнее здесь: https://stackoverflow.com/questions/791 ... -wav-files