我正在尝试制作一个程序来获取用户的麦克风输入,然后测量其响度。该代码是 This script 和 Pyloudnorm;
的组合import pygame as pg
import time
import soundfile as sf
import pyloudnorm as pyln
from pygame._sdl2 import (
get_audio_device_names,
AudioDevice,
AUDIO_F32,
AUDIO_ALLOW_FORMAT_CHANGE,
)
from pygame._sdl2.mixer import set_post_mix
pg.mixer.pre_init(44100, 32, 2, 512)
pg.init()
# init_subsystem(INIT_AUDIO)
names = get_audio_device_names(True)
print(names)
sounds = []
sound_chunks = []
def callback(audiodevice, audiomemoryview):
# print(type(audiomemoryview), len(audiomemoryview))
# print(audiodevice)
sound_chunks.append(bytes(audiomemoryview))
def postmix_callback(postmix, audiomemoryview):
print(type(audiomemoryview), len(audiomemoryview))
print(postmix)
set_post_mix(postmix_callback)
audio = AudioDevice(
devicename=names[0],
iscapture=True,
frequency=44100,
audioformat=AUDIO_F32,
numchannels=2,
chunksize=512,
allowed_changes=AUDIO_ALLOW_FORMAT_CHANGE,
callback=callback,
)
# start recording.
audio.pause(0)
time.sleep(2.5)
sound = pg.mixer.Sound(buffer=b"".join(sound_chunks))
data, rate = sound
meter = pyln.Meter(rate) #
loudness = meter.integrated_loudness(data)
print(loudness)
然而,这会导致“无法解压不可迭代的声音对象”的错误,因为原始版本是为了彻底分析音频文件而设计的。尝试通过 sound.get_raw() 分析原始块或字节串数据也会导致错误。
是否有任何方法可以将此分析应用于生成的声音对象,或者如果没有,可以将声音对象转换为音频文件吗?据我所知,Pygame 不允许您保存音频文件。我也不想使用 Pyaudio,因为我在使用它时遇到了麻烦。
好问题。该速率是在 pygaming 初始化期间定义的。
pyln.Meter
的输入应该是一个数组。总的来说,你需要使用这样的东西:
sound: Sound = pg.mixer.Sound(buffer=b"".join(sound_chunks))
rate, _, _ = pygame.mixer.get_init()
print (f"Rate {rate}")
data = pygame.sndarray.samples(sound)
print (data.shape)
meter = pyln.Meter(rate)
loudness = meter.integrated_loudness(data)
print(loudness)