本帖最后由 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做自定义流程。 
 
 
 
 
 
 |