首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过arduino板卡和python脚本串行获取来自电位器的电压信号来调节音频文件的音量

如何通过arduino板卡和python脚本串行获取来自电位器的电压信号来调节音频文件的音量
EN

Stack Overflow用户
提问于 2014-02-13 20:04:40
回答 2查看 1.7K关注 0票数 0

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

代码语言:javascript
运行
复制
>>> from pydub import AudioSegment
>>> song = AudioSegment.from_wav("C:\Users\RAJU\Desktop\En_Iniya_Ponnilave.wav")

当文件正在播放时,我无法调整该值。请谁来解释一下怎么做。

EN

回答 2

Stack Overflow用户

发布于 2014-02-14 01:16:31

首先,你需要将你的音频信号解码成原始音频,并将你的信号分成X帧,你可以操纵你的音频,在每一帧你都可以改变音量、音高或速度,等等!

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

如果你的向量是短整型或者浮点型,那么这个因子可能会有所不同!

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

代码语言:javascript
运行
复制
import wave

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

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

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

代码语言:javascript
运行
复制
newsignal = decoded * 3.1623;

现在你需要再次编码矢量来播放新的帧音频,你可以使用"from struct import pack“和pyaudio来做这件事!

代码语言:javascript
运行
复制
stream = pyaud.open(
    format = pyaudio.paFloat32,
    channels = 1,
    rate = 44100,
    output = True,
    input = True)

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

最后播放你的帧音频,请注意,你将在每一帧都这样做,并在一个循环中播放它,这个过程太快了,并且延迟可能是不可察觉的!

代码语言:javascript
运行
复制
stream.write(EncodeAgain)

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-17 20:36:35

Ederwander,正如你所说的,我有treid编码,但当打包数据时,我得到的完全是零。所以它不是流媒体。我知道在转换格式数据时可能会出现问题,types.This就是我写的代码。请看一看,并说出建议

代码语言:javascript
运行
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21753764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档