18 from contextlib
import contextmanager
20 from speech_recognition
import Recognizer
30 A tool for recording X seconds of audio, and then playing them back. Useful 31 for testing hardware, and ensures 32 compatibility with mycroft recognizer loop code. 37 logging.getLogger(
'urllib3').setLevel(logging.WARNING)
42 """ Context manager blocking stdout and stderr completely. 44 Redirects stdout and stderr to dev-null and restores them on exit. 47 null_fds = [os.open(os.devnull, os.O_RDWR)
for i
in range(2)]
49 orig_fds = [os.dup(1), os.dup(2)]
51 os.dup2(null_fds[0], 1)
52 os.dup2(null_fds[1], 2)
57 os.dup2(orig_fds[0], 1)
58 os.dup2(orig_fds[1], 2)
59 for fd
in null_fds + orig_fds:
65 recognizer = Recognizer()
67 audio = recognizer.record(source, duration=duration)
68 with open(filename,
'wb')
as f:
69 f.write(audio.get_wav_data())
73 parser = argparse.ArgumentParser()
75 '-f',
'--filename', dest=
'filename', default=
"/tmp/test.wav",
76 help=
"Filename for saved audio (Default: /tmp/test.wav)")
78 '-d',
'--duration', dest=
'duration', type=int, default=10,
79 help=
"Duration of recording in seconds (Default: 10)")
81 '-v',
'--verbose', dest=
'verbose', action=
'store_true', default=
False,
82 help=
"Add extra output regarding the recording")
84 '-l',
'--list', dest=
'show_devices', action=
'store_true',
85 default=
False, help=
"List all availabile input devices")
86 args = parser.parse_args()
89 print(
" Initializing... ")
90 pa = pyaudio.PyAudio()
92 print(
" ====================== Audio Devices ======================")
93 print(
" Index Device Name")
94 for device_index
in range(pa.get_device_count()):
95 dev = pa.get_device_info_by_index(device_index)
96 if dev[
'maxInputChannels'] > 0:
97 print(
' {}: {}'.format(device_index, dev[
'name']))
100 config = Configuration.get()
101 if "device_name" in config[
"listener"]:
102 dev = config[
"listener"][
"device_name"]
103 elif "device_index" in config[
"listener"]:
104 dev =
"Device at index {}".format(config[
"listener"][
"device_index"])
106 dev =
"Default device" 107 samplerate = config[
"listener"][
"sample_rate"]
108 play_cmd = config[
"play_wav_cmdline"].replace(
"%1",
"WAV_FILE")
109 print(
" ========================== Info ===========================")
110 print(
" Input device: {} @ Sample rate: {} Hz".format(dev, samplerate))
111 print(
" Playback commandline: {}".format(play_cmd))
113 print(
" ===========================================================")
114 print(
" == STARTING TO RECORD, MAKE SOME NOISE! ==")
115 print(
" ===========================================================")
119 record(args.filename, args.duration)
121 record(args.filename, args.duration)
123 print(
" ===========================================================")
124 print(
" == DONE RECORDING, PLAYING BACK... ==")
125 print(
" ===========================================================")
126 status =
play_wav(args.filename).wait()
128 print(
'An error occured while playing back audio ({})'.format(status))
131 if __name__ ==
"__main__":
def record(filename, duration)