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