bugfix
This commit is contained in:
parent
3e33ad707c
commit
b4c8c816a8
@ -6,6 +6,8 @@ bricks.ASRClient = class extends bricks.VBox {
|
|||||||
start_icon:record.png,
|
start_icon:record.png,
|
||||||
stop_icon:stop.png
|
stop_icon:stop.png
|
||||||
ws_url:
|
ws_url:
|
||||||
|
icon_options
|
||||||
|
ws_params:
|
||||||
}
|
}
|
||||||
event:
|
event:
|
||||||
start: start recording, no params
|
start: start recording, no params
|
||||||
@ -19,21 +21,26 @@ bricks.ASRClient = class extends bricks.VBox {
|
|||||||
*/
|
*/
|
||||||
constructor(opts){
|
constructor(opts){
|
||||||
super(opts);
|
super(opts);
|
||||||
this.icon = new bricks.Icon({url:this.start_icon || bricks_resource('imgs/start_record.png')});
|
var icon_options = this.icon_options || {};
|
||||||
|
icon_options.url = this.start_icon || bricks_resource('imgs/start_recording.png');
|
||||||
|
this.icon = new bricks.Icon(icon_options);
|
||||||
this.status = 'stop';
|
this.status = 'stop';
|
||||||
this.icon.bind('click', this.toggle_button.bind(this));
|
this.icon.bind('click', this.toggle_button.bind(this));
|
||||||
this.add_widget(this.icon);
|
this.add_widget(this.icon);
|
||||||
this.socket = new WebSocket(this.ws_url);
|
this.socket = new WebSocket(this.ws_url);
|
||||||
this.socket.onmessage = this.response_data.bind(this);
|
this.socket.onmessage = this.response_data.bind(this);
|
||||||
this.audioChunks = [];
|
this.bind('transtext', this.response_log.bind(this));
|
||||||
|
}
|
||||||
|
response_log(event){
|
||||||
|
console.log('response data=', event.params);
|
||||||
}
|
}
|
||||||
toggle_button(){
|
toggle_button(){
|
||||||
if (this.status == 'stop'){
|
if (this.status == 'stop'){
|
||||||
this.icon.set_url(this.start_icon||bricks_resource('imgs/start_record.png'));
|
this.icon.set_url(this.start_icon||bricks_resource('imgs/stop_recording.png'));
|
||||||
this.status = 'start';
|
this.status = 'start';
|
||||||
this.start_recording();
|
this.start_recording();
|
||||||
} else {
|
} else {
|
||||||
this.icon.set_url(this.stop_icon||bricks_resource('imgs/stop_record.png'));
|
this.icon.set_url(this.stop_icon||bricks_resource('imgs/start_recording.png'));
|
||||||
this.status = 'stop';
|
this.status = 'stop';
|
||||||
this.stop_recording();
|
this.stop_recording();
|
||||||
}
|
}
|
||||||
@ -43,9 +50,15 @@ bricks.ASRClient = class extends bricks.VBox {
|
|||||||
this.mediaRecorder = new MediaRecorder(this.stream);
|
this.mediaRecorder = new MediaRecorder(this.stream);
|
||||||
this.mediaRecorder.ondataavailable = (event) => {
|
this.mediaRecorder.ondataavailable = (event) => {
|
||||||
if (event.data.size > 0) {
|
if (event.data.size > 0) {
|
||||||
this.audioChunks.push(event.data);
|
|
||||||
// 将音频数据通过 WebSocket 发送到服务器
|
// 将音频数据通过 WebSocket 发送到服务器
|
||||||
this.socket.send(event.data);
|
blobToBase64(event.data).then((b64str) => {
|
||||||
|
var d = objcopy(this.ws_params);
|
||||||
|
d.type = 'audiobuffer';
|
||||||
|
d.data = b64str;
|
||||||
|
this.socket.send(JSON.stringify(d));
|
||||||
|
}).catch((error) => {
|
||||||
|
console.log('Error', error);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.mediaRecorder.start(1000); // 每 1 秒发送一次数据
|
this.mediaRecorder.start(1000); // 每 1 秒发送一次数据
|
||||||
|
@ -9,7 +9,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \
|
|||||||
binstreaming.js streaming_audio.js vadtext.js rtc.js docxviewer.js \
|
binstreaming.js streaming_audio.js vadtext.js rtc.js docxviewer.js \
|
||||||
llm_dialog.js llm.js websocket.js datarow.js tabular.js \
|
llm_dialog.js llm.js websocket.js datarow.js tabular.js \
|
||||||
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
||||||
keypress.js "
|
keypress.js asr.js webspeech.js "
|
||||||
echo ${SOURCES}
|
echo ${SOURCES}
|
||||||
cat ${SOURCES} > ../dist/bricks.js
|
cat ${SOURCES} > ../dist/bricks.js
|
||||||
# uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js
|
# uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js
|
||||||
|
@ -554,6 +554,16 @@ bricks.Queue = class {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function blobToBase64(blob) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onloadend = function() {
|
||||||
|
resolve(reader.result);
|
||||||
|
};
|
||||||
|
reader.onerror = reject;
|
||||||
|
reader.readAsDataURL(blob);
|
||||||
|
});
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
// 使用队列
|
// 使用队列
|
||||||
const queue = new Queue();
|
const queue = new Queue();
|
||||||
|
73
bricks/webspeech.js
Normal file
73
bricks/webspeech.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.WebTTS = class extends VBox {
|
||||||
|
constructor(opts){
|
||||||
|
super(opts);
|
||||||
|
}
|
||||||
|
speak(text){
|
||||||
|
// 检查浏览器是否支持SpeechSynthesis
|
||||||
|
if ('speechSynthesis' in window) {
|
||||||
|
var utterance = new SpeechSynthesisUtterance(text);
|
||||||
|
// 设置语音属性,例如语言
|
||||||
|
utterance.lang = bricks.app.lang;
|
||||||
|
utterance.pitch = 1;
|
||||||
|
utterance.rate = 1;
|
||||||
|
utterance.onstart = function(event) {
|
||||||
|
console.log('语音合成开始');
|
||||||
|
};
|
||||||
|
// 当语音合成结束时触发
|
||||||
|
utterance.onend = function(event) {
|
||||||
|
console.log('语音合成结束');
|
||||||
|
};
|
||||||
|
// 当语音合成出错时触发
|
||||||
|
utterance.onerror = function(event) {
|
||||||
|
console.error('语音合成出错:', event.error);
|
||||||
|
};
|
||||||
|
// 将utterance添加到语音合成队列
|
||||||
|
window.speechSynthesis.speak(utterance);
|
||||||
|
} else {
|
||||||
|
console.error('浏览器不支持SpeechSynthesis');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bricks.WebASR = class extends VBox {
|
||||||
|
constructor(opts){
|
||||||
|
super(opts);
|
||||||
|
this.reognition = None;
|
||||||
|
}
|
||||||
|
start_recording(){
|
||||||
|
// 检查浏览器是否支持SpeechRecognition
|
||||||
|
if ('SpeechRecognition' in window) {
|
||||||
|
// 创建SpeechRecognition实例
|
||||||
|
this.recognition = new SpeechRecognition();
|
||||||
|
// 处理识别错误
|
||||||
|
this.recognition.onerror = function(event) {
|
||||||
|
console.error('识别错误:', event.error);
|
||||||
|
};
|
||||||
|
// 处理语音识别结束事件
|
||||||
|
this.recognition.onend = function() {
|
||||||
|
console.log('语音识别已结束');
|
||||||
|
};
|
||||||
|
// 处理识别结果
|
||||||
|
this.recognition.onresult = function(event) {
|
||||||
|
var transcript = event.results[0][0].transcript;
|
||||||
|
this.dispatch('asr_result', {
|
||||||
|
content:transcript
|
||||||
|
});
|
||||||
|
console.log('识别结果:', transcript);
|
||||||
|
};
|
||||||
|
this.recognition.lang = bricks.app.lang;
|
||||||
|
this.recognition.start();
|
||||||
|
} else {
|
||||||
|
console.log('browser has not SpeechRecognition');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stop_recording(){
|
||||||
|
this.recognition.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bricks.Factory.register('WebTTS', bricks.WebTTS);
|
||||||
|
bricks.Factory.register('WebASR', bricks.WebASR);
|
||||||
|
|
6
examples/alipay_recharge.ui
Normal file
6
examples/alipay_recharge.ui
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"widgettype":"VBox",
|
||||||
|
"options":{
|
||||||
|
"height":"100%"
|
||||||
|
}
|
||||||
|
}
|
14
examples/asr.ui
Normal file
14
examples/asr.ui
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"widgettype":"ASRClient",
|
||||||
|
"options":
|
||||||
|
{
|
||||||
|
"ws_url":"{{entire_url('/wss/ws/test.ws')}}?userid={{get_user()}}",
|
||||||
|
"icon_options":{
|
||||||
|
"rate":3
|
||||||
|
},
|
||||||
|
"ws_params":{
|
||||||
|
"kkk":1,
|
||||||
|
"brade":"123"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
examples/recharge.ui
Normal file
36
examples/recharge.ui
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"widgettype":"IconbarPage",
|
||||||
|
"options":{
|
||||||
|
"bar_at":"top",
|
||||||
|
"bar_opts":{
|
||||||
|
"margin":"10px",
|
||||||
|
"rate":1.6,
|
||||||
|
"tools":[
|
||||||
|
{
|
||||||
|
"name":"wechat",
|
||||||
|
"icon":"{{entire_url('/imgs/weixinzhifu.png')}}",
|
||||||
|
"label":"微信充值",
|
||||||
|
"tip":"使用微信为账户充值",
|
||||||
|
"content":{
|
||||||
|
"widgettype":"urlwidget",
|
||||||
|
"options":{
|
||||||
|
"url":"{{entire_url('wechat_recharge.ui')}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name":"alipay",
|
||||||
|
"icon":"{{entire_url('/imgs/zhifubao.png')}}",
|
||||||
|
"label":"支付宝充值",
|
||||||
|
"tip":"使用支付宝为账户充值",
|
||||||
|
"content":{
|
||||||
|
"widgettype":"urlwidget",
|
||||||
|
"options":{
|
||||||
|
"url":"{{entire_url('alipay_recharge.ui')}}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
6
examples/wechat_recharge.ui
Normal file
6
examples/wechat_recharge.ui
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"widgettype":"VBox",
|
||||||
|
"options":{
|
||||||
|
"height":"100%"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user