#!/usr/bin/env python3 import sys from argparse import ArgumentParser sys.path += ['.'] # noqa import os import json import numpy as np from speechpy.main import mfcc from precise.params import ListenerParams from precise import __version__ def load_graph(model_file): graph = tf.Graph() graph_def = tf.GraphDef() with open(model_file, "rb") as f: graph_def.ParseFromString(f.read()) with graph.as_default(): tf.import_graph_def(graph_def) return graph def buffer_to_audio(buffer): """Convert a raw mono audio byte string to numpy array of floats""" return np.fromstring(buffer, dtype='= self.pr.window_samples: remaining = self.pr.window_samples - ( self.pr.hop_samples - (len(self.buffer) - self.pr.window_samples) % self.pr.hop_samples) new_features = mfcc(self.buffer, self.pr.sample_rate, self.pr.window_t, self.pr.hop_t, self.pr.n_mfcc, self.pr.n_filt, self.pr.n_fft) self.features = np.concatenate([self.features[len(new_features):], new_features]) self.buffer = self.buffer[-remaining:] return self.runner.run(self.features) def main(): os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' stdout = sys.stdout sys.stdout = sys.stderr parser = ArgumentParser(description= 'stdin should be a stream of raw int16 audio,' 'written in groups of CHUNK_SIZE samples.' 'If no CHUNK_SIZE is given it will read until EOF.' 'For every chunk, an inference will be given' 'via stdout as a float string, one per line') parser.add_argument('-v', '--version', action='version', version=__version__) parser.add_argument('model_name') parser.add_argument('chunk_size', type=int, nargs='?', default=-1) parser.usage = parser.format_usage().strip().replace('usage: ', '') + ' < audio.wav' args = parser.parse_args() if sys.stdin.isatty(): parser.error('Please pipe audio via stdin using < audio.wav') global tf import tensorflow tf = tensorflow listener = Listener(args.model_name, args.chunk_size) try: while True: conf = listener.update(sys.stdin.buffer) stdout.buffer.write((str(conf) + '\n').encode('ascii')) stdout.buffer.flush() except (EOFError, KeyboardInterrupt): pass if __name__ == '__main__': main()