这个是语音识别的转自:unity接入讯飞语音的识别和合成功能
语音识别:
eclipse这边推荐下载一个ADT_bundle对应自己的系统版本(里面有自带的android sdk),不然自己下载的eclipse可能会没有 android application project 让你创建,我的就是刚开始没有
adt_bundle_win_64下载地址https://pan.baidu.com/s/1sZr7ubk3E86uaeSs312eJw 密码:o6ew
安装eclipse之前应该先安装JDK并配置好环境
JDK下载和配置:https://pan.baidu.com/s/1DmJwfsvM8qzg8WofEcs3-Q
密码:wbii
完了之后就照作者的步骤去写吧
讯飞这个语音是需要联网的
我自己配置所遇到的问题:
UnityPlayer.UnitySendMessage(“Main Camera”, “xxx”, “初始化完成”);
这三个参数,第一个Main Camera为unity中脚本对象所挂在的Gameobject的名 字;第二个参数xxx为你unity脚本所需要接收这个返回参数(也就是eclipse中的voiceResult这个参数)的方法名字,第三个为显示状态
至于打包出来的那个jar这个包的名字可以自己随意写一个
我第一次没成功的主要原因是脚本没有挂载到Main Camera上面,引以为戒
unity测试工程和打包出来的APK链接地址:
https://pan.baidu.com/s/1nBZcKvBVK516L8gzUfJmgA 密码:6l1o
这个是语音合成(文字转语音):
语音识别和语音合成的SDK没必要下两遍,直接使用语音识别的那个SDK就行,就按照之前导进去的那个,然后开始改写你的 MainActivity.java这个脚本就行
我是把语音识别和语音合成写到一块了,可以参照代码,懒人可以直接复制粘贴
package com.zhimin.mysoundshibie;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
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.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.cloud.ErrorCode;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
SpeechRecognizer mIat;
String voiceResult = "";
// 语音合成对象
private SpeechSynthesizer speechSynthesizer;
// 默认发言人
private String voicer = "xiaoyan";
// 引擎类型
private String mEngineType = SpeechConstant.TYPE_CLOUD;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SpeechUtility.createUtility(this, "appid=xxxxx");
}
//unity中调用进行语音识别
public void Yuyin_shibie() {
mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
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");
mIat.startListening(recognizerListener);
mIat.setParameter(SpeechConstant.ENGINE_TYPE,"");
mIat.setParameter(SpeechConstant.ENGINE_MODE,"");
UnityPlayer.UnitySendMessage("Main Camera", "zhimin", "初始化完成");
if (voiceResult != null || voiceResult != "") {
voiceResult = "";
}
}
//unity中调用进行语音合成
public void kaishi_bofang_yuyin(String str)
{
speechSynthesizer = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);
// 设置参数
setParam();
// 开始播放
int code = speechSynthesizer.startSpeaking(str, mTtsListener);
if (code != ErrorCode.SUCCESS) {
showToast("语音合成失败,错误码: " + code);
} else {
showToast("语音合成成功啦");
}
}
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","zhimin",
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", "zhimin", "发生错误啦");
}
// 结束录音
@Override
public void onEndOfSpeech() {
// TODO Auto-generated method stub
UnityPlayer.UnitySendMessage("Main Camera", "zhimin", "结束录音啦");
}
// 开始录音
@Override
public void onBeginOfSpeech() {
// TODO Auto-generated method stub
UnityPlayer.UnitySendMessage("Main Camera", "zhimin", "开始录音啦");
}
};
private InitListener mInitListener = new InitListener() {
@Override
public void onInit(int arg0) {
// TODO Auto-generated method stub
UnityPlayer.UnitySendMessage("Main Camera", "zhimin",
"mInitListener");
if (arg0 == 0) {
Toast.makeText(MainActivity.this, "语音可以用", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(MainActivity.this, "语音不可以用", Toast.LENGTH_SHORT)
.show();
}
}
};
// 设置参数
private void setParam() {
// 清空参数
speechSynthesizer.setParameter(SpeechConstant.PARAMS, null);
// 根据合成引擎设置相应参数
if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 设置在线合成发音人
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, voicer);
//设置合成语速
speechSynthesizer.setParameter(SpeechConstant.SPEED, "50");
//设置合成音调
speechSynthesizer.setParameter(SpeechConstant.PITCH, "50");
//设置合成音量
speechSynthesizer.setParameter(SpeechConstant.VOLUME, "50");
} else {
speechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
// 设置本地合成发音人 voicer为空,默认通过语记界面指定发音人。
speechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "");
/** * TODO 本地合成不设置语速、音调、音量,默认使用语记设置 * 开发者如需自定义参数,请参考在线合成参数设置 */
}
//设置播放器音频流类型
speechSynthesizer.setParameter(SpeechConstant.STREAM_TYPE, "5");
// 设置播放合成音频打断音乐播放,默认为true
speechSynthesizer.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
speechSynthesizer.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
//speechSynthesizer.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");
}
// 播放回调
private SynthesizerListener mTtsListener = new SynthesizerListener() {
@Override
public void onSpeakBegin() {
}
@Override
public void onSpeakPaused() {
}
@Override
public void onSpeakResumed() {
}
@Override
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
// 合成进度
}
@Override
public void onSpeakProgress(int percent, int beginPos, int endPos) {
// 播放进度
}
@Override
public void onCompleted(SpeechError error) {
if (error == null) {
showToast("播放完成");
} else if (error != null) {
showToast(error.getPlainDescription(true));
}
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
// 若使用本地能力,会话id为null
// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
// Log.d(TAG, "session id =" + sid);
// }
}
};
/** * 初始化监听。 */
private InitListener mTtsInitListener = new InitListener() {
@Override
public void onInit(int code) {
//Log.d(TAG, "InitListener init() code = " + code);
if (code != ErrorCode.SUCCESS) {
showToast("初始化失败,错误码:" + code);
} else {
// 初始化成功,之后可以调用startSpeaking方法
// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
// 正确的做法是将onCreate中的startSpeaking调用移至这里
showToast("初始化成功");
}
}
};
// 传入 meg,弹出一个 Toast 操作
public void showToast(final String meg)
{
Toast.makeText(MainActivity.this, meg, Toast.LENGTH_LONG).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);
}
}
此处的xxxx为你的讯飞appID
接下来是AndRoidMainfest.xml的改写
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zhimin.mysoundshibie" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
<activity android:name="com.zhimin.mysoundshibie.MainActivity" android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>
注意标红的地方要和MainActivity.java里第一行那一致,比MainActivity.java里第一行后面多一个.MainActivity
然后ctrl+s后,点File(在左上角),然后点里面的Export,再点JAVA下面的JARfile,然后next
点击finish,自己选择你的打包路径
unity里面的格式
这个haha是我自己的打的jar包,该拖的和该创建的文件夹以及名字不能出错
libs和res自己在java的那个安卓过程拖过来即可
然后我的脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System;
using UnityEngine.UI;
public class NewBehaviourScript1 : MonoBehaviour {
public Text tx1;
public Text tx2;
AndroidJavaClass jc;
AndroidJavaObject jo;
void Start () {
jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
}
void Update () {
}
public void kaishi_yuyin_shibie()
{
jo.Call("Yuyin_shibie");
}
public void kaishi_bofang_yuyin()
{
jo.Set<string>("voicer", "xiaoyu");//改变java中的播放者 (可以百度查询科大讯飞里面的语音人物名称)
jo.Call("Yuyin_bofang","小猪佩琪身上纹,掌声送给社会人"); //第二个参数为需要播放的语音文字,可以随意定义
}
void zhimin(string str)
{
tx1.text = str;
}
}
看不懂的同学不要着急,这里贴上我的安卓工程和unity工程以及打包好的apk包
注意:unity打包APK的PackageName必须和安卓工程中com.zhimin.mysoundshibie一致
安卓工程:https://pan.baidu.com/s/1nSJDieWCKKtFLIxwXwwkLQ 密码:7duu
unity工程: https://pan.baidu.com/s/1-rH83WMzeaCdSnjsY0jDpQ 密码: 4xac
APK包:https://pan.baidu.com/s/1Pzi5lRa4Ia9sm6BZE6SF8w 密码:32mh
今天的文章讯飞语音识别接口_讯飞tts语音引擎9.0「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/89297.html