概述
App Inventor 2提供内置的语音合成(TTS)和语音识别组件,也支持扩展实现语音唤醒。
| 功能 | 组件 | 类型 |
|---|---|---|
| 语音合成 | TextToSpeech | 内置 |
| 语音识别 | SpeechRecognizer | 内置 |
| 语音唤醒 | 扩展 | 需第三方 |
语音合成(TTS)
TextToSpeech组件
组件面板 → Media → TextToSpeech
基本用法
当 Screen1.初始化
设 TextToSpeech1.语言 = "zh" ' 中文
设 TextToSpeech1.国家 = "CN" ' 中国
设 TextToSpeech1.语速 = 1.0 ' 正常速度
设 TextToSpeech1.音高 = 1.0 ' 正常音高
当 按钮_朗读.被点击
调用 TextToSpeech1.朗读(输入框_文本.文本)
当 按钮_停止.被点击
调用 TextToSpeech1.停止()
语速和音高调整
当 滑块_语速.位置改变(位置)
' 语速范围 0.5 - 2.0
设 TextToSpeech1.语速 = 0.5 + 位置 / 100 * 1.5
当 滑块_音高.位置改变(位置)
' 音高范围 0.5 - 2.0
设 TextToSpeech1.音高 = 0.5 + 位置 / 100 * 1.5
支持的语言
| 语言代码 | 国家代码 | 语言 |
|---|---|---|
| zh | CN | 中文(简体) |
| zh | TW | 中文(繁体) |
| en | US | 英语(美式) |
| en | GB | 英语(英式) |
| ja | JP | 日语 |
| ko | KR | 韩语 |
| fr | FR | 法语 |
| de | DE | 德语 |
注意:实际可用的语言取决于手机安装的TTS引擎。大多数国产手机自带中文TTS引擎。
TTS完成回调
当 TextToSpeech1.朗读完成()
标签_状态.文本 = "✅ 朗读完成"
' 可以继续下一段
如果 还有下一段
调用 TextToSpeech1.朗读(下一段文本)
选择TTS引擎
当 Screen1.初始化
设 引擎列表 = TextToSpeech1.可用引擎
设 Spinner_引擎.元素 = 引擎列表
当 Spinner_引擎.选择完成(选中项)
设 TextToSpeech1.引擎 = 选中项
语音识别
SpeechRecognizer组件
组件面板 → Media → **SpeechRecognizer`
当 按钮_开始识别.被点击
调用 SpeechRecognizer1.获取文本()
当 SpeechRecognizer1.收到结果(结果)
标签_识别结果.文本 = 结果
' 可以配合TTS朗读回来
调用 TextToSpeech1.朗读("你说的是:" & 结果)
使用前检查
当 按钮_开始识别.被点击
如果 SpeechRecognizer1.可用
调用 SpeechRecognizer1.获取文本()
否则
标签_状态.文本 = "❌ 语音识别不可用"
语音唤醒
⚠️ 重要说明
App Inventor 没有内置语音唤醒组件。语音唤醒(如”小爱同学”、”OK Google”)需要:
- 始终在后台监听麦克风
- 本地关键词检测模型
- 极低功耗运行
App Inventor无法实现真正的低功耗语音唤醒。但可以用以下替代方案:
方案一:按钮触发语音识别(推荐)
用户点击按钮后开始语音识别,识别特定关键词执行操作:
设 命令列表 = ["开灯", "关灯", "开门", "关门", "播放音乐", "停止音乐"]
设 命令动作 = ["ON_LIGHT", "OFF_LIGHT", "ON_DOOR", "OFF_DOOR", "PLAY", "STOP"]
当 按钮_语音.被点击
调用 SpeechRecognizer1.获取文本()
当 SpeechRecognizer1.收到结果(结果)
标签_识别结果.文本 = 结果
设 i = 1
当 i ≤ 列表长度(命令列表)
如果 结果 包含 列表第i项(命令列表)
调用 执行命令(列表第i项(命令动作))
标签_状态.文本 = "✅ 执行:" & 列表第i项(命令列表)
返回
设 i = i + 1
标签_状态.文本 = "❌ 未识别到命令"
定义 执行命令(命令)
如果 命令 = "ON_LIGHT"
调用 蓝牙1.发送文本("L1_ON")
否则 如果 命令 = "OFF_LIGHT"
调用 蓝牙1.发送文本("L1_OFF")
否则 如果 命令 = "PLAY"
调用 Player1.播放()
方案二:持续监听(耗电,不推荐长时间使用)
使用扩展持续录音并检测关键词:
设 正在监听 = false
当 按钮_开始监听.被点击
设 正在监听 = true
调用 持续监听循环()
定义 持续监听循环()
如果 正在监听
调用 SpeechRecognizer1.获取文本()
当 SpeechRecognizer1.收到结果(结果)
如果 结果 包含 "你好"
调用 TextToSpeech1.朗读("你好,请问有什么可以帮你?")
' 继续监听
如果 正在监听
调用 持续监听循环()
问题:SpeechRecognizer每次只识别一段话,无法实现持续监听。且需要网络连接。
方案三:使用PocketSphinx扩展(离线语音识别)
部分开发者制作了基于PocketSphinx的离线语音识别扩展,可以实现本地关键词检测。但这个扩展不太稳定,需要自行编译。
实战案例:语音助手
功能
- 语音识别命令
- TTS回复
- 控制智能家居
设 命令映射 = 创建字典(
"开灯" → "LIGHT_ON",
"关灯" → "LIGHT_OFF",
"开门" → "DOOR_ON",
"关门" → "DOOR_OFF",
"几点了" → "TELL_TIME",
"天气" → "WEATHER",
"讲个笑话" → "JOKE"
)
当 SpeechRecognizer1.收到结果(结果)
设 匹配命令 = ""
设 键列表 = 从字典 命令映射 获取键列表()
设 i = 1
当 i ≤ 列表长度(键列表)
设 关键词 = 列表第i项(键列表)
如果 结果 包含 关键词
设 匹配命令 = 从字典 命令映射 获取 关键词
设 i = 列表长度(键列表) + 1 ' 跳出
设 i = i + 1
如果 匹配命令 ≠ ""
如果 匹配命令 = "TELL_TIME"
设 时间 = Clock1.格式化日期时间(Clock1.当前时间(), "HH点mm分")
调用 TextToSpeech1.朗读("现在是" & 时间)
否则 如果 匹配命令 = "JOKE"
调用 TextToSpeech1.朗读("程序员最讨厌什么?别人的代码没有注释。")
否则
调用 蓝牙1.发送文本(匹配命令)
调用 TextToSpeech1.朗读("好的,已执行")
否则
调用 TextToSpeech1.朗读("抱歉,我没有理解你的意思")
常见问题
Q1: TTS中文朗读没有声音?
- 检查手机是否安装了中文TTS引擎(设置→语言→文字转语音)
- 尝试设置
Country = "CN"而不是"CHN" - 部分手机需要下载中文语音数据包
Q2: 语音识别总是失败?
- 需要网络连接(大多数手机使用在线识别)
- 检查麦克风权限
- 在安静环境中使用
- 部分国产手机可能禁用了Google语音服务
Q3: 如何实现真正的语音唤醒?
App Inventor无法实现。真正的语音唤醒需要:
- 使用Android原生开发(Java/Kotlin)
- 集成PocketSphinx或Porcupine
- 实现前台服务持续监听
如果只需要”语音控制”而非”语音唤醒”,按钮触发方案已经足够好用。
总结
| 功能 | 方案 | 推荐度 |
|---|---|---|
| 语音合成 | TextToSpeech(内置) | ⭐⭐⭐⭐⭐ |
| 语音识别 | SpeechRecognizer(内置) | ⭐⭐⭐⭐ |
| 语音控制 | 按钮+语音识别 | ⭐⭐⭐⭐ |
| 语音唤醒 | App Inventor无法实现 | ❌ |
| 离线识别 | PocketSphinx扩展(不稳定) | ⭐⭐ |
版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。
扫码添加客服咨询