【问题标题】:Android offline voice recognition using PocketSphinx使用 PocketSphinx 的 Android 离线语音识别
【发布时间】:2015-11-03 02:22:20
【问题描述】:

尝试在没有互联网的情况下使用 PocketSphinx 引用该站点进行语音识别,

http://swathiep.blogspot.com/2011/02/offline-speech-recognition-with.html

跟原来一样。

在模拟器中运行程序,因为它不支持音频,会崩溃(不是强制关闭)。但是在尝试在手机上运行时,应用程序只是打开和关闭(不是强制关闭)。需要添加任何更多库来运行这个应用程序????????? 请任何人快速回复........

【问题讨论】:

  • 我也有同样的问题,你找到解决方法了吗?我尝试调试,但它似乎在某处崩溃是 pocketsphinx C 代码。

标签: android offline voice-recognition


【解决方案1】:

CMUSphinx wiki 上提供了有关 android 上的 pocketsphinx 的最新文档。

基本上你需要从Github拉取demo,导入android studio并运行,这样你就可以测试基本功能了。

要开始集成到您自己的应用程序中,请执行以下操作:

在 Android 项目中引用库

库以独立于架构的 pocketsphinx-android-5prealpha-nolib.jar 和二进制 .so 文件的形式分发,适用于不同的硬件架构。

在 Android Studio 中,您需要将 jar 文件放在 app/libs 文件夹中,并将 jni .so 文件放在 app/src/main/jniLibs 文件夹中。

包括资源文件

在 Android 中通过应用程序传送资源文件的标准方法是将它们放在项目的 assets/ 目录中。但是为了使它们可用于 pocketsphinx 文件应该有物理路径,只要它们在 .apk 内,它们就没有物理路径。 pocketsphinx-android 中的 Assets 类提供了一种自动将资产文件复制到目标设备的外部存储的方法。 edu.cmu.pocketsphinx.Assets#syncAssets 同步资源,从位于顶部 assets/ 的 assets.lst 文件中读取项目。在复制之前,它会匹配资产的 MD5 校验和以及外部存储上具有相同名称的文件(如果存在)。如果信息不完整(外部存储上没有文件,两个 .md5 文件中没有任何一个)或哈希不匹配,它只会实际复制。 PocketSphinxAndroidDemo 包含生成 assets.lst 以及 .md5 文件的 ant 脚本,查找 assets.xml。

请注意,如果 ant 构建脚本在您的构建过程中无法正常运行,则资产可能不同步。确保脚本运行或自己创建 md5 文件和 assets.lst。

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

将 app/asset.xml 构建文件包含到您的应用程序中 编辑 build.gradle 构建文件以运行 assets.xml:

  ant.importBuild 'assets.xml'
  preBuild.dependsOn(list, checksum)
  clean.dependsOn(clean_assets)

这应该可以解决问题

示例应用程序

pocketsphinx-android 的类和方法被设计为类似于在 pocketsphinx 中使用的相同工作流,除了组织成类的基本数据结构和使用它们的函数被转换为相应类的方法。因此,如果您熟悉 pocketsphinx,那么您也应该对 pocketsphinx-android 感到满意。

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

recognizer = defaultSetup()
        .setAcousticModel(new File(assetsDir, "en-us-ptm"))
        .setDictionary(new File(assetsDir, "cmudict-en-us.dict"))
        .setRawLogDir(assetsDir).setKeywordThreshold(1e-20f)
        .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 类。

【讨论】:

  • 复制粘贴的答案也会很快失效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多