Python RPI : How do i dynamically adjust the volume of my wav file currently playing

标签 python raspberry-pi3 sensors pyaudio

目前使用 Raspberry Pi 3, pyaudio , ReSpeaker 2-Mics Pi HAT
如何在 RPI 中使用 python 调整播放的 .wav 文件的音量? (输出通过由听筒连接的扬声器 3.5mm 音频插孔输出)
我需要 RPI 来动态播放和调整音量,而无需我手动更改
不使用命令提示符中的命令访问 alsamixer。需要一些有关如何进行的建议。
以下是我的代码的当前进度(此代码将在 while 循环中播放):

            filename ="output.wav"
            
            RESPEAKER_RATE = 16000
            RESPEAKER_CHANNELS = 2
            RESPEAKER_WIDTH = 2
            RESPEAKER_INDEX = 0  
            chunk = 1024
            wf = wave.open(filename, 'rb')
            p = pyaudio.PyAudio()
            stream = p.open(
                    format = p.get_format_from_width(RESPEAKER_WIDTH),
                    channels = RESPEAKER_CHANNELS,
                    rate = RESPEAKER_RATE,
                    output = True
                )
            
           
            
            data = wf.readframes(chunk)
            while data != '':
                stream.write(data)
                data = wf.readframes(chunk)
            
            stream.stop_stream()
            stream.close()
            p.terminate()
尝试了这段代码,但并不是我真正想要实现的
尝试在播放时更改它而不是之前更改它
from pydub import AudioSegment

song = AudioSegment.from_wav("output.wav")
song = song - 60
quieter_song_data = song.get_array_of_samples()
quieter_song_fs = song.frame_rate4

最佳答案

在您的播放循环中,计算块的体积(例如使用均方根),然后如果它太高,则除以。
对于 8 位音频(128 是中性扬声器位置)

data = wf.readframes(chunk)
while data != '':
    data2 = (data-128)/128) # now from -1 to 1
    volume = sum(data2 ** 2) ** .5
    if volume > .6:
        data = data2/volume * .6
        data = data*128 + 128
        data = [max(min(int(d),255),0) for d in data]
        # convert data back to type stream is happy with here if needed
    stream.write(data)
    data = wf.readframes(chunk)

关于Python RPI : How do i dynamically adjust the volume of my wav file currently playing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64784843/

相关文章:

python - 对python循环感到困惑

python - 以最小的 acc_loss 回退到之前的权重ReduceLROnPlateau

python - 如何解决Python-C-API错误 "This is an issue with the package mentioned above, not pip."?

python - 如何获取 pygments 格式化程序的 css?

raspberry-pi3 - LIRC 部分读取 8 个字节

uwp - Windows 10 IoT Core Startup App Headed vs Headless

android - RPi 3 Android Things UART 双向通信崩溃应用程序

android - 在没有 GPS 的情况下获取设备移动方向

html - 如何在 nodejs 中通过 TCP/IP 获取传感器数据?

android - 每秒获取传感器值