首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我要用pyAudio来衡量什么?

我要用pyAudio来衡量什么?
EN

Stack Overflow用户
提问于 2019-06-17 22:10:02
回答 1查看 599关注 0票数 1

我正在使用python pyAudio库录制声音,并使用matplotlib绘制它。这里我正在记录音量,想知道它的值是多少,以及Dezibel是多少。

目前我认为它是用PCM录制的,但我不确定。

在这一部分中,我将按照docs中的描述设置一个流

代码语言:javascript
复制
# constants
CHUNK = 1024 * 2             # samples per frame
FORMAT = pyaudio.paInt16     # audio format (bytes per sample?)
CHANNELS = 1                 # single channel for microphone
RATE = 44100                 # samples per second

# pyaudio class instance
mic = pyaudio.PyAudio()

# stream object to get data from microphone
stream = mic.open(
    format=FORMAT,
    channels=CHANNELS,
    rate=RATE,
    input=True,
    output=True,
    frames_per_buffer=CHUNK
)

这是我测量音频信号的部分:

代码语言:javascript
复制
def measure():
    # binary data
    data = stream.read(CHUNK)  

    # convert data to integers, make np array, then offset it by 127
    data_int = struct.unpack(str(2 * CHUNK) + 'B', data)

    # create np array and offset by 128
    data_np = np.array(data_int, dtype='b')[::2]
    data_np = [i+127 for i in data_np]

下面是完整的代码:

代码语言:javascript
复制
import pyaudio      #for capturing the audio-signal
import struct       #for converting the binary-data from the signal to integer
import matplotlib.pyplot as plt     #for displaying the audio-signal

import numpy as np
import time

#functions
def plot_setup():
    # create matplotlib figure and axes
    fig=plt.figure()
    ax=fig.add_subplot(111)

    # variable for plotting
    x = np.arange(0, 2 * CHUNK, 2)

    # create a line object with random data
    line, = ax.plot(x, [128 for i in range(2048)], '-')

    # basic formatting for the axes
    ax.set_title('AUDIO WAVEFORM')
    ax.set_xlabel('samples')
    ax.set_ylabel('volume')
    ax.set_ylim(0, 255)
    ax.set_xlim(0, 2 * CHUNK)
    plt.xticks([0, CHUNK, 2 * CHUNK])
    plt.yticks([0, 128, 255])
    # show the plot
    plt.show(block=False)
    return fig, line

def measure():
    # binary data
    data = stream.read(CHUNK)  

    # convert data to integers, make np array, then offset it by 127
    data_int = struct.unpack(str(2 * CHUNK) + 'B', data)

    # create np array and offset by 128
    data_np = np.array(data_int, dtype='b')[::2]
    data_np = [i+127 for i in data_np]

    line.set_ydata(data_np)
    try:
        fig.canvas.draw()
        fig.canvas.flush_events()
    except:
        return 0

# constants
CHUNK = 1024 * 2             # samples per frame
FORMAT = pyaudio.paInt16     # audio format (bytes per sample?)
CHANNELS = 1                 # single channel for microphone
RATE = 44100                 # samples per second

# pyaudio class instance
mic = pyaudio.PyAudio()

# stream object to get data from microphone
stream = mic.open(
    format=FORMAT,
    channels=CHANNELS,
    rate=RATE,
    input=True,
    output=True,
    frames_per_buffer=CHUNK
)

if __name__=="__main__":
    fig, line=plot_setup()
    while True:
        m=measure()
        if m==0:
            break

这是当前输出(绘图):

Y轴上的值是255,我想知道它的单位,并将其转换为Dezibel。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-18 00:34:52

Y轴单位是绝对音量级别。如果你想转换成分贝dB,方程式是

Volume(dB) = 20*log10(v1/v0),其中v0是基本参照标高。

下面的urls有很多与声音、放大等相关的有用概念。

上面的http://www.sengpielaudio.com/calculator-soundvalues.htm有一个表,表中有dB与声级之间的关系。

http://www.sengpielaudio.com/calculator-FactorRatioLevelDecibel.htm

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56633079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档