以单一频率值(PYTHON)转换小型WAV文件

我需要一个将麦克风logging的音调转换成键盘按键的程序。 例如:如果有人在麦克风上的400hz和600hz之间的频率上唱歌,平均音调是550hz,那么我将平均频率存储在variables“tom”中,并且按下我的键盘的“G”键。 即使是在编程方面我也是新手,我通过在python语言中使用Audiopy,通过录制小WAV文件来search并找出了一种方法,然后我可以读取这些文件并获得平均频率的数字,数字和一些ifs和elifs,按下按键(不是很难find一个代码按键),在一个巨大的WHILE,重复的过程中,而程序运行,所以我会说话的过程中,阅读小文件谈话会产生,然后转变成按键,根据口气。

主要的问题是,我不知道如何改变我logging在一个平均频率上的WAV文件。 有人可以帮我吗? 或者与大的图片? 因为我知道这种方法是不是一个很好的。 谢谢! 我正在使用这个代码来logging,我在Audiopy网站上find:

import pyaudio import wave import numpy as np import pyaudio CHUNK = 2048 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 RECORD_SECONDS = 1 WAVE_OUTPUT_FILENAME = "output1.wav" p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("* recording") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("* done chunk") stream.stop_stream() stream.close() p.terminate() 

按下这个键,这个其他的代码:

 import win32com.client shell = win32com.client.Dispatch("WScript.Shell") if tom >= 400 and tom<=500: shell.SendKeys("G") 

PS .:我正在使用Windows

您可以使用傅立叶变换将声音转换为频率。 更具体地说,使用由numpy.fft.rfft提供的一维离散傅立叶变换。

从立体声WAV文件中读取一秒钟并提取频率的示例。

 import wave import numpy as np with wave.open('input.wav', 'r') as wr: sz = wr.getframerate() # Read and process 1 second. da = np.fromstring(wr.readframes(sz), dtype=np.int16) left, right = da[0::2], da[1::2] # separate into left and right channel lf, rf = np.absolute(np.fft.rfft(left)), np.absolute(np.fft.rfft(right)) 

lfrf是包含每个频率强度的numpy数组。 使用numpy.argmax你可以得到最高强度的索引(频率)。

但尝试使用例如matplotlib来绘制结果。 你会看到数据中可能有多个峰值。 例如,您可能会在50 Hz或60 Hz处发现峰值。 这很可能是来自市电的干扰,应该通过清零数据来忽略。 60 Hz示例:

 lf[55:65], rf[55:65] = 0, 0 

以下是使用matplotlib从一秒钟声音片段制作的示例图。 上图显示了来自WAV文件的样本,而下图显示了转换为频率的相同数据。 这是一个人说话的图形,所以有许多高峰。 最高的是200赫兹左右。

示例图