1
1
mirror of https://github.com/leon-ai/leon.git synced 2024-12-21 07:41:39 +03:00
leon/hotword/index.js

84 lines
2.2 KiB
JavaScript
Raw Normal View History

2019-02-10 15:26:50 +03:00
/**
* This file allows to run a separate node to detect the wake word "Leon/Léon"
* You can consider to run this file on a different hardware
*/
2022-10-23 05:55:03 +03:00
const axios = require('axios')
2019-02-10 15:26:50 +03:00
const record = require('node-record-lpcm16')
2022-01-31 07:09:54 +03:00
const { Detector, Models } = require('@bugsounet/snowboy')
const { io } = require('socket.io-client')
2019-02-10 15:26:50 +03:00
2019-05-25 07:07:11 +03:00
process.env.LEON_HOST = process.env.LEON_HOST || 'http://localhost'
process.env.LEON_PORT = process.env.LEON_PORT || 1337
const url = `${process.env.LEON_HOST}:${process.env.LEON_PORT}`
2019-02-10 15:26:50 +03:00
const socket = io(url)
const { argv } = process
const lang = argv[2] || 'en'
2019-02-10 15:26:50 +03:00
socket.on('connect', () => {
socket.emit('init', 'hotword-node')
console.log('Language:', lang)
2019-02-10 15:26:50 +03:00
console.log('Connected to the server')
console.log('Waiting for hotword...')
})
2022-10-23 05:55:03 +03:00
;(async () => {
try {
await axios.get(`${url}/api/v1/info`)
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
const models = new Models()
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
models.add({
file: `${__dirname}/models/leon-${lang}.pmdl`,
sensitivity: '0.5',
hotwords: `leon-${lang}`
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
const detector = new Detector({
resource: `${__dirname}/node_modules/@bugsounet/snowboy/resources/common.res`,
models,
audioGain: 2.0,
applyFrontend: true
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
/*detector.on('silence', () => {
2022-09-03 13:17:16 +03:00
})*/
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
detector.on('sound', (/* buffer */) => {
/**
* <buffer> contains the last chunk of the audio that triggers the "sound" event.
* It could be written to a wav stream
*/
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
detector.on('error', () => {
console.error('error')
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
detector.on('hotword', (index, hotword, buffer) => {
/**
* <buffer> contains the last chunk of the audio that triggers the "hotword" event.
* It could be written to a wav stream. You will have to use it
* together with the <buffer> in the "sound" event if you want to get audio
* data after the hotword
*/
const obj = { hotword, buffer }
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
console.log('Hotword detected', obj)
socket.emit('hotword-detected', obj)
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
const mic = record.start({
threshold: 0,
verbose: false
})
2019-02-10 15:26:50 +03:00
2022-09-03 14:12:41 +03:00
mic.pipe(detector)
2022-10-23 05:55:03 +03:00
} catch (e) {
if (!e.response) {
console.error(`Failed to reach the server: ${e}`)
} else {
console.error(e)
}
2022-09-03 14:12:41 +03:00
}
2022-10-23 05:55:03 +03:00
})()