80 lines
1.9 KiB
JavaScript
80 lines
1.9 KiB
JavaScript
|
var bricks = window.bricks || {};
|
||
|
|
||
|
bricks.StreamAudio = class extends bricks.VBox {
|
||
|
constructor(opts){
|
||
|
opts.height = '100%';
|
||
|
opts.name = opts.name || 'asr_text';
|
||
|
super(opts);
|
||
|
this.button = new bricks.Button({label:'start'});
|
||
|
this.filler = new bricks.Filler({});
|
||
|
this.add_widget(this.button);
|
||
|
this.add_widget(this.filler);
|
||
|
this.text_w = new bricks.Text({text:' ', wrap:true});
|
||
|
this.filler.add_widget(this.text_w);
|
||
|
this.button.bind('click', this.toggle_status.bind(this));
|
||
|
}
|
||
|
toggle_status(){
|
||
|
if (this.upstreaming){
|
||
|
this.stop();
|
||
|
} else {
|
||
|
this.start();
|
||
|
}
|
||
|
}
|
||
|
start(){
|
||
|
this.button.text_w.set_otext('stop');
|
||
|
schedule_once(this._start.bind(this), 0.1);
|
||
|
}
|
||
|
async _start(){
|
||
|
if (bricks.vad){
|
||
|
await bricks.vad.stop();
|
||
|
}
|
||
|
var f = this.handle_audio.bind(this);
|
||
|
this.vad = await vad.MicVAD.new({
|
||
|
onSpeechEnd:(audio) => {
|
||
|
console.log(audio, this.vad);
|
||
|
this.handle_audio(audio);
|
||
|
}
|
||
|
});
|
||
|
this.vad.start();
|
||
|
bricks.vad = this;
|
||
|
this.upstreaming = new bricks.UpStreaming({url:this.url});
|
||
|
this.resp_text = '';
|
||
|
this.resp = await this.upstreaming.go();
|
||
|
await this.recieve_data();
|
||
|
}
|
||
|
stop(){
|
||
|
this.button.text_w.set_otext('start');
|
||
|
schedule_once(this._stop.bind(this), 0.1);
|
||
|
}
|
||
|
async _stop(){
|
||
|
if (this.upstreaming){
|
||
|
this.upstreaming.finish();
|
||
|
this.upstreaming = null;
|
||
|
}
|
||
|
await this.vad.pause();
|
||
|
bricks.vad = null;
|
||
|
}
|
||
|
async receive_data(){
|
||
|
const reader = resp.body.getReader();
|
||
|
const decoder = new TextDecoder('utf-8');
|
||
|
var line = await reader.readline();
|
||
|
while (line){
|
||
|
try {
|
||
|
var d = JSON.parse(line);
|
||
|
this.text_w.set_text(d.content);
|
||
|
} catch(e){
|
||
|
console.log(line, 'can not parse as a json');
|
||
|
}
|
||
|
line = await reader.readline();
|
||
|
}
|
||
|
}
|
||
|
handle_audio(audio){
|
||
|
console.log('handle_audil() called', audio);
|
||
|
var b64audio = btoa(audio);
|
||
|
this.upstreaming.send(b64audio);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bricks.Factory.register('StreamAudio', bricks.StreamAudio);
|
||
|
bricks.Factory.register('ASRText', bricks.StreamAudio);
|