openpibo.audio의 소스 코드

"""
mp3, wav 오디오 파일을 재생, 정지하고 마이크로 소리를 녹음합니다.

Class:
:obj:`~openpibo.audio.Audio`
"""

import os
from threading import Thread

[문서] class Audio: """ Functions: :meth:`~openpibo.audio.Audio.play` :meth:`~openpibo.audio.Audio.stop` :meth:`~openpibo.audio.Audio.record` mp3, wav 오디오 파일을 재생 및 정지합니다. """
[문서] def play(self, filename, volume=80, background=True, volume2=1.0): """ mp3 또는 wav 파일을 재생 :param str filename: 오디오 파일 경로 (mp3, wav) :param int volume: 음량을 설정합니다. (0~100) :param bool background: 백그라운드 실행 여부 :param float volume2: 개별 음량을 조절합니다. (비율) """ def play_thread(args): os.system(args) if not os.path.isfile(filename): raise Exception(f'"{filename}" does not exist') if not filename.split('.')[-1] in ['mp3', 'wav']: raise Exception(f'"{filename}" must be (mp3|wav)') if type(volume) is not int or (volume < 0 or volume > 100): raise Exception(f'"{volume}" is Number(0~100)') if type(background) is not bool: raise Exception(f'"{background}" is not bool') if type(volume2) is not float or (volume2 < 0.0 or volume2 > 3.0): raise Exception(f'"{volume2}" is float(0.0~1.5)') volume = int(volume/2) + 40 # 실제 50 - 100%로 설정, 0-50%는 소리가 너무 작음 #cmd = f'amixer -q -c Headphones sset Headphone {volume}%;' cmd = f'amixer -q -c Headphones sset PCM {volume}%;' #cmd = f'amixer -q -c MAX98357A sset PCM {volume}%;' cmd += f'play -q -V1 -v {volume2} "{filename}"' if background: Thread(target=play_thread, args=(cmd,), daemon=True).start() else: os.system(cmd)
[문서] def stop(self): """ 재생 중인 오디오 정지 """ os.system('sudo pkill play')
[문서] def record(self, filename, timeout=5, verbose=True): """ 소리 녹음 (파이보 마이크 해당) :param str filename: 녹음한 파일 저장 경로. ``wav`` 확장자 :param int timeout: 녹음 시간(s) """ if verbose == True: os.system(f'arecord -D plug:dmic_sv -c2 -r 16000 -f S32_LE -d {timeout} -t wav -q -vv -V streo stream.raw;sox stream.raw -c 1 -b 16 {filename};rm stream.raw') else: os.system(f'arecord -D plug:dmic_sv -c2 -r 16000 -f S32_LE -d {timeout} -t wav -q stream.raw;sox stream.raw -q -c 1 -b 16 {filename};rm stream.raw')
if __name__ == "__main__": import time audio = Audio() audio.play("/home/pi/openpibo-files/audio/system/opening.mp3") time.sleep(3) audio.stop()