从ALSA Raspberry Pi获取音频振幅

时间:2016-10-23 14:06:35

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

我在我的RasPi2上设置了一个Airplay设置,所以我可以通过wifi播放音乐到我的Raspberry,它插在我的扬声器(shairplay)。现在我想控制一些LED灯条与当前播放的音频同步。

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

2 个答案:

答案 0 :(得分:0)

是的,确实存在。您可以在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还有一个教程可以做到这一点!快乐的节目!

答案 1 :(得分:0)

此示例使用声音的最大幅度来使用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了解详情。