如何获取声音对象的响度(Pygame)

问题描述 投票:0回答:1

我正在尝试制作一个程序来获取用户的麦克风输入,然后测量其响度。该代码是 This scriptPyloudnorm;

的组合
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,因为我在使用它时遇到了麻烦。

python pygame
1个回答
0
投票

好问题。该速率是在 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)    
© www.soinside.com 2019 - 2024. All rights reserved.