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