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

« 返回首页

概述

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

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

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

  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扩展(不稳定) ⭐⭐
文档反馈