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

相关推荐
Mercury Random1 小时前
Qwen 个人笔记
android·笔记
苏苏码不动了2 小时前
Android 如何使用jdk命令给应用/APK重新签名。
android
aqi002 小时前
FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher
android·ffmpeg·音视频·直播·流媒体
xiaoduyyy3 小时前
【Android】ToolBar,滑动菜单,悬浮按钮和可交互提示等的使用方法
android
liyy6143 小时前
Android架构组件:MVVM模式的实战应用与数据绑定技巧
android
K1t05 小时前
Android-UI设计
android·ui
吃汉堡吃到饱7 小时前
【Android】浅析MVC与MVP
android·mvc
深海呐13 小时前
Android AlertDialog圆角背景不生效的问题
android
ljl_jiaLiang13 小时前
android10 系统定制:增加应用使用数据埋点,应用使用时长统计
android·系统定制
花花鱼13 小时前
android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
android