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

unity获取音筒的声音及实现吹气效果

2018-01-03 18:00 453 查看
Unity这边一个脚本:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class RecognizeManager : MonoBehaviour {
// Use this for initialization
public Text tt01;   //语音识别结果文本
public Text tt02;   //吹气数值文本
public static RecognizeManager instance;

void  Awake(){
instance = this;
}
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 stopp()    //停止语音识别
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("stopYuYinShiBie");
}

public void kaishiJianCe()    //开始监测吹气
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("startJianCe");
}

public void tingZhiJianCe(){  //停止监测吹气
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("stopJianCe");

}

public void xuhaitao(string content)   //接收android端的回调 ,语音识别内容
{
//接收识别后的语音内容
tt01.text=content;
}

public void getSoundText(string content){   //接收android端的回调 ,  吹气的数量值
tt02.text = content;
}
}


Android这边脚本:

package com.DFSJ.EDU;

import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;

import com.DFSJ.EDU.JsonParser;
import com.DFSJ.EDU.MainActivity;
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.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends UnityPlayerActivity {
//下面这两个变量是做语音识别的
SpeechRecognizer mIat;
String voiceResult = "";

//下面是获取麦克风音量的
private TextView tView1, tView2;
private Button button1, button2, button3, button4;
private MHandler mHandler;
private MediaRecorder mARecorder;
private File mAudiofile, mSampleDir;
private MicrophoneThread microphone;
// private RecordThread recordThread;
private boolean istrue = true;
private static final String CONSER = "logInfo:";

private Runtime runtime = null;
private Process process = null;// 服务器连接进程
private DataInputStream logInfoStream = null;
public StringBuffer stateInfoParser = null;
Process localProcess;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SpeechUtility.createUtility(this, "appid=579df2b6");
mIat = SpeechRecognizer.createRecognizer(this, mInitListener);

mHandler = new MHandler();
microphone = new MicrophoneThread();
}

//开始语音识别 , unity调用
public void StartActivity1() {
Toast.makeText(this, "kai shi7", Toast.LENGTH_SHORT).show();
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", "xuhaitao", "初始化完毕");
if (voiceResult != null || voiceResult != "") {
voiceResult = "";
}

}

//停止语音识别 ,unity调用
public void stopYuYinShiBie() {
mIat.stopListening();
}

private RecognizerListener recognizerListener = new RecognizerListener() {
public void onResult(RecognizerResult results, boolean isLast) {
voiceResult = voiceResult+ JsonParser.parseIatResult(results.getResultString());
if (isLast) {
UnityPlayer.UnitySendMessage("Main Camera", "xuhaitao",voiceResult);  //语音识别后,将结果传给unity
}
}

public void onError(SpeechError error) {
// error.getPlainDescription(true);
//          UnityPlayer.UnitySendMessage("Main Camera", "onError", "发生错误");
}

// 开始录音
public void onBeginOfSpeech() {
//          UnityPlayer.UnitySendMessage("Main Camera", "beginRecord", "开始录音");
}

// 结束录音
public void onEndOfSpeech() {
//          UnityPlayer.UnitySendMessage("Main Camera", "finishRecord",
//                  "onEndOfSpeech");
}

// 扩展用接口
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
//          UnityPlayer.UnitySendMessage("Main Camera", "xuhaitao", "onEvent");
}

@Override
public void onVolumeChanged(int arg0, byte[] arg1) {
// TODO Auto-generated method stub
//          UnityPlayer.UnitySendMessage("Main Camera", "xuhaitao",
//                  "zhengzai");

}
};

private InitListener mInitListener = new InitListener() {

@Override
public void onInit(int arg0) {
// TODO Auto-generated method stub
//          UnityPlayer.UnitySendMessage("Main Camera", "xuhaitao",
//                  "mInitListener");
if (arg0 == 0) {
//              Toast.makeText(MainActivity.this, "login", Toast.LENGTH_SHORT)
//                      .show();
} else {
//              Toast.makeText(MainActivity.this, "login error",
//                      Toast.LENGTH_SHORT).show();
}

}
};

//下面的内部类和方法都是用于获取麦克风声音的

class MicrophoneThread extends Thread {
/** 获取麦克风的声音 */
final float minAngle = (float) Math.PI * 4 / 11;
float angle;

@Override
public void run() {
while (istrue) {

angle = 100 * minAngle * mARecorder.getMaxAmplitude() / 32768;
if (angle > 100) {
angle = 100;
}
mHandler.sendMessage(mHandler.obtainMessage(1, angle));

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

class MHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case 1:
getSoundText(msg.obj.toString());
break;
}
}
}

//开始监测吹气,unity调用
public void startJianCe() {
// 录音获取麦克风声音

super.onStart();
mARecorder = new MediaRecorder();
mARecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mARecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mARecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
mSampleDir = Environment.getExternalStorageDirectory();
mAudiofile = File.createTempFile("IM" + System.currentTimeMillis(),
".amr", mSampleDir);
} catch (IOException e) {
Log.e("IMMESSAGE", "sdcard access error");
}
mARecorder.setOutputFile(mAudiofile.getAbsolutePath());
try {
mARecorder.prepare();
} catch (Exception e) {
e.printStackTrace();
}
istrue=true;
mARecorder.start();
microphone.start();

}

//停止监测吹气  ,unity调用

public void stopJianCe(){
istrue=false;
mARecorder.stop();
Toast.makeText(this, "kai shi cui qi", Toast.LENGTH_SHORT).show();

}

//将吹气的音量值,回调unity
public void  getSoundText(String ss){
UnityPlayer.UnitySendMessage("Main Camera", "getSoundText", ss);
}

}




FR:海涛高软(hunk Xu)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: