Source code for openpibo.audio

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

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

import os
from threading import Thread

HIGH = 1
LOW = 0

[문서]class Audio: """ Functions: :meth:`~openpibo.audio.Audio.play` :meth:`~openpibo.audio.Audio.stop` :meth:`~openpibo.audio.Audio.mute` :meth:`~openpibo.audio.Audio.record` mp3, wav 오디오 파일을 재생 및 정지합니다. example:: from openpibo.audio import Audio audio = Audio() # 아래의 모든 예제 이전에 위 코드를 먼저 사용합니다. """ # volume: 0 ~ 100 # filename: mp3/wav def __init__(self): os.system(f'gpio mode 7 out;gpio write 7 {HIGH}')
[문서] def play(self, filename, volume=80, background=True, volume2=1.0): """ mp3 또는 wav 파일을 재생합니다. example:: audio.play('/home/pi/openpibo-files/audio/test.mp3', 80, True) :param str filename: 재생할 파일의 경로를 지정합니다. mp3와 wav 형식을 지원합니다. :param int volume: 음량을 설정합니다. (0~100) :param bool background: 오디오 파일을 백그라운드에서 실행할지 여부를 결정합니다. 백그라운드에서 오디오가 재생되면, 오디오 재생되는 도중에 다른 명령어를 사용할 수 있습니다. * ``True``: 백그라운드에서 재생합니다. (default) * ``False``: 백그라운드에서 재생하지 않습니다. :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) + 50 # 실제 50 - 100%로 설정, 0-50%는 소리가 너무 작음 cmd = f'amixer -q -c Headphones sset Headphone {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): """백그라운드에서 재생중인 오디오를 정지합니다. example:: audio.stop() """ os.system('sudo pkill play')
[문서] def mute(self, value): """파이보를 무음모드로 만듭니다. 인스턴스(pibo_audio)를 생성하면, 기본적으로 무음모드는 해제되어있습니다. 무음모드에서는 ``play`` 메소드를 사용해도 소리가 출력되지 않습니다. example:: audio.mute(True) :param bool value: * ``True``: 무음모드 설정. * ``False``: 무음모드 해제. """ if type(value) != bool: raise Exception(f'"{value}" is not a bool') opt = LOW if value else HIGH os.system(f'gpio write 7 {opt}')
[문서] def record(self, filename, timeout=5, verbose=True): """ 마이크로 소리를 녹음합니다. example:: audio.record('/home/pi/test.wav', 5) :param str filename: 녹음한 파일이 저장 될 경로. ``wav`` 확장자를 사용합니다. :param int timeout: 녹음 시간(s) """ if verbose == True: os.system(f'arecord -D 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 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()