App Inventor 2 语音合成与语音唤醒教程

« 返回首页

概述

App Inventor 2提供内置的语音合成(TTS)和语音识别组件,也支持扩展实现语音唤醒。

功能 组件 类型
语音合成 TextToSpeech 内置
语音识别 SpeechRecognizer 内置
语音唤醒 扩展 需第三方

语音合成(TTS)

TextToSpeech组件

组件面板 → MediaTextToSpeech

基本用法

当 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”)需要:

  1. 始终在后台监听麦克风
  2. 本地关键词检测模型
  3. 极低功耗运行

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中文朗读没有声音?

  1. 检查手机是否安装了中文TTS引擎(设置→语言→文字转语音)
  2. 尝试设置 Country = "CN" 而不是 "CHN"
  3. 部分手机需要下载中文语音数据包

Q2: 语音识别总是失败?

  1. 需要网络连接(大多数手机使用在线识别)
  2. 检查麦克风权限
  3. 在安静环境中使用
  4. 部分国产手机可能禁用了Google语音服务

Q3: 如何实现真正的语音唤醒?

App Inventor无法实现。真正的语音唤醒需要:

  • 使用Android原生开发(Java/Kotlin)
  • 集成PocketSphinx或Porcupine
  • 实现前台服务持续监听

如果只需要”语音控制”而非”语音唤醒”,按钮触发方案已经足够好用。

总结

功能 方案 推荐度
语音合成 TextToSpeech(内置) ⭐⭐⭐⭐⭐
语音识别 SpeechRecognizer(内置) ⭐⭐⭐⭐
语音控制 按钮+语音识别 ⭐⭐⭐⭐
语音唤醒 App Inventor无法实现
离线识别 PocketSphinx扩展(不稳定) ⭐⭐

版权声明:MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权,本文档由 ai2claw 🐝 整理。

文档反馈