immersive2/src/util/voiceRecognizer.ts

98 lines
5.3 KiB
TypeScript

import {VuMeterEngine, WebVoiceProcessor} from "@picovoice/web-voice-processor";
import {EagleProfilerEnrollFeedback, EagleProfilerWorker, EagleWorker} from "@picovoice/eagle-web";
import {PvEngine} from "@picovoice/web-voice-processor/dist/types/types";
import {base64} from "rfc4648";
import {CobraWorker} from "@picovoice/cobra-web";
export class VoiceRecognizer {
private readonly profile = 'TT4GLAFik3sHYasWTbmNc7CX2xmJifp897E6xyJDwcD8rHA1ZgJTdLaLQ0Z1zJP3Lzv61JMJpuNsgSSxraWf62RECXJHA4SJ5RCSv3/MHXcnKlaGzcQ4gJD/vcl8tL45j02me6lNf1TtbI81qv/GBSH9u3p5V/p7fD1j/tZ8P3kzM40FG1QxP330Sp/dvSwU6oEc5iH7+D3Zsy4GEtD3iqGdAex4200elW753eXlKli92qLlaplDxCZZIwNG0/ER51NhVzg/D+ieZLE/rUjZAl+z4a9c7AurnQDTZ1fKyzwMzjiQsb8h6rIco+IlblAuE8dmVfFxZXrpfw8tViK5KwnpbHrnR8ebLA0Zd/G5l0yjXeCEh8Y26qkGZk43MolBgQ044KNNsJbDrm1o2sYGvo/BgEronFuBB+wNw0pVFqp1nrIqfT8IsH42q4rj7ByzxH+4QVr1uQVx7c89GTp1yYyqk+q9B+f0cG063KwnUofddkx0tmot3d8kPCZGL1H88qMm2NdNeCU6AFi1qhP1Ssd3jOsyzd4O3U9JMJIUruySzf6Qx3/JI4aSKJm0To/xEszrm028s1qD8I0+Kh3GxgtiW+toCzJrAIoRkxmIgV2HbOStjerTQDK2t1MMHpHEr7NfNaJxxripR2xDlw/r1Sh2sf58AhIYBk1b/U54PCsm7tWKc0YroWgO5qSpASdkIq2UX7AgQ6nWtcZPk5d5xdfRkhIy3Yf6yushwEz/+v3aa/fshkh9lbKnz2wt4MhmbMJv7WYenHQr0RvEDQFchNHUyx8D7fBLpKwrmHVDi0meG7pl0Q9DrFzykeBZi0m22T6xF5OUBqvUZWdcqa5ZoYvPZS5Uk0d3COhAGjgFEAL7IMK9rZei24mM98+vqyfD1RRK29rQFljHxO9lJ0N3NINW2PfZulPPqn0OtEhxU829W1k1JjOUgOucJUpI9D0H1vrcqTYq0F4mj3YTqJ0CNbqXEan+XlbjB6kGKDuO1V/YkLbShJRnmKVtaCS2m4zDCJ5Rc7x8J7E/Cx6AnVK7UWM9CLnnLoaJ6sib9UnBV1uSTK2BIp1mO8b+BjP2yJ2/l1xbYUPZQa/ECRarwDP9PY9lHym6WGf35BjuWBwxT6obifw9JyYaqFZxwNbKviqKshSW8wmh5euYu3s0hY/MhCD+ZCYZiJAXADArcv8z8Wlk1x/KmZwLOAKJfgDUcs+9Q8aKGq5/jTPcd6MuM5pAVwfoFMR9QD8uKmyrPuBdJMRZFULX0uqliyna2CTmsAJ+6B47AA61q1/50Vj8OTUBLi+fhIaw3Ch1ofMYopIqc+QT81ekH8b9/+pXaUi+moA6C53Mnch9hB/uKoJELPSNDpIy1fP08Ujv/K0Foft4X43w9dImveOEhw==';
public constructor() {
this.start();
}
public async start() {
let voicePresent = false;
const eagleProfiler = await EagleProfilerWorker.create(
'qQG03oXEGQRfPbX7H1VTZHLy/zelmMxcWXSy14/pskqri4LTJvBWmQ==',
{publicPath: '/voice/eagle_params.pv'}
)
const bytes = base64.parse(this.profile);
const eagle = await EagleWorker.create('qQG03oXEGQRfPbX7H1VTZHLy/zelmMxcWXSy14/pskqri4LTJvBWmQ=='
, {publicPath: '/voice/eagle_params.pv'},
[{bytes: bytes}]);
let data: Int16Array = null;
const engine: PvEngine = {
onmessage: async (e: MessageEvent) => {
if (!voicePresent) {
return;
}
switch (e.data.command) {
case 'process':
const inputData = e.data.inputFrame;
const validation = await eagle.process(inputData);
if (validation && validation[0] > .99) {
console.log('verified');
}
console.log(validation);
if (data == null) {
data = inputData;
} else {
data = new Int16Array(data.length + inputData.length);
data.set(data, 0);
data.set(inputData, data.length - inputData.length);
}
if (data.length > eagleProfiler.minEnrollSamples) {
console.log('enrolling');
console.log(data.length);
const result = await eagleProfiler.enroll(data);
if (result.percentage >= 100) {
console.log(data);
console.log(EagleProfilerEnrollFeedback[result.feedback]);
const profile = await eagleProfiler.export();
//console.log(profile.bytes.buffer);
console.log(base64.stringify(profile.bytes));
//console.log(profile.bytes);
//console.log(profile.bytes.buffer.toString('base64'));
//console.log(profile);
//WebVoiceProcessor.unsubscribe(engine);
//WebVoiceProcessor.unsubscribe(engine);
//eagleProfiler.release();
}
}
console.log(inputData.length);
break;
}
}
}
const devices = await navigator.mediaDevices.enumerateDevices();
devices.forEach((device) => {
if (device.kind === 'audioinput') {
console.log(device.label + ' ' + device.kind + ' ' + device.deviceId);
}
});
const vuCallback = (db) => {
console.log(db);
}
WebVoiceProcessor.setOptions({deviceId: 'default'});
const vuEngine = new VuMeterEngine(vuCallback);
//WebVoiceProcessor.subscribe(vuEngine);
const cobra = await CobraWorker.create('qQG03oXEGQRfPbX7H1VTZHLy/zelmMxcWXSy14/pskqri4LTJvBWmQ==',
(isVoice) => {
voicePresent = (isVoice && isVoice > .85);
});
WebVoiceProcessor.subscribe(cobra);
WebVoiceProcessor.subscribe(engine);
}
}