本帖最后由 rainmote 于 2021-9-15 10:31 编辑
接着上一篇探索,发现/var/log/messages有STT/TTS的日志记录,那就非常方便了,使用mosquitto_pub把监控到的日志发送到HASS的MQTT里,然后用node-red做自定义流程,和之前看到的帖子原理类似。这里就避免了逆向修改等复杂操作。
音箱自带了mosquitto_sub / mosquitto_pub相关命令,所以不需要从openwrt里编译相关程序。
#!/bin/sh
HOST_TYPE=lx05a
HOST_INDEX=1
# MQTT config
MQ_HOST=192.168.100.2
MQ_PORT=1883
MQ_USER="admin"
MQ_PASSWD="password"
MQ_STT_TOPIC=/xiaomi/$HOST_TYPE/$HOST_INDEX/stt
MQ_STT_RESP_TOPIC=/xiaomi/$HOST_TYPE/$HOST_INDEX/stt/resp
MQ_TTS_TOPIC=/xiaomi/$HOST_TYPE/$HOST_INDEX/tts
# log config
MONITOR_FILE=/var/log/messages
LOG_FILE=/tmp/stt.log
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)
export PATH=$PATH:$(pwd)
PUB_CMD=mosquitto_pub
stop_meida_player ()
{
ubus -t 1 call mediaplayer player_wakeup {"action":"stop"}
}
# while inotifywait -e modify $MONITOR_FILE;
# do
# line=$(tail -n1 $MONITOR_FILE)
# if echo "$line" | grep 'speech_recognizer.asr' | grep -q 'final=true'; then
# stt=$(echo "$line" | sed 's/.*asr=\([^,]*\).*dialog_id=\(.*\)/\2 \1/g')
# echo "Q: $stt" >> $LOG_FILE
# # id=$(echo "$stt" | awk '{print $1}')
# # text=$(echo "$stt" | awk '{print $2}')
# $PUB_CMD -t $MQ_STT_TOPIC -m "$stt" -h $MQ_HOST -p $MQ_PORT -u $MQ_USER -P $MQ_PASSWD
# elif echo "$line" | grep 'speech_synthesizer.dialog_id'; then
# res=$(echo "$line" | sed 's/.*dialog_id=\([^,]*\).*tts=\(.*\)/\1 \2/g')
# echo "A: $res" >> $LOG_FILE
# $PUB_CMD -t $MQ_STT_RESP_TOPIC -m "$res" -h $MQ_HOST -p $MQ_PORT -u $MQ_USER -P $MQ_PASSWD
# fi
# done
tail -f $MONITOR_FILE | \
while read -r line;
do
if echo "$line" | grep 'speech_recognizer.asr' | grep -q 'final=true'; then
stt=$(echo "$line" | sed 's/.*asr=\([^,]*\).*dialog_id=\(.*\)/\2 \1/g')
echo "Q: $stt" >> $LOG_FILE
# id=$(echo "$stt" | awk '{print $1}')
# text=$(echo "$stt" | awk '{print $2}')
set -x
$PUB_CMD -t $MQ_STT_TOPIC -m "$stt" -h $MQ_HOST -p $MQ_PORT -u $MQ_USER -P $MQ_PASSWD
set +x
elif echo "$line" | grep 'speech_synthesizer.dialog_id'; then
res=$(echo "$line" | sed 's/.*dialog_id=\([^,]*\).*tts=\(.*\)/\1 \2/g')
echo "A: $res" >> $LOG_FILE
set -x
$PUB_CMD -t $MQ_STT_RESP_TOPIC -m "$res" -h $MQ_HOST -p $MQ_PORT -u $MQ_USER -P $MQ_PASSWD
set +x
fi
done
订阅相关topic收到stt/tts的文本内容
➜ xiaomi bash sub.sh STT
935a91c98d4fda0ac78d523f15157414 今天天气怎么样
ccbe7482ae2c7d8a82743452dc1b7798 明天天气怎么样
6aae8841de1d6da693a37c1811cc6a26 电视频道调至CCTV十三
fad741e90e8ff928add983d5133fe230 关闭电视
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➜ xiaomi bash sub.sh STT_RESP
935a91c98d4fda0ac78d523f15157414 杭州西湖今天阴转小雨,现在阴,下午1点有小雨,记得带伞,23度到27度,和昨天差不多,空气质量指数40,空气挺好的
ccbe7482ae2c7d8a82743452dc1b7798 杭州西湖明天小雨转多云,记得带好雨具,22度到28度,西北风2级,空气质量非常好。
6aae8841de1d6da693a37c1811cc6a26 在你的账号下没有发现电视,请先在电视上登录账号吧
fad741e90e8ff928add983d5133fe230 在你的账号下没有发现电视,请先在电视上登录账号吧
后面就是接入node-red做自定义流程。
|