python,打印麦克风声音频率

求一串代码
实时检测麦克风,打印声音的频率。
打印间隔可以调节。

学习用,希望注释写清楚点。

# -*- encoding:utf-8 -*-

import pyaudio as pa
import numpy as np
from scipy import fft as spfft

def spectrum_analyser(data, rate):
    """频谱分析
    
    data    - 采集到的声音离散数据
    rate    - 采样频率
    """
    
    T = (data.shape[0]-1)/rate # 信号时长
    valid = int(np.ceil(data.shape[0]/2))
    dforce = np.abs(spfft.fft(data)[:valid])/data.shape[0]
    f = np.argmax(dforce)/T # 信号频率
        
    return f
    
def start(rate=8000, secs=0.5, idle=0.5, chunk=1024):
    """连续测试声音频率
    
    rate    - 采样频率
    secs    - 每次采样时长(秒)
    idle    - 为了消除噪声,每次采样忽略起始信号的时长(秒)
    chunk   - 声卡读写缓冲区大小
    """
    
    ac = pa.PyAudio()
    stream = ac.open(
        format = pa.paInt16,            # 设置量化精度:每个采样数据占用的位数(2字节)
        channels = 1,                   # 设置单声道模式           
        rate = rate,                    # 设置采样频率
        frames_per_buffer = chunk,      # 设置声卡读写缓冲区     
        input = True                    # 设置声卡输出模式
    )
    
    while True:
        data = b''
        idle_len, valid_len = int(2*rate*idle), int(2*rate*secs)+2
        
        while len(data) < idle_len + valid_len:
            data += stream.read(chunk)
        
        data = np.frombuffer(data[idle_len:idle_len+valid_len], dtype=np.int16)
        f = spectrum_analyser(data, rate)
        print(f)
        

if __name__ == '__main__':
    # 启动频率计
    start()

更详细的说明,请参考我的这一篇博客:

假期无聊,我用傅里叶变换做了一个频率计,吉他定调口哨定音,样样好使! 当年《数学分析》考试通过后,那个高兴啊,心想,这一辈子总算再也不用和数学打交道了。没成想,新学期又开了一门叫做《工程数学》的专业课,专门讲傅里叶变换和拉普拉斯变换。全班同学为此郁闷了多半个学期。转眼间,三十多年过去了,拉氏变换早就还给了我的数学老师,唯独留下了傅里叶变换,偶尔还能有用武之地。这不,无聊的假期里,我用它做了一个音频的频率计,通过电脑上的声卡采集声音,用傅里叶变换完成时域-频域的转换,最后确定声音的主频率。用这个简陋的频率计来给吉他定调,比专业的定音器还好玩。 https://xufive.blog.csdn.net/article/details/105321849

你是的系统是windows还是linux?

参考:
https://www.csdn.net/tags/NtzaggxsNjY0NjktYmxvZwO0O0OO0O0O.html

还没用过这个库,有空我来试试,看代码应该不是很难的

用硬件采集可能更好:
https://www.bilibili.com/video/av208636136