小爱音箱
参考 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状态机示意:
打断播放
通过 mphelper pause 方法可以打断/暂停当前小爱同学的播放
一些场景:
- 询问小爱同学问题,小爱开始回答后,执行
mphelper pause方法,回答被终止播放 - 小爱同学播放音乐中,执行
mphelper pause方法,音乐被暂停。执行mphelper pause方法,音乐被继续播放
$ /usr/bin/mphelper pause
{
"code": 0
}