适用于斐讯 R1 音箱 (Phicomm R1 speaker) 的 Amazon Alexa 语音助手 app。基于 AlexaAndroid 框架开发(这个框架使用了 Alexa Voice Service (HTTP) API)。语音唤醒 ("Alexa") 使用的是 Snowboy。
- Target SDK level: 22 (Android 5.1) (ARMv7 only)
- Package: me.sagan.r1helper
- 本 app 可以安装运行在原厂固件的 R1 设备上。但如果想控制 R1 的底部 LED 灯,设备必须已经 root(需要拆机焊接 usb 并刷机)。
请注意:本语音助手不支持中文。Amazon alexa 目前支持英语、日语、法语、德语、葡萄牙语和意大利语等语言。默认使用英语。
首先把你自己的 Android app 签名证书放到项目根目录的 key.jks 文件。然后修改 app/build.gradle 里的证书信息(证书名、密码)为你自己的:
android {
signingConfigs {
release {
keyAlias 'key0'
keyPassword '123456'
storeFile file('../key.jks')
storePassword '123456'
}
}
}
然后请参考amazon alexa service的官方开发文档,在 amazon alexa voice service 控制台 创建一个新的 product 和 security profile。注意创建 security profile 时需要在页面上填入你的 app 包名和 app 签名证书的 md5 / sha256。
把创建的 Security Profile 里的 Android API key 保存为并替换 app/src/main/assets/api_key.txt 文件。然后修改 app/src/main/res/values/strings.xml 里 name="alexa_product_id" 的字符串为你创建的 amazon alexa voice service product 的 id。
最后使用 Android Studio 构建即可。
进行以下操作之前,请首先给R1音箱配网。(因为禁用了系统 app 后就无法通过长按顶部按键进入配网模式了)
首先用 adb 禁用 R1 自带的以下系统 app :
adb shell /system/bin/pm hide com.phicomm.speaker.player
adb shell /system/bin/pm hide com.phicomm.speaker.device
adb shell /system/bin/pm hide com.phicomm.speaker.airskill
adb shell /system/bin/pm hide com.phicomm.speaker.exceptionreporter
adb shell /system/bin/pm hide com.phicomm.speaker.ijetty
adb shell /system/bin/pm hide com.phicomm.speaker.netctl
adb shell /system/bin/pm hide com.phicomm.speaker.otaservice
adb shell /system/bin/pm hide com.phicomm.speaker.systemtool
adb shell /system/bin/pm hide com.phicomm.speaker.productiontest
adb shell /system/bin/pm hide com.phicomm.speaker.bugreport
其中最关键的是禁用掉 com.phicomm.speaker.player (EchoService) 和 com.phicomm.speaker.device (Unisound) 这两个。注意不要禁用 com.phicomm.speaker.launcher。
安装本 app 并立即启动
adb push app-debug.apk /data/local/tmp
adb shell /system/bin/pm install -t -r /data/local/tmp/app-debug.apk
adb shell /system/bin/am start -n me.sagan.r1helper/.MainActivity
启动时,本 app 会尝试请求 root 权限。如果 R1 没有 root,那么本 app 控制 LED 灯等部分功能不可用(详见下文)。
下次开机时,本 app 会自启动。
使用 Alexa 语音助手前,需要在 R1 设备上登录 amazon 帐号。首先还需要在 R1 上安装任意一个浏览器,测试用 Google Chrome 46.0.2490.76 (arm-v7a) 可以。然后用 adb 投屏工具(如 scrcpy)连接 R1,启动本程序,点击 "LOGIN" 按钮,然后在打开的浏览器里登录 amazon 帐号并授权本应用即可。
使用 "Alexa" (读音) 唤醒语音助手。如果想修改唤醒词,可以尝试在 snowboy 网站上生成自己的唤醒词语音模型,放到 R1 设备上 /sdcard/r1helper/ 目录下,然后修改本 app 的 snowboy_model 配置为你的模型文件名(参考下文)。
adb shell am force-stop me.sagan.r1helper
adb shell am start -n me.sagan.r1helper/.MainActivity
本 App 自带控制 R1 蓝牙模式控制、LED 灯控制功能。 开机时自动打开蓝牙。但控制 LED 灯需要 root 权限。
按 R1 顶部中央的按键可以在以下几种模式之间切换:
- 语音助手工作。LED 灯常亮:
- 播放音频时,显示氛围灯效果。
- 未播放音频时,根据当前时间在 0-24 点之间显示HSL光谱里不同的颜色。如 0 点显示红色。中午12点显示蓝色。
- 语音助手不工作。LED 灯关闭。
- 蓝牙配对模式:此模式下允许配对新的蓝牙设备。LED 灯交替闪烁蓝、白色。
如果没有 root,那么任何模式下 LED 灯都不会亮。
补充说明:
R1 控制 LED 灯方式本质上是向 /sys/class/leds/multi_leds0/led_color 这个设备文件写入11字节的数据。例如:
adb shell "echo -n '7fff ffffff' > /sys/class/leds/multi_leds0/led_color"
其中 ffffff 是 RGB 颜色数值( 000000 为 关闭 LED 灯)。但由于 selinux 限制,第三方 app 无法访问这个设备文件,除非获得 root 权限后关闭 selinux。
ALexa 语音助手默认使用英文。如果想要修改 Alexa 语言,可以用 adb 投屏工具打开本 app,(在已登录 amazon 帐号状态下)点击 "JA" 按钮切换语音助手语言为日语;再次点击 "EN" 按钮可以切换回英语。
如果想要修改为其他 Alexa 支持的语言,请参考下面“HTTP 接口”部分。
本 app 会在 tcp/9000 端口启动一个 http 服务器,通过这个 http 接口可以对本 app 和 R1 设备进行一些控制:
HTTP API 列表:
- GET /reboot : 重启设备。(需要 root 权限)
- GET /run?cmd=pwd : 在设备上运行一个命令并返回结果。(需要 root 权限)
- GET /status : 返回 app 运行状态、配置、最近日志等信息。
- GET /log : 返回 app 运行日志。
- GET /set?lang=ja-JP : 更改设备设定。可选参数:
- lang : 设置 Alexa 语音助手使用的语言。可选的 lang 语言值包括:de-DE, en-AU, en-CA, en-GB, en-IN, en-US, es-ES, es-MX, fr-CA, fr-FR, it-IT, ja-JP。
- mode : 更改 app 运行模式。mode 值:0 - 正常模式(显示 LED 灯和氛围灯效果); 1 - 关闭 LED 灯; 2 - 蓝牙配对模式 (LED灯交替闪烁蓝、白色)。
- GET /config?sensitivity=0.3 : 获取或修改 app (持久化)首选项参数。可选参数:
- sensitivity : 语音助手唤醒词识别敏感度。范围 [0,1]。数值越大则越容易唤醒,但误唤醒率也会更高。
- recordPausing : 毫秒数。> 0 则启用录音时本地语音结束检测(录音至少需已开始这么长时间才可能结束)。不推荐。Alexa服务器云端会自动检测语音结束。
- snowboy_model : 唤醒词检测使用的 snowboy 模型文件名。默认为 alexa.umdl。模型文件存放路径 /sdcard/r1helper。
- setpassword : 设置 HTTP API 的密码。
- GET /reset : 重置 Alexa 语音助手状态。如果语音助手一直没反应或不听使唤,可以尝试重置。可选参数 full=1 彻底重启 alexa 所有服务。
HTTP API 默认无需验证,使用 GET /config?setpassword=123 接口可以设置密码。设置密码以后,以上所有 API 访问时都必须带上 password 参数提供当前密码。
如果忘记了设置的密码,可以用 adb 清除本 app 全部数据以恢复初始状态:
adb shell /system/bin/pm clear me.sagan.r1helper
或卸载本 app 然后重新安装一次亦可。
adb shell /system/bin/pm uninstall me.sagan.r1helper
adb shell /system/bin/pm install -t -r /data/local/tmp/app-debug.apk
如果想用语音向 Alexa 查询天气、时间,需要先配置设备相关信息。
在PC上打开 Amazon alexa home 或在手机上安装 Amazon alexa app,用你的 amazon 账号登录,在 Settings 页面找到 "yourname 's R1-assistant" 设备(此设备即为你的安装了本 app 的设备),里面可以配置设备的地理位置、时区等信息。
由于 Amazon 的官方限制,本 app 的 alexa语音助手目前无法播放来自 Amazon Music,Audible 等音乐和媒体内容。