【问题标题】:Get Audio Amplitude from ALSA Raspberry Pi从 ALSA Raspberry Pi 获取音频幅度
【发布时间】:2016-10-23 14:06:35
【问题描述】:

我在我的 RasPi2 上设置了 Airplay,这样我就可以通过 wifi 向插入我的扬声器的 Raspberry Pi 播放音乐(该软件称为“shairplay”)。现在我想控制一些与当前播放的音频幅度同步的 LED 灯条。

所以我的问题是: 有什么办法可以从 ALSA 获得当前播放声音的振幅? (最好在 Python 中)

【问题讨论】:

    标签: python audio raspberry-pi raspberry-pi2 airplay


    【解决方案1】:

    此示例使用声音的最大振幅来使用 python 检测噪声。 可以使用相同的概念来绘制振幅,

    sox.sh

    #!/bin/sh
    filename=$1
    duration=$2
    arecord -q -f cd -d $duration -t raw | lame -r - $filename
    sox $filename -n stat 2>&1 | sed -n 's#^Maximum amplitude:[^0-9]*\([0-9.]*\)$#\1#p'
    

    soundcapture.py

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    import os
    import subprocess
    import sys
    import re
    import time
    
    def main(args=None):
    
        try:
            while True:
                filename = time.strftime("%Y%m%d%H%M%S") + ".wav"
                proc = subprocess.Popen(['sh','sox.sh', filename, '5' ], stdout=subprocess.PIPE)
                result,errors = proc.communicate()
                amplitude=float(result)
                print amplitude
                if amplitude > 0.15:
                    print 'Sound detected'
                    #os.rename(filename, "data/" + filename)
                else:
                    print 'No sound detected'
                    #os.remove(filename)
        except KeyboardInterrupt:
            print('')
        finally:
            print('Program over')
    
    if __name__ == '__main__':
        sys.exit(main(sys.argv[1:]) or 0)
    

    请查看github page了解更多详情。

    【讨论】:

      【解决方案2】:

      是的,确实有。您可以在 shell 中手动设置音量,但使用 python 中的 OS 模块可以在 python 中控制它。为什么这很重要?因为你可以使用变量。您可以购买 Adafruit 的 LED 灯条并使用 if 语句(基于您设置音量的变量)。一个示例代码是

      import os
      fubar = #volume here
      os.system('amixer cset numid=1 -- ' + fubar)
      if fubar > #whatever volume you want:
         #LED strip code here
      

      还有一个关于 Adafruit 的教程可以做到这一点!编程愉快!

      【讨论】:

      • 我不明白。 numid=1,iface=MIXER,name='PCM 播放音量'; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0 : values=0 | dBscale-min=-102.39dB,step=0.01dB,mute=1 0
      • 我不明白os.system('amixer cset numid=1 -- ' + fubar) 确实返回numid=1,iface=MIXER,name='PCM Playback Volume' ; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0 : values=0 | dBscale-min=-102.39dB,step=0.01dB,mute=1 0 这些值中的哪一个代表我的实际幅度?
      • 你所要做的就是在 amixer cset numed=1 后面放一个整数值
      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 2018-01-08
      • 2016-01-26
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      相关资源
      最近更新 更多