0

我想在播放 mp3 文件时通过调节电位器来调节音量。我正在通过带有 python 脚本的 Arduino 板串行读取电位器信号。在库的帮助下,pydub我可以读取文件,但在播放文件时无法调整文件的音量。这是我经过长时间搜索后完成的代码,我只指定了 Pydub 部分的一部分。供您参考,我正在使用 vlc 媒体播放器更改音量。

>>> from pydub import AudioSegment
>>> song = AudioSegment.from_wav("C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav")

播放文件时,我无法调整值。请有人解释如何做到这一点。

4

2 回答 2

0

首先,您需要将音频信号解码为原始音频并将信号拆分为 X 帧,然后您可以操作音频,并且在每一帧您都可以更改音量或更改音高或更改速度等!

要更改音量,您只需将原始音频矢量乘以一个因子(这可以是您的电位计数据信号)。

如果您的向量是短整数或浮点格式,这个因素可能会有所不同!

从 python 中的 wav 文件获取原始音频数据的一种方法是使用wavelib

import wave

spf = wave.open('wavfile.wav','r')

#Extract Raw Audio from Wav File
signal = spf.readframes(-1)
decoded = numpy.fromstring(signal, 'Float32');

现在您可以将解码的向量乘以一个因子,例如,如果您想增加 10dB,10^(DbValue/20)则需要在 python 中计算10**(10/20) = 3.1623

newsignal = decoded * 3.1623;

现在您需要再次对矢量进行编码以播放新的帧音频,您可以使用“ from struct import packpyaudio来完成它!

stream = pyaud.open(
    format = pyaudio.paFloat32,
    channels = 1,
    rate = 44100,
    output = True,
    input = True)

EncodeAgain = pack("%df"%(len(newsignal)), *list(newsignal))

最后播放你的帧音频,注意你会在每一帧都做,并且循环播放,这个过程太快了,延迟可以不知不觉!

stream.write(EncodeAgain)

PS:这个例子是浮点格式的!

于 2014-02-13T17:16:30.730 回答
0

Ederwander,正如你所说,我有treid 编码,但是在打包数据时,我得到的总和为零。所以它不是流媒体。我了解转换格式数据类型时可能会出现问题。这是我编写的代码。请看一下并说出建议

    import sys
    import serial
    import time
    import os
    from pydub import AudioSegment
    import wave
    from struct import pack
    import numpy
    import pyaudio
    CHUNK = 1024

    wf = wave.open('C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav', 'rb')

    # instantiate PyAudio (1)
    p = pyaudio.PyAudio()

    # open stream (2)
    stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels =   wf.getnchannels(),rate = wf.getframerate(),output = True)

    # read data
    data_read = wf.readframes(CHUNK)
    decoded = numpy.fromstring(data_read, 'int32', sep = '');
    data = decoded*3.123
    while(1):
          EncodeAgain = struct.pack(h,data)
           stream.write(EncodeAgain)
于 2014-02-17T12:36:35.433 回答