Получите амплитуду звука от ALSA Raspberry Pi

У меня есть настройка Airplay на моем RasPi2, поэтому я могу воспроизводить музыку через Wi-Fi на моем Raspberry Pi, который подключен к моим динамикам (программное обеспечение называется shairplay). Теперь я хочу управлять некоторыми светодиодными лентами синхронно с амплитудой звука, который воспроизводится в данный момент.

Итак, мой вопрос: есть ли способ получить текущую звуковую амплитуду воспроизводимого звука от ALSA? (желательно в Python)


person Bauer Marius    schedule 23.10.2016    source источник


Ответы (2)


В этом примере используется максимальная амплитуда звука для обнаружения шума с помощью 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 для получения дополнительных сведений.

person Sufiyan Ghori    schedule 23.10.2016

Да, вообще-то есть. Вы можете вручную установить громкость в оболочке, но с помощью модуля ОС в Python вы можете управлять им в Python. Почему это важно? Потому что вы можете использовать переменные. Вы можете купить светодиодные ленты Adafruit и использовать операторы if (в зависимости от переменной, для которой вы установили громкость). Пример кода будет

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

Для этого есть также руководство по Adafruit! Удачного программирования!

person Will4cat    schedule 23.10.2016
comment
я не понимаю. numid = 1, iface = MIXER, name = 'Громкость воспроизведения PCM'; type = INTEGER, access = rw --- R -, values ​​= 1, min = -10239, max = 400, step = 0: values ​​= 0 | dBscale-min = -102,39 дБ, шаг = 0,01 дБ, отключение звука = 1 0 - person Bauer Marius; 23.10.2016
comment
я не понимаю 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 какое из этих значений представляет мою фактическую амплитуду? - person Bauer Marius; 23.10.2016
comment
Все, что вам нужно сделать, это поставить целое число после amixer cset numed = 1 - person Will4cat; 12.11.2016