Skip to content
/ Embedded/XiaoAi
2/4/2026
6.6m
AI 摘要

通过刷机可SSH访问小爱音箱,支持语音播放、生成及音色切换。使用ubus调用mibrain实现TTS,支持保存/直接播放语音,音色可通过tts_vendor_switch切换,内置多种语音包及播放状态管理。

小爱音箱

参考 idootop/open-xiaoai 进行刷机,可以通过 SSH 访问小爱音箱

播放语音

在终端中执行下面的命令,可以让小爱音箱用小爱的默认声音读取出文本的内容

$ /usr/sbin/tts_play.sh 用小爱的声音说一句话吧

并且还比较地智能,可以智能分词停顿,例如明显能听出下面的两句文案读的时候的节奏区别

$ /usr/sbin/tts_play.sh 用小爱的声音说一句话吧  # 这里是“吧”
$ /usr/sbin/tts_play.sh 用小爱的声音说一句话把  # 这里是“把”

我们查看 tts_play.sh 内容:

$ cat tts_play.sh
source /usr/share/libubox/jshn.sh

play_text()
{
    local _result=$(ubus call mibrain text_to_speech "{\"text\":\"$1\",\"save\":1}")
    [ x"$_result" == x"" ] && exit 1
    json_init
    json_load "$_result"
    json_get_var _info info
    json_cleanup
    echo $_info
    json_init
    json_load "$_info"
    json_get_var _path path
    json_cleanup
    my_log "play text tts created $_path"
    echo $_path
    #[ x"$_path" == x"" ] && {
    #    miplayer -f /usr/share/sound/mibrain_service_unavailable.opus
    #    return 1
    #}
    miplayer -f $_path
    rm $_path
    return 0
}

player_stat=`/usr/bin/mphelper mute_stat`
/usr/bin/mphelper pause
play_text "$1"
[ x"$player_stat" == x"1" ] && {
    /usr/bin/mphelper play
}

会发现其实内部是通过 ubus call mibrain 调用 mibrain 的一些方法来实现的

生成语音

通过 text_to_speech 方法可以生成/播放语音,当同时传入了 save 参数为 1 时,会保存到文件,否则直接播放语音

$ ubus call mibrain text_to_speech '{"text":"生成语音测试","save":1}'
{
  "code": 0,
  "info": "{ \"path\": \"\\\/tmp\\\/tts\\\/tts_0c089cb4c7bf99c91418430172487da5_1767882456_906072.mp3\" }"
}
$ miplayer --file /tmp/tts/tts_0c089cb4c7bf99c91418430172487da5_1767882456_906072.mp3

通过 miplayer 可以播放生成的语音

直接播放语音

play 参数为 1 时,可以通过文本直接播放语音,不需要保存到文件,同时可以通过 volume 参数调整音量

$ ubus call mibrain text_to_speech '{"text":"我是蜜糖女声,音量调大啦","play":1,"volume":8,"save":0}'

生成语言依赖联网

使用过小爱音箱的都知道,当没有网络的时候,会播放:“网络服务遇到问题”。这句语音其实是内置在小爱音箱中的,所以不需要联网就可以播放:

$ miplayer -f /usr/share/sound/mibrain_service_unavailable.opus

所有方法

通过 ubus -v list mibrain 可以查看 mibrain 支持的所有方法

$ ubus -v list mibrain
'mibrain' @f6417737
"nlp_result_get":{}
"text_to_speech":{"text":"String","caller":"String","vendor":"String","codec":"String","volume":"Integer","save":"Integer","play":"Integer"}
"vendor_switch":{"vendor_name":"String"}
"vendor_who":{}
"ai_service":{"bypass":"String","caller":"String","duration":"Integer","id":"String","asr":"Integer","nlp":"Integer","tts":"Integer","asr_audio":"String","nlp_text":"String","nlp_execute":"Integer","tts_text":"String","tts_type":"String","tts_vendor":"String","tts_volume":"Integer","tts_codec":"String","tts_save":"Integer","tts_play":"Integer"}
"aivs_miio_token_update":{"token":"String","session_id":"String"}
"aivs_authorization_get":{}
"aivs_event_post":{"namespace":"String","name":"String","payload":"String"}
"aivs_track_post":{"event":"String","dialog_id":"String","extend":"String"}
"aivs_env_switch":{}
"tts_vendor_switch":{"vendor_name":"String","language_name":"String","switch_src":"String","dialog_id":"String","tone_type":"Integer"}
"tts_vendor_show":{}
"get_lan_tone_status":{}

查看所有音色

可以看到小爱音箱支持多种音色,我们在手机上可以通过 小爱音箱 应用来切换音色

$ ubus call mibrain tts_vendor_show
{
  "code": 0,
  "info": "{ \"vendor\": [ { \"name\": \"AiNiRobot\", \"desc\": \"蜜糖(甜美可爱女声)\", \"selected\": false }, { \"name\": \"XiaoMi\", \"desc\": \"茉莉(温柔知性女声)\", \"selected\": false }, { \"name\": \"XiaoMi_M88\", \"desc\": \"青葱(阳光活力男声)\", \"selected\": true } ], \"language\": [ { \"name\": \"cmn-Hans-CN\", \"desc\": \"普通话\", \"selected\": true }, { \"name\": \"yue-Hans-cant1236\", \"desc\": \"粤语\", \"selected\": false } ] }"
}

切换音色

也可以通过 tts_vendor_switch 方法来切换音色

$ ubus call mibrain tts_vendor_switch '{"vendor_name":"XiaoMi_M88"}'
{
  "code": 0
}

$ ubus call mibrain tts_vendor_switch '{"vendor_name":"XiaoMi"}'
{
  "code": 0
}

授权信息

通过 aivs_authorization_get 方法可以查看当前的授权信息

$ ubus call mibrain aivs_authorization_get
{
  "code": 0,
  "info": "MIOT-TOKEN-V1 app_id:1128715154251318272,session_id:21979_980525808_1767800780656986197,token:vt850oy6k7,device_id:62833\/A4ZD31783"
}

语言信息

通过 get_lan_tone_status 方法可以查看当前的语言信息

$ ubus call mibrain get_lan_tone_status
{
  "code": 0,
  "info": "{ \"language_name\": \"cmn-Hans-CN\", \"vendor_name\": \"AiNiRobot\" }"
}

其他内置语音

内置了多套音色的系统语音包,位于 /usr/share/sound-vendor 目录下

  • AiNiRobot: 蜜糖(甜美可爱女声)
  • XiaoMi: 茉莉(温柔知性女声)
  • XiaoMi_M88: 青葱(阳光活力男声)
  • XiaoMi_male: 男性音色
$ cd /usr/share/sound-vendor
$ ls
AiNiRobot    XiaoMi       XiaoMi_M88   XiaoMi_male
$ cd AiNiRobot
$ ls
bluetooth_already_connected.opus  mibrain_network_unreachable.opus  tip_shuoba.opus
bluetooth_connect.opus            mibrain_service_timeout.opus      tip_zaine.opus
bluetooth_disconnect.opus         mibrain_service_unavailable.opus  tip_zaine2.opus
bluetooth_discoverable.opus       mibrain_service_unreachable.opus  tts_vendor_demo.opus
bluetooth_failure.opus            mibrain_start_failed.opus         unknown_action.opus
bluetooth_noPhone.opus            mic_off.opus                      unknown_domain.opus
closeAlarm.opus                   mic_on.opus                       unknown_service.opus
enter_config_mode.opus            no_channel.opus                   upgrade_later.opus
enter_config_mode_l07a.opus       prompt_power_connected.opus       upgrade_now.opus
enter_config_mode_pre.opus        reset.opus                        wakeup_ei_01.wav
first_voice.opus                  reset_wait.opus                   wakeup_ei_02.wav
hourly_chime.opus                 service_timeout.opus              wakeup_mitv.opus
init_wifi_config.opus             setup_failure.opus                wakeup_wozai.wav
init_wifi_success.opus            tip_ai.opus                       wakeup_zai_01.wav
internet_disconnect.opus          tip_en.opus                       wakeup_zai_02.wav
mibrain_auth_failed.opus          tip_qingshaodeng.opus             wifi_disconnect.opus
mibrain_auth_failed_loading.opus  tip_shaodengo.opus                wifi_timeout_exit_config.opus
mibrain_connect_timeout.opus      tip_shenme.opus

播放一些内置语音:

$ miplayer -f /usr/share/sound-vendor/AiNiRobot/enter_config_mode.opus
# 已进入配置模式
$ miplayer -f /usr/share/sound-vendor/AiNiRobot/init_wifi_config.opus
# 小爱正在配网中
$ miplayer -f /usr/share/sound-vendor/AiNiRobot/init_wifi_success.opus
# 配网成功啦

其他内置声音

比如一些铃声、通知、警告等声音,和人声无关的,都在 /usr/share/common_sound 目录下

$ cd /usr/share/common_sound
$ ls
alarmDefault.opus        key_prev_next.opus       notice.opus              shutdown.opus            voip_ringing.opus
alarmDefault7s.opus      mesh_connecting.opus     notify.opus              timer_default.opus       volume.opus
bootup.opus              mesh_scanning.opus       power_connected.opus     voip_off.opus            wakeup.opus
brainTurnDownVol.opus    multirounds_tone.opus    power_disconnected.opus  voip_on.opus             welcome.opus
brainTurnUpVol.opus      network_done_miio.opus   reminder_default.opus    voip_ringback.opus

播放状态

通过 mphelper mute_stat 方法可以查看当前的状态

  • 0: 处于唤醒状态,等待用户说话中
  • 1: 处于播放状态,正在播放语音
  • 2: 处于暂停态,比如播放音乐后,再让小爱同学暂停音乐
  • 3: 处于休眠状态,用户说话的内容不会被处理
$ /usr/bin/mphelper mute_stat
# 0 | 1 | 2 | 3

状态机示意:

初始状态
唤醒
开始播放
超时/无指令
播放结束 (继续监听)
播放结束 (进入休眠)
暂停
继续播放
停止/退出
0 (唤醒/监听)
1 (播放/响应)
2 (暂停)
3 (休眠/静音)

打断播放

通过 mphelper pause 方法可以打断/暂停当前小爱同学的播放

一些场景:

  1. 询问小爱同学问题,小爱开始回答后,执行 mphelper pause 方法,回答被终止播放
  2. 小爱同学播放音乐中,执行 mphelper pause 方法,音乐被暂停。执行 mphelper pause 方法,音乐被继续播放
$ /usr/bin/mphelper pause
{
  "code": 0
}

Released under the MIT License.