最近公司打算弄一个新的项目即unity的语音识别,上网搜索后发现讯飞sdk是现目前大多数常用的语音识别,而且识别效果佳

目前网上已有了讯飞+sdk的教程,所以要先谢谢两位大神:
海涛高软:博客地址http://blog.csdn.net/qq_15267341/article/details/52074225
DEVELOPERLI:博客地址http://blog.sina.com.cn/s/blog_15a8e1c520102wy5a.html

后来发现两者发布博客的过程中自有优势和缺乏的方面,所以本人索性就把两者结合在一起,以便日后自己和大家使用


首先是讯飞开放平台的官网:http://www.xfyun.cn/ && 开发环境:unity5.4.3f1+eclipse
注册账号和登录后进入控制台

第一步:在控制台处创建新的应用如下图所示

第二步:选择我的应用记住相应的信息,然后点击立即开通服务(请大家保管好自己的Appid)

第三步:选择语言听写功能,然后点击确定

第四步:点击右步的sdk下载

第五步选择相应的服务,默认情况下直接点下载sdk

等待sdk下载完毕并解压文件夹,如下图所示:

第六步:打开 eclipse创建新的应用如下图所示(因为我的手机是安卓系统4.4的所以我选择4.0-4.4,大家可以根据自己的需要选择sdk)

点击Next–>Next–>Next->Finish



第七步找到unity安装目录下的classes.jar文件,并把此文件拖到对应安卓项目的bin目录下并点击ok(我的路径为如下

D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes )

第八步右键安卓工程bin目录下的classes.jar文件选择Build Path下的Add to Build Path

找到sdk目录下的armeabi-v7a文件夹和msc.jar文件,并把这两个文件拖到安卓项目中的libs目录中如下图所示(若没有libs目录则在安卓项目中新建一个)

找到sdk目录下的JsonParser.java文件,并把该文件拖到安卓项目的src文件夹/com.example.speechdemoceshi下并选择ok

打开JsonParser.java文件,修改包名并保存选择Save in UTF-8

第九步开始写android代码(如果不想写的话请直接复制)

package com.example.speechdemoceshi;

import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends UnityPlayerActivity {
SpeechRecognizer mIat;
String voiceResult = “”;

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SpeechUtility.createUtility(this, xxxx);mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
}public void StartActivity1() {mIat.setParameter(SpeechConstant.DOMAIN, "iat");mIat.setParameter(SpeechConstant.ACCENT, "mandarin");mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");mIat.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT, "4000");mIat.setParameter(SpeechConstant.VAD_EOS, "2000");mIat.setParameter(SpeechConstant.ASR_PTT, "0");int ret = mIat.startListening(recognizerListener);UnityPlayer.UnitySendMessage("Main Camera", XXX, "初始化完成");if (voiceResult != null || voiceResult != "") {voiceResult = "";}}private RecognizerListener recognizerListener = new RecognizerListener() {// 说话音量@Overridepublic void onVolumeChanged(int arg0, byte[] arg1) {// TODO Auto-generated method stub}// 得到返回的语音结果@Overridepublic void onResult(RecognizerResult arg0, boolean arg1) {// TODO Auto-generated method stubvoiceResult = voiceResult+ JsonParser.parseIatResult(arg0.getResultString());if (arg1) {UnityPlayer.UnitySendMessage("Main Camera",XXX,voiceResult);}}// 扩展接口@Overridepublic void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {// TODO Auto-generated method stub}// 发生错误回调@Overridepublic void onError(SpeechError arg0) {// TODO Auto-generated method stubUnityPlayer.UnitySendMessage("Main Camera", XXX, "发生错误啦");}// 结束录音@Overridepublic void onEndOfSpeech() {// TODO Auto-generated method stubUnityPlayer.UnitySendMessage("Main Camera", XXX, "结束录音啦");}// 开始录音@Overridepublic void onBeginOfSpeech() {// TODO Auto-generated method stubUnityPlayer.UnitySendMessage("Main Camera", XXX, "开始录音啦");}};
private InitListener mInitListener = new InitListener() {@Overridepublic void onInit(int arg0) {// TODO Auto-generated method stubUnityPlayer.UnitySendMessage("Main Camera", XXX,"mInitListener");if (arg0 == 0) {Toast.makeText(MainActivity.this, "语音可以用", Toast.LENGTH_SHORT).show();} else {Toast.makeText(MainActivity.this, "语音不可以用", Toast.LENGTH_SHORT).show();}}};@Override
public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;
}@Override
public boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);
}

}

导入后有几个报错点

第一个SpeechUtility.createUtility(this, xxxx);处xxxx修改成“appid=xxx”(这里的xxx为你在开发台的appid)即SpeechUtility.createUtility(this, “appid=xxx”)
第二处UnityPlayer.UnitySendMessage(“Main Camera”, xxx,voiceResult);处的xxx修改成”xxx”(这里的xxx即为你要导出的jar名 称如果导出jar包名为ss,则为”ss”,记住不要带上.jar后缀)即UnityPlayer.UnitySendMessage(“Main Camera”, “ss”,voiceResult);
以下几个类似第二处

为安卓目录下的AndroidManifest.xml增加权限和修改对应的内容,权限如下

如下图所示

第十步导出jar包,右键安卓项目选择Export–>选择Java目录下–>选择JAR file点击Next

选择对应内容后点击Finish–>点击ok

第十一步打开Unity创建新的项目如下图所示

进入后在Assets建立plugins文件夹–>在plugins建立android文件夹–>在android文件夹中建立bin文件夹 目录结构如下图所示

把android导出的jar包放入到bin文件夹下

把安卓项目中的libs文件夹&&res文件夹&&AndroidManifest.xml文件放到android目录下

在Assets目录下创建release文件夹用于保存场景,并在Main Camera挂载一个test脚本(可以自定义)

打开test脚本
书写以下代码后返回unity
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class test : MonoBehaviour
{
public InputField shurukuang;
// Use this for initialization
void Start()
{

}// Update is called once per frame
void Update()
{}
public void kaishi()
{AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");jo.Call("StartActivity1");
}//接收返回的语音结果
public void xujinjia(string str)
{shurukuang.text = str;
}

}

在unity场景中建立一个button和input Field,点击button点击右边的按钮选择Reset(input field重复此操作),点击2D按钮通过滚轮缩小场景调整两个的合适位置使其互不遮挡后点击2D按钮回到2D界面

点击Main Camera,把场景中的input Field拖到上文代码定义的Shurukuang中

点击Button操作如下图所示

保存场景至release目录下

最后一步发布场景如下图所示

————————————————————————————————————-

下面是我在开发中遇到的问题

Unity发布过程中遇到的问题

1.FileNotFoundException: Could not find file “C:\Users\陌小佳\Desktop\C#learn\speechdemo\Temp\StagingArea\AndroidManifest.xml”错误,国内暂时还好像没人认遇到过,国外一位大神说在发布的过程中保证unity的项目的路径为英文路径才不会出现此错误
后来试了一下发现成功了

2.CommandInvokationFailure: Failed to re-package resources.
E:\android\sdk\build-tools\23.0.3\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “E:/android/sdk\platforms\android-21\android.jar” -F bin/resources.ap_ –extra-packages com.example.speechdemo -S “D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res”

stderr[
D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name ‘Theme.AppCompat.Light’.

D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res\values-v11\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name ‘Theme.AppCompat.Light’.

D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res\values-v14\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name ‘Theme.AppCompat.Light.DarkActionBar’.

]
stdout[
……]
…………

这种类似的错误查看上面的stderr部分找到对应的文件解决方案

3.CommandInvokationFailure: Failed to re-package resources.
E:\android\sdk\build-tools\23.0.3\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “E:/android/sdk\platforms\android-21\android.jar” -F bin/resources.ap_ –extra-packages com.example.speechdemo -S “D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res”

stderr[
D:\speechdemo\Temp\StagingArea\android-libraries\unity-android-resources\res\menu\main.xml:6: error: No resource identifier found for attribute ‘showAsAction’ in package ‘com.example.speechdemo’

]
stdout[
….]
….

解决方案:
打开res\menu\main.xml文件找到app:showAsAction=”never”并把它删除

4.CommandInvokationFailure: Failed to re-package resources. See the Console for details.
E:\android\sdk\build-tools\android-4.4\aapt.exe package –auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S “res” -I “E:/android/sdk\platforms\android-19\android.jar” -F bin/resources.ap_

stderr[
res\values-v21\styles.xml:3: error: Error retrieving parent for item: No resource found that matches the given name ‘android:Theme.Material.Light.NoActionBar.Fullscreen’.
]

出现这个问题的时候很奇怪毕竟我的文件夹里面找不到values-v21文件夹,后来发现是AndroidManifest.xml
文件中的最高的sdk设置与构建中api不符的问题

解决方案:
打开plugins/android/AndroidManifest.xml文件修改其中的android:targetSdkVersion=”20”把20改成你最高api的版本

历经那么多bug后发布完成了,然后装到手机后闪退,抓到的Logcat日记如下
02-03 23:01:10.851: I/ActivityManager(3178): Timeline: Activity_launch_request id:com.example.speechdemo time:192265129
02-03 23:01:10.851: I/ActivityManager(2542): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x30200000 cmp=com.example.speechdemo/.MainActivity bnds=[398,1650][734,2030]} from pid 3178
02-03 23:01:10.901: I/ActivityManager(2542): Start proc com.example.speechdemo for activity com.example.speechdemo/.MainActivity: pid=2774 uid=10153 gids={50153, 3003}
02-03 23:01:10.951: V/PowerEffectManager(3117): noteActivity uid = 10153, name = com.example.speechdemo.MainActivity
02-03 23:01:10.961: D/StatusBar.ForegroundActivityObserver(23992): change from [ com.bbk.launcher2] to [com.example.speechdemo]!
02-03 23:01:10.961: I/SoftwareLockService2(3235): processName = com.example.speechdemo, packageName = com.example.speechdemo
02-03 23:01:10.961: I/SoftwareLockService2(3235): [Monitor]———[com.bbk.launcher2] to [com.example.speechdemo]
02-03 23:01:10.961: I/SoftwareLockService2(3235): ——–>>>>>>>> topActivityName = com.example.speechdemo.MainActivity
02-03 23:01:10.961: I/SoftwareLockService(3235): vivoSoftLock() isLocked = false, psdRight = 0, pa = com.example.speechdemo, mLastPackage = , mSoftwareLockList.get(pa) = null
02-03 23:01:10.961: D/PreventAutostartService(2897): ####topPackageName = com.example.speechdemo
02-03 23:01:11.001: D/PreventAutostartService(2897): ####topPackageName = com.example.speechdemo
02-03 23:01:11.051: W/dalvikvm(2774): Unable to resolve superclass of Lcom/example/speechdemo/MainActivity; (816)
02-03 23:01:11.051: W/dalvikvm(2774): Link of class ‘Lcom/example/speechdemo/MainActivity;’ failed
02-03 23:01:11.051: E/AndroidRuntime(2774): Process: com.example.speechdemo, PID: 2774
02-03 23:01:11.051: E/AndroidRuntime(2774): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.speechdemo/com.example.speechdemo.MainActivity}: java.lang.ClassNotFoundException: Didn’t find class “com.example.speechdemo.MainActivity” on path: DexPathList[[zip file “/mnt/asec/com.example.speechdemo-1/pkg.apk”],nativeLibraryDirectories=[/mnt/asec/com.example.speechdemo-1/lib, /vendor/lib, /system/lib]]
02-03 23:01:11.051: E/AndroidRuntime(2774): Caused by: java.lang.ClassNotFoundException: Didn’t find class “com.example.speechdemo.MainActivity” on path: DexPathList[[zip file “/mnt/asec/com.example.speechdemo-1/pkg.apk”],nativeLibraryDirectories=[/mnt/asec/com.example.speechdemo-1/lib, /vendor/lib, /system/lib]]
02-03 23:01:11.091: I/ActivityManager(2542): handleApplicationCrash callcom.example.speechdemo
02-03 23:01:11.091: D/LogUploadService(27341): process name = com.example.speechdemo
02-03 23:01:11.091: W/ActivityManager(2542): Force finishing activity com.example.speechdemo/.MainActivity
02-03 23:01:11.251: I/SoftwareLockService2(3235): [Monitor]Useless [com.example.speechdemo] to [com.example.speechdemo]
02-03 23:01:11.591: W/ActivityManager(2542): Activity pause timeout for ActivityRecord{29703698 u0 com.example.speechdemo/.MainActivity t297 f}
02-03 23:01:11.611: D/StatusBar.ForegroundActivityObserver(23992): change from [ com.example.speechdemo] to [com.bbk.launcher2]!
02-03 23:01:11.621: I/SoftwareLockService2(3235): [Monitor]———[com.example.speechdemo] to [com.bbk.launcher2]
02-03 23:01:11.651: I/SoftwareLockService(3235): vivoSoftLock() isLocked = false, psdRight = 0, pa = com.bbk.launcher2, mLastPackage = com.example.speechdemo, mSoftwareLockList.get(pa) = null

说是找不到Class com.example.speechdemo.MainActivity文件, 目前发现导致此原因的有两个

原因一:AndroidManifest.xml代码中设置错误

解决方案:检查安卓项目中的AndroidManifest.xml如下图所示

若出现错误请修改然后clean一下项目,重新以上文提及的导出方式重新导出jar包,替换unity中的jar包(unity中要删除原有的jar包然后重新拖入,不然会出现问题)重新发布 若未解决请查看原因二

原因二:误把classes.jar拖到libs目录下

解决方案:删除libs目录下的classes.jar文件–>进行一次clean–>把classes.jar重新导入到安卓项目的bin目录下重新右键选择Build Path下的Add to Build Path –>重新以上文提及的导出方式重新导出jar包–>替换unity中的jar包(unity中要删除原有的jar包然后重新拖入,不然会出现问题)–>重新发布

其他发布有问题的话请在评论区留言,楼主尽力帮忙解决

————————————————————————————————————–

下面提供jdk安装程序&&Unity5.4.3f1的安装程序&&Unity5.4.3f1破解器&&eclipse&&sdk下载链接

jdk安装程序:http://pan.baidu.com/s/1boLmBq3

Unity5.4.3f1安装程序:http://pan.baidu.com/s/1c2KeTbi

Unity5.4.3f1破解器:http://pan.baidu.com/s/1nvvzVL3

eclipse:http://cloud.189.cn/t/memmY3Azmu22

sdk:http://pan.baidu.com/s/1geU7R03

jdk安装和Java环境配置请大家参照这个博客http://www.cnblogs.com/smyhvae/p/3788534.html

Unity5.4.3f1安装过程如下:


上面左侧框解释
Examole Project 为示例项目
Microsoft Visual Studio Tools for Unity 为VS2015
Android Build Support 为安卓发布构建环境
ios Build Support 为ios发布构建环境
tvos Build Support 这个好像是苹果研发系统tvos发布构建环境(不知道是不是真)
Linux Build Support 为Linnx发布构建环境
Mac Build Support 为苹果电脑发布构建环境
然后Windows Store .NET Scripting Backend&&Windows Store IL2CPP Scripting Backend 这两个不知道是什么东西(大家可以查查我没选)
Samsung TV Build Support 直译过来就是三星电视发布构架环境(不知道是不是正确的翻译)
Tizen Build Support 为Tizen系统的发布构建环境
WebGL Build Support 为WebGL发布构建环境

选择自己的喜好然后点击Next

然后等待安装完成,解压破解包

显示窗口后则破解完成,然后就开启你的Unity之旅吧

sdk文件下载后解压文件夹并运行目录下的SDK Manager.exe文件

等待进度条完成后选择相应的内容后点击Install

出现界面后选择上Accept License后点击Install等待安装完毕

eclipse下载后直接解压文件,找到目录下eclipse文件夹中的eclipse.exe文件并运行程序

进入eclipse会出现窗口选择你的工作空间然后点击ok进入eclipse界面

进入界面如果出现窗口则点击ok就好

配置eclipse中androidsdk环境
在菜单栏中选择Window–>Preferences然后进行下图操作

eclipse中配置androidsdk环境完毕,可以开始新建你的安卓项目

Unity 语音识别 详情版 和 发布过程中遇到的问题相关推荐

  1. HoloLens 2 打包发布过程中 常见问题汇总(长期更新)

    HoloLens 2 打包发布过程中 常见问题汇总(长期更新)                   目 录 1. Unity 中发布Hololens的时候界面变灰,提示无发布权限. 2. Unity发 ...

  2. 如何在简中版 MathType 安装过程中,就能输入产品密匙?

    该问转载于:https://bbs.kafan.cn/thread-2031670-1-1.html 感谢原创作者提供的分享!本人也做一次搬运工,将好的东西分享给大家. 之前的三种方法见下面的地址: ...

  3. 下发布可执行文件_IOS APP 发布过程中涉及相关概念

    AppID(应用 ID) AppID 是识别不同应用程序的唯一标志符,每个 app 都需要一个 App ID 或者 app 标识.目前有两种类型的 App 标识:一个是精确的 App ID(expli ...

  4. uniapp小程序发布过程中,图片跟音频资源超过200K无法上传

    uniapp开发小程序,项目中图片跟音频资源太多造成小程序上传失败,可进行静态资源分包处理. 1.打开项目,在项目静态资源文件夹下创建多个存放静态资源的文件夹 2.每个文件夹内存放的静态资源不不可超过 ...

  5. 爬取好友QQ空间的说说(增强版及使用过程中的困难总结)

    之前从网上下载了源码,在拿同学练手时,发现全是一堆广告说说,经查找是由于原来的代码采用的是识别可点击的"下一页"来进行翻页,而我那个同学 曾转发过一个叫"下一个" ...

  6. 如何在软件发布计划中自动化语义化版本与变更日志

    摘要:本文引入两个工具commitizen和standard-version来实现语义化版本与变更日志的自动化,提升规范化程度,减少人工干预. 随着DevOps方法与实践的普及,越来越多的企业开始使用 ...

  7. 关于线程池运行过程中,业务逻辑出现未知异常导致线程中断问题反思

    最近在项目研发中的关于线程池应用过程中由于业务逻辑异常导致的线程中断,但程序未中断导致的脏数据问题  话不多说,在最近最新的一个版本发布过程中,业务需要,我们要定期去给客户预留出可用的资源数据,提供客 ...

  8. 发布过程5分钟内load飙升问题排查

    这几天新项目每次发布,都发现load在jetty重启过程中突然load会从0.1突然升高到15以上,3分钟后慢慢降到正常非常,cpu使用率也升高了一些,但是jvm内存线程,gc都比较正常,所以怀疑应用 ...

  9. Blender雕刻模块:如何在雕刻过程中无缝合并物体

    本文基于Blender 2.8正式版 在雕刻过程中经常会新建一些物体然后合并进来一起雕刻,但是实际操作中会出现很多意想不到的问题 例如:简单地把两个物体Ctrl + J合并到一起 使用Smooth笔刷 ...

最新文章

  1. 虚拟化云计算平台Proxmox VE
  2. C#使用ExecuteReader返回DataReader既有查询结果集又有输出参数或返回值的使用注意事项...
  3. [转]application.properties详解 --springBoot配置文件
  4. 2010年5月系统集成项目管理工程师上午试卷参考答案(讨论版)
  5. vuex Payload 荷载
  6. Echarts自定义折线图例,增加选中功能
  7. intelRealsense D435 python开发环境搭建
  8. SQLite: 关于日期的标准化问题
  9. 【优化算法】学生心理学优化算法(SPBO)【含Matlab源码 1430期】
  10. iphone怎么录屏 苹果屏幕录制怎么操作
  11. 计算机无线网络怎么连接,怎么连接无线网络 电脑怎么添加无线网络连接
  12. GNS3模拟思科三层交换机(排错细节)
  13. eplan连接定义点不显示_CAD和EPLAN!电气制图你会选择哪个?
  14. libmodbus使用
  15. MAX30102血氧模块的原理及编程
  16. python 导出excel 可筛选_python中实现excel的高级筛选
  17. Linux LTP (一)
  18. BELLHOP 关于Actup冲激响应的绘制
  19. 今日头条用户文章标题及详情页爬取
  20. failed to connect to ‘192.168.*.*:5555‘: Connection refused

热门文章

  1. python爬取智联招聘网_Python-爬取智联招聘
  2. [应用模板]HTML5电子相册
  3. Windows下部署Swagger Edit、Swagger UI
  4. Idea配置自动导包
  5. neo4j启动命令的小tips
  6. 欧拉法及其他改进方法——Matlab实现
  7. 1688商品sku采集抓取实现方法
  8. 查看Windows、Office 是否永久激活
  9. 用于数据仓库现代化的云原生数据流的案例
  10. html分享到微信朋友圈代码,微信分享给朋友及朋友圈JS代码