#!/usr/bin/env python # -*- coding: utf-8 -*- # By Psychokiller1888 import json import os.path import paho.mqtt.client as mqtt import paho.mqtt.publish as publish import pytoml import signal import snowboydecoder import sys SNIPS_CONFIG_PATH = '/etc/snips.toml' interrupted = False siteId = 'default' mqttServer = '127.0.0.1' mqttPort = 1883 model = '' sensitivity = 0.4 hotwordId = 'default' def loadConfigs(): global mqttServer, mqttPort, siteId, hotwordId if os.path.isfile(SNIPS_CONFIG_PATH): with open(SNIPS_CONFIG_PATH) as confFile: configs = pytoml.load(confFile) if 'mqtt' in configs['snips-common']: if ':' in configs['snips-common']['mqtt']: mqttServer = configs['snips-common']['mqtt'].split(':')[0] mqttPort = int(configs['snips-common']['mqtt'].split(':')[1]) elif '@' in configs['snips-common']['mqtt']: mqttServer = configs['snips-common']['mqtt'].split('@')[0] mqttPort = int(configs['snips-common']['mqtt'].split('@')[1]) if 'bind' in configs['snips-audio-server']: if ':' in configs['snips-audio-server']['bind']: siteId = configs['snips-audio-server']['bind'].split(':')[0] elif '@' in configs['snips-audio-server']['bind']: siteId = configs['snips-audio-server']['bind'].split('@')[0] if 'hotword_id' in configs['snips-hotword']: hotwordId = configs['snips-hotword']['hotword_id'] else: print('Snips configs not found') def signal_handler(signal, frame): global interrupted interrupted = True def interrupt_callback(): global interrupted return interrupted def onHotword(): global mqttServer, mqttPort, siteId publish.single('hermes/hotword/{0}/detected'.format(hotwordId), payload=json.dumps({'siteId': siteId, 'modelId': 'default'}), hostname=mqttServer, port=1883) signal.signal(signal.SIGINT, signal_handler) if __name__ == '__main__': try: model = sys.argv[1] sensitivity = float(sys.argv[2]) except IndexError: print('Please provide model name and sensitivity as argument') sys.exit() if not os.path.isfile('{}.pmdl'.format(model)): print('The specified model doesn\'t exist') sys.exit() if sensitivity < 0 or sensitivity > 1: print('Sensitivity should by a float between 0 and 1') sys.exit() loadConfigs() detector = snowboydecoder.HotwordDetector('{}.pmdl'.format(model), sensitivity=sensitivity) print('Listening...') detector.start(detected_callback=onHotword, interrupt_check=interrupt_callback, sleep_time=0.03) detector.terminate()