解决多条信息同时到达小爱,小爱播放混乱的问题
最近一直没搞定多条消息同时到小爱的时候,小爱只播放最后一条消息的问题。今天终于搞定了,发出来分享给大家: 核心还是delay节点。https://bbs.hassbian.com/forum.php?mod=image&aid=50444&size=300x300&key=872fdda20d5e134e&nocache=yes&type=fixnone
https://bbs.hassbian.com/forum.php?mod=image&aid=50445&size=300x300&key=e05e55f86138fc58&nocache=yes&type=fixnone
每一条到答小爱的语音信息,延迟10s, 10s播放完当前条后,下一条开始播放。单条超过10s的,依然会冲突。 但已经好太多了。
可以优化下逻辑,
用msg.delay复写延时参数,参数可以根据小爱语速和播报字数取值,比如1个字0.5s秒,
播报内容是msg.payload,然后根据字数附加一条msg.delay这样。 情非殇 发表于 2023-8-4 16:04
可以优化下逻辑,
用msg.delay复写延时参数,参数可以根据小爱语速和播报字数取值,比如1个字0.5s秒,
不明觉厉,可能我 水平还不够,大概能看懂,实现不出来。 我在论坛看到过相关的帖子,你可以找一下。delay 也能用,但是不好 KevinYAN 发表于 2023-8-4 19:14
不明觉厉,可能我 水平还不够,大概能看懂,实现不出来。
比如这样?!
讲道理,NR有直通小艾tts的节点。
情非殇 发表于 2023-8-5 17:41
比如这样?!
延迟控制精确控制了下
var current_message_spake_time = msg.spake_time * 1000;
var tts = msg.payload;
msg = {};
// get current time. unit: s
let d = new Date();
let new_time = d.getTime();
//msg.new_time_type= typeof(new_time);
// get before message end time.
var before_end = flow.get("before_end");
if (before_end) {
var x = new_time - before_end
//msg.x_type = typeof (x);
msg.x = x;
if (x >= 0) {
msg.delay = 0;
msg.start_time = new Date(new_time);
//msg.start_time_type = typeof (msg.start_time);
}else{
msg.delay = Math.abs(x);
msg.start_time = new Date(new_time + msg.delay);
//msg.start_time_type = typeof (msg.start_time);
}
}else{
msg.delay = 0;
msg.start_time = new Date(new_time);
}
msg.before_end = before_end;
msg.new_time = new_time;
msg.current_message_spake_time = current_message_spake_time;
msg.payload = tts
let start_time = msg.start_time.getTime();
let current_message_end_time = new Date(start_time + msg.current_message_spake_time);
flow.set("before_end", current_message_end_time);
return msg; 能不能完整分享下node流 情非殇 发表于 2023-8-5 17:41
比如这样?!
这个流可以,有可能可以作为gpt的小爱音箱流式输出方法。 dscao 发表于 2023-8-16 17:48
这个流可以,有可能可以作为gpt的小爱音箱流式输出方法。
谢谢大佬夸奖,gpt可用性没概念,随便乱写出来的:lol 完整自动延迟控制流程,我的小爱测试语速是2.7。 自己的自行测试哈。流程分享如下。
[{"id":"d746ba0c8e810306","type":"link in","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"Txa","links":["19e58efd13944be8","49a1705dbe7f83d1","e6a3c210b4e5209a","9f276073515b2efe","dca74ce884fffdf7","726e5530ec2ca56d"],"x":275,"y":1400,"wires":[["bc8ae7f1f2b64316"]]},{"id":"bc8ae7f1f2b64316","type":"function","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"播放时间","func":"\nfunction countChsEng(str) {\n // 匹配任意中文\n const regChinese = /[\\u4E00-\\u9FA5]/g;\n // 匹配任意英文字母\n // const regEnglish = //g;\n // 匹配任意英文单词\n const regEnglish = /\\b+\\b/g;\n\n let chCount = str.match(regChinese);\n let enCount = str.match(regEnglish);\n let xCount\n\n // match返回数组,length为出现次数\n chCount = chCount === null ? 0 : chCount.length;\n enCount = enCount === null ? 0 : enCount.length;\n xCount = chCount + enCount\n\n return {\n chCount,\n enCount,\n xCount\n };\n}\n\nvar tts = msg.payload.data.value;\n// 每秒3个字\nvar number = countChsEng(tts).xCount / 2.7;\n\nmsg = {};\nmsg.payload = tts;\nmsg.spake_time = number;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":1400,"wires":[["9447cd1b8183cb4b"]]},{"id":"9447cd1b8183cb4b","type":"function","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"延迟时间","func":"var current_message_spake_time = msg.spake_time * 1000;\nvar tts = msg.payload;\nmsg = {};\n\n\n// get current time. unit: s\nlet d = new Date();\nlet new_time = d.getTime();\n\n//msg.new_time_type= typeof(new_time);\n\n// get before message end time.\nvar before_end = flow.get(\"before_end\")||0;\n\nif (before_end>0) {\n var x = new_time - before_end\n msg.x_type = typeof (x);\n msg.x = x;\n if (x >= 0) {\n msg.delay = 0;\n msg.start_time = new Date(new_time);\n msg.start_time_type = typeof (msg.start_time);\n } else {\n msg.delay = Math.abs(x);\n msg.start_time = new Date(new_time + msg.delay);\n msg.start_time_type = typeof (msg.start_time);\n }\n} else {\n msg.delay = 0;\n msg.start_time = new Date(new_time);\n}\n\n\n\nmsg.before_end = before_end;\nmsg.new_time = new_time;\nmsg.current_message_spake_time = current_message_spake_time;\n\nmsg.payload = tts\n\nlet start_time = msg.start_time.getTime();\nlet current_message_end_time = new Date(start_time + msg.current_message_spake_time);\nflow.set(\"before_end\", current_message_end_time);\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":540,"y":1400,"wires":[["f2543d4939071f40"]]},{"id":"f2543d4939071f40","type":"delay","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"智能延迟","pauseType":"delayv","timeout":"1","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":680,"y":1400,"wires":[["b8d8987b1e4b518f"]]},{"id":"b8d8987b1e4b518f","type":"function","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"tts","func":"let tts_text = msg.payload\nmsg.payload = {\n \"data\": {\n \"value\": tts_text\n }\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":1400,"wires":[["51b3ce1084762bd0"]]},{"id":"51b3ce1084762bd0","type":"api-call-service","z":"4e296426d7d6e14e","g":"5689692658fb2d11","name":"小爱播报","server":"39d63457.baaeac","version":5,"debugenabled":false,"domain":"text","service":"set_value","areaId":[],"deviceId":[],"entityId":["text.xiaomi_l05b_a8c7_play_text_2"],"data":"{\"value\":\"{{payload}}\"}","dataType":"json","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"all","x":940,"y":1400,"wires":[["b3924e7e7f1ce96c"]]},{"id":"39d63457.baaeac","type":"server","name":"Home Assistant","addon":true}]
页:
[1]
2