如何通过使用arduino板和python脚本从电位计串行获取电压信号来调整音频文件的音量

如何通过使用arduino板和python脚本从电位计串行获取电压信号来调整音频文件的音量,python,python-2.7,audio,pydub,Python,Python 2.7,Audio,Pydub,我想通过调节电位计来调节mp3文件播放时的音量。我正在用python脚本通过Arduino板串行读取电位计信号。在pydub库的帮助下,我可以读取文件,但不能在播放时调整文件的音量。这是我经过长时间搜索后完成的代码 我只指定了Pydub部分的一部分。为您提供信息,我将使用vlc media player更改音量 >>> from pydub import AudioSegment >>> song = AudioSegment.from_wav("C:\Use

我想通过调节电位计来调节mp3文件播放时的音量。我正在用python脚本通过Arduino板串行读取电位计信号。在pydub库的帮助下,我可以读取文件,但不能在播放时调整文件的音量。这是我经过长时间搜索后完成的代码 我只指定了Pydub部分的一部分。为您提供信息,我将使用vlc media player更改音量

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

播放文件时,我无法调整该值。请有人解释一下怎么做。

首先,您需要将音频信号解码为原始音频,并将信号分割为X帧,然后您可以操纵音频,在每一帧,您可以改变音量、音高或速度,等等

要改变音量,您只需将原始音频向量乘以一个因子,这可以是电位计数据信号

如果向量为短整型或浮点型,则该因子可能不同

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

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

现在,您需要再次对矢量进行编码以播放新的帧音频,您可以使用from struct import pack和pyaudio来执行此操作

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:此示例适用于浮点格式

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)

pydub是一个用于处理音频的库;它不播放音频。另一方面,改变音量是在操纵播放器——你没有提到。您应该编辑您的问题,使所有这些都清楚-这不是pydub问题亲爱的Goncalopp,谢谢您的回答。我会考虑重新编辑这个问题。实际上我在用VLC播放器。是否有任何库可用于操纵播放器?或者我可以使用os.system或类似的东西。谢谢你也许应该检查一下,虽然这是非常有用的信息,但请注意,他想在文件播放时更改音量,而不是实际更改文件中数据的振幅是的,我知道,这是一种方式,如果你分割音频,你想在N帧中播放,可能大小为4096,stream.write将在每一帧播放音频,现在您可以在播放时更改振幅…非常感谢ederwander。。你理解我的问题,并给出了准确的答案。它正在流动,但我无法停止流动,也无法改变振幅。。即使我终止了进程,文件仍在继续流式传输。只有在重新启动电脑时才能停止。。
stream.write(EncodeAgain)
    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)