本教程介绍了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 构建系统构建项目。
- 从 Github 克隆存储库:
git clone https://github.com/cmusphinx/pocketsphinx-android-demo.git
. - 连接您的物理设备或设置虚拟设备。
- 创建一个文件
local.properties
指向 sdk 文件夹:sdk.dir = /home/user/android/sdk
. - 跑步
gradle installDebug
。它将在设备上构建并安装应用程序。 - 从设备应用程序菜单手动运行应用程序。
使用 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
:
dependencies {
compile project(':aars')
}
设置权限
为了存储资产文件,您的应用程序必须具有WRITE_EXTERNAL_STORAGE 权限。要录制音频,您需要RECORD_AUDIO权限。请注意,从Android 6.0开始,RECORD_AUDIO不会自动启用,而是必须在应用程序设置中手动确认。
<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
您自己。
要将资产同步集成到您的应用程序中,请执行以下操作:
- 将构建文件从演示应用程序复制
models/assets.xml
到您的应用程序的同一文件夹中app
。 - 编辑
app/build.gradle
要运行的构建文件assets.xml
,就像在 Android 演示中一样:
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 性能的更多信息 。
recognizer = defaultSetup()
.setAcousticModel(new File(assetsDir, "en-us-ptm"))
.setDictionary(new File(assetsDir, "cmudict-en-us.dict"))
.getRecognizer();
recognizer.addListener(this);
解码器配置是一个包含 IO 操作的漫长过程,因此建议在异步任务中运行它。
解码器支持多个命名搜索,您可以在运行时切换:
// 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);
设置解码器并添加所有搜索后,您可以开始识别:
recognizer.startListening(searchName);
onEndOfSpeech
您将在识别器侦听器的回调中收到有关语音结束事件的通知。然后您可以致电recognizer.stop()
或 recognizer.cancel()
。后者会取消识别,前者会使最终结果传入onResult
回调中。
在识别过程中,您将在onPartialResult
回调中收到部分结果。
您还可以访问 swig 中包装在 Java 类中的其他 Pocketsphinx 方法。有关详细信息,请检查、Decoder
和Hypothesis
类 。Segment
NBest
构建 pocketsphinx-android
Pocketsphinx 提供了预构建的二进制文件,在各种平台上编译它具有挑战性。除非您完全了解自己在做什么,否则您不应该自己构建它。我们建议使用预构建的二进制文件。
构建依赖关系
搭建步骤
您需要签出 sphinxbase、pocketsphinx 和 pocketsphinx-android 并将它们放在同一目录中。
root-directory
├─ pocketsphinx
├─ sphinxbase
└─ pocketsphinx-android
旧版本可能与最新的 pocketsphinx-android 不兼容,因此您需要确保使用最新版本。您可以使用以下命令来签出存储库:
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 的路径
例如:
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