您的位置:首页 > 移动开发 > Unity3D

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

2017-02-04 12:12 357 查看
最近公司打算弄一个新的项目即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() {

// 说话音量

@Override
public void onVolumeChanged(int arg0, byte[] arg1) {

// TODO Auto-generated method stub

}

// 得到返回的语音结果

@Override
public void onResult(RecognizerResult arg0, boolean arg1) {

// TODO Auto-generated method stub

voiceResult = voiceResult
+ JsonParser.parseIatResult(arg0.getResultString());

if (arg1) {

UnityPlayer.UnitySendMessage("Main Camera",XXX,
voiceResult);

}

}

// 扩展接口

@Override
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {

// TODO Auto-generated method stub

}

// 发生错误回调

@Override
public void onError(SpeechError arg0) {

// TODO Auto-generated method stub

UnityPlayer.UnitySendMessage("Main Camera", XXX, "发生错误啦");

}

// 结束录
d7aa
音

@Override
public void onEndOfSpeech() {

// TODO Auto-generated method stub

UnityPlayer.UnitySendMessage("Main Camera", XXX, "结束录音啦");

}

// 开始录音

@Override
public void onBeginOfSpeech() {

// TODO Auto-generated method stub

UnityPlayer.UnitySendMessage("Main Camera", XXX, "开始录音啦");

}

};
private InitListener mInitListener = new InitListener() {

@Override
public void onInit(int arg0) {

// TODO Auto-generated method stub

UnityPlayer.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环境完毕,可以开始新建你的安卓项目
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: