CMUS狮身人面像(七)-Android 上的 PocketSphinx

本教程介绍了GitHub上提供的演示应用程序。

PocketSphinx Android 演示

为了运行演示应用程序,我们建议使用 Android Studio。您可以从官方下载页面下载Android Studio IDE和sdk 。

从 Android Studio 构建并运行

为了在 IDE 中获取演示,请选择从 VCS 签出项目 ,选择GitHub 并输入项目 URL:https://github.com/cmusphinx/pocketsphinx-android-demo

项目设置完毕后,您的 IDE 将自动更新并下载所有依赖项。您现在应该能够运行该项目。

启动应用程序后,识别器将需要一些时间来初始化。初始化后,它将等待关键字"哦,强大的计算机"。一旦检测到此关键字,它会要求您选择演示 - "数字"、"天气"或"电话"。"digits"演示识别 0 到 9 的数字,"weather"演示识别天气预报,"phones"演示演示语音识别。

要尝试某个演示,请将此项目导入 IDE 并照常运行。如果出现错误,请检查 logcat 以获取更多详细信息。

从 Eclipse 构建并运行

我们不再支持 Eclipse 项目,请考虑升级 SDK。

从命令行构建并运行

您还可以使用 gradle 构建系统构建项目。

  1. 从 Github 克隆存储库:
    git clone https://github.com/cmusphinx/pocketsphinx-android-demo.git.
  2. 连接您的物理设备或设置虚拟设备。
  3. 创建一个文件local.properties指向 sdk 文件夹:
    sdk.dir = /home/user/android/sdk.
  4. 跑步gradle installDebug。它将在设备上构建并安装应用程序。
  5. 从设备应用程序菜单手动运行应用程序。

使用 pocketsphinx-android

在 Android 项目中引用该库

该库作为 Adroid Archive ( AAR )分发,其中包括针对不同架构的二进制 so 文件和独立的 Java 代码。

在 Android Studio 中,您需要将 AAR 包含到您的项目中。只需转到 File > New > New module 并选择Import .JAR/.AAR Package

您还可以使用命令行将 AAR 添加到您的项目中,如 本 stackoverflow 帖子中所述。

将 AAR 作为模块导入到项目中后,请确保将其列为主模块的依赖项app/build.gradle

highlight 复制代码
dependencies {
    compile project(':aars')
}

设置权限

为了存储资产文件,您的应用程序必须具有WRITE_EXTERNAL_STORAGE 权限。要录制音频,您需要RECORD_AUDIO 权限。请注意,从Android 6.0开始,RECORD_AUDIO不会自动启用,而是必须在应用程序设置中手动确认。

highlight 复制代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

包括资源文件

在 Android 中随应用程序传送资源文件的标准方法是将它们放在assets/项目的目录中。为了使它们可用于 pocketsphinx,这些文件应该有物理路径。但是,只要它们位于*.apk*中,它们就没有这样的物理路径。

pocketsphinx-android 中的类Assets提供了一种自动将资源文件复制到目标设备的外部存储的方法。 通过从位于顶部的文件edu.cmu.pocketsphinx.Assets#syncAssets中读取项目来同步资源。在复制之前,它会匹配资产和外部存储上同名文件的 MD5 校验和(以防存在)。assets.lst``assets/

它仅在信息不完整(外部存储上没有文件,.md5 文件不可用)或哈希不匹配时复制文件。PocketSphinxAndroidDemo 包含一个ant生成文件的脚本assets.lst.md5查找assets.xml.

ant请注意,如果构建脚本在构建过程中未正确运行,资产可能会不同步。因此,您应该确保脚本运行或创建 md5 文件和assets.lst您自己。

要将资产同步集成到您的应用程序中,请执行以下操作:

  1. 将构建文件从演示应用程序复制models/assets.xml到您的应用程序的同一文件夹中app
  2. 编辑app/build.gradle要运行的构建文件assets.xml,就像在 Android 演示中一样:
highlight 复制代码
ant.importBuild 'assets.xml'
preBuild.dependsOn(list, checksum)
clean.dependsOn(clean_assets)

这应该够了吧。您现在可以验证assets.lst文件是否已创建以及 md5 文件是否已更新。

示例应用程序

pocketsphinx-android 的类和方法的设计类似于 pocketsphinx 中使用的相同工作流程,不同之处在于基本数据结构被转换为类,而与这些结构一起使用的函数被转换为相应类的方法。因此,如果您熟悉 pocketsphinx,您也应该对 pocketsphinx-android 感到满意。

SpeechRecognizer访问解码器功能的主类。它是在构建器的帮助下创建的SpeechRecognizerSetup。ASpeechRecognizerBuilder允许配置解码器的主要属性以及其他参数。参数的键和值与在命令行上传递给 pocketsphinx 二进制文件的键和值相同。在此处阅读有关调整 pocketsphinx 性能的更多信息 。

highlight 复制代码
recognizer = defaultSetup()
	    .setAcousticModel(new File(assetsDir, "en-us-ptm"))
	    .setDictionary(new File(assetsDir, "cmudict-en-us.dict"))
	    .getRecognizer();
recognizer.addListener(this);

解码器配置是一个包含 IO 操作的漫长过程,因此建议在异步任务中运行它。

解码器支持多个命名搜索,您可以在运行时切换:

highlight 复制代码
// Create keyword-activation search
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);

// Create grammar-based searches
File menuGrammar = new File(assetsDir, "menu.gram");
recognizer.addGrammarSearch(MENU_SEARCH, menuGrammar);

// Next search for digits
File digitsGrammar = new File(assetsDir, "digits.gram");
recognizer.addGrammarSearch(DIGITS_SEARCH, digitsGrammar);

// Create language model search
File languageModel = new File(assetsDir, "weather.dmp");
recognizer.addNgramSearch(FORECAST_SEARCH, languageModel);

设置解码器并添加所有搜索后,您可以开始识别:

highlight 复制代码
recognizer.startListening(searchName);

onEndOfSpeech您将在识别器侦听器的回调中收到有关语音结束事件的通知。然后您可以致电recognizer.stop()recognizer.cancel()。后者会取消识别,前者会使最终结果传入onResult回调中。

在识别过程中,您将在onPartialResult 回调中收到部分结果。

您还可以访问 swig 中包装在 Java 类中的其他 Pocketsphinx 方法。有关详细信息,请检查、DecoderHypothesis类 。Segment``NBest

构建 pocketsphinx-android

Pocketsphinx 提供了预构建的二进制文件,在各种平台上编译它具有挑战性。除非您完全了解自己在做什么,否则您不应该自己构建它。我们建议使用预构建的二进制文件。

构建依赖关系

搭建步骤

您需要签出 sphinxbase、pocketsphinx 和 pocketsphinx-android 并将它们放在同一目录中。

highlight 复制代码
root-directory
├─ pocketsphinx
├─ sphinxbase
└─ pocketsphinx-android

旧版本可能与最新的 pocketsphinx-android 不兼容,因此您需要确保使用最新版本。您可以使用以下命令来签出存储库:

highlight 复制代码
git clone https://github.com/cmusphinx/sphinxbase
git clone https://github.com/cmusphinx/pocketsphinx
git clone https://github.com/cmusphinx/pocketsphinx-android

排列目录后,您需要更新local.properties 项目根目录中的文件并定义以下属性:

  • sdk.dir-- Android SDK 的路径
  • ndk.dir-- Android NDK 的路径

例如:

highlight 复制代码
sdk.dir=/home/user/local/adt-bundle-linux-x86_64-20140321/sdk
ndk.dir=/home/user/local/android-ndk-r9d

一切设置完毕后,运行gradle build。这将 创建pocketsphinx-android-5prealpha-debug.aar和 。pocketsphinx-android-5prealpha-release.aar``build/outputs/aar

相关推荐
圆号本昊36 分钟前
Flutter Android Live2D 2026 实战:模型加载 + 集成渲染 + 显示全流程 + 10 个核心坑( OpenGL )
android·flutter·live2d
冬奇Lab2 小时前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab2 小时前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO2 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊3 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑4 小时前
MySQL的TRIM函数
android·数据库·mysql
Dev7z5 小时前
基于Matlab的Logistic混沌映射语音信号加密与解密系统设计与仿真
人工智能·语音识别
mrsyf5 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者5 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql