国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity2021接入訊飛語音聽寫(Android)

這篇具有很好參考價值的文章主要介紹了Unity2021接入訊飛語音聽寫(Android)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用的引擎工具:

Unity2021.3.19

android-studio-2021.1.21

第一步:

新建一個Android項目(工程名字隨便啦)

unity 接受語音,android,unity,語音識別,Powered by 金山文檔
unity 接受語音,android,unity,語音識別,Powered by 金山文檔

然后新建一個library

unity 接受語音,android,unity,語音識別,Powered by 金山文檔
unity 接受語音,android,unity,語音識別,Powered by 金山文檔

(同上,庫名自己命名吧)

Android環(huán)境目前就算是初步建立好了。

第二步:

導包

libs文件夾里面放入這4個文件,arm64-v8a,armeabi-v7a,Msc.jar這三個文件是訊飛官網下載下來的demo項目里面的,直接復制到libs里面就好,classes.jar包是在下面這個路徑下的

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

注:Classes.jar用mono還是IL2CPP得和Unity-PlayerSetting-ScriptBackend一致

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

第三步

倒入UnityPlayerActivity

最新版本Unity里面的classes.jar包文件里面以及不包含UnityPlayerActivity了,所以我們需要自己導入UnityPlayerActivity(或者自己編寫一個也可以,回頭可以再出一篇)

文件位置:

unity 接受語音,android,unity,語音識別,Powered by 金山文檔
unity 接受語音,android,unity,語音識別,Powered by 金山文檔

第四步

在AndroidStudio實現供unity調用的接口方法,直接上代碼了(訊飛APPID自己填寫)

package com.example.mylibrary;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.iflytek.cloud.ErrorCode;
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.unity.upa.UnityPlayerActivity;
import com.unity3d.player.UnityPlayer;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class XunFeiSdk extends UnityPlayerActivity {

private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    SpeechRecognizer mIAT;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=xxxxxx");//這里是你在訊飛官網上的APPID
        mIAT=SpeechRecognizer.createRecognizer(this,null);
        mIAT.setParameter(SpeechConstant.DOMAIN,"iat");
        // 語言
        mIAT.setParameter(SpeechConstant.LANGUAGE,"zh_cn");
        // 接收語言的類型
        mIAT.setParameter(SpeechConstant.ACCENT,"mandarin");
        // 使用什么引擎
        mIAT.setParameter(SpeechConstant.ENGINE_TYPE,SpeechConstant.TYPE_CLOUD);
    }

public void StartListening() {

mIAT.startListening(recognizerListener);
    }

    RecognizerListener recognizerListener = new RecognizerListener() {
@Override
        public void onVolumeChanged(int i, byte[] bytes) {
            UnityPlayer.UnitySendMessage("XfManager","OnVolumeChanged","");
        }

@Override
        public void onBeginOfSpeech() {
            UnityPlayer.UnitySendMessage("XfManager","OnBeginOfSpeech","");
        }

@Override
        public void onEndOfSpeech() {
            UnityPlayer.UnitySendMessage("XfManager","OnEndOfSpeech","");
        }

@Override
        public void onResult(RecognizerResult recognizerResult, boolean b) {
            printResult(recognizerResult);
        }

@Override
        public void onError(SpeechError speechError) {
            UnityPlayer.UnitySendMessage("XfManager","OnError",speechError.getErrorDescription());
        }

@Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {

        }
    };

    private void printResult(com.iflytek.cloud.RecognizerResult results) {
// JsonParser是一個工具類
        String text = JsonParser.parseIatResult(results.getResultString());

        String sn = null;
        // 讀取json結果中的sn字段
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }
mIatResults.put(sn, text);
        // resultBuffer 為最終返回的結果

        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
            resultBuffer.append(mIatResults.get(key));
        }
// 把得到的結果返回給Unity  第一個參數為unity種的游戲物體 第二個參數為 這個游戲物體身上腳本的方法   第三個參數為訊飛返回的最終結果
        UnityPlayer.UnitySendMessage("XfManager","OnResult",resultBuffer.toString());
    }

public  void VoidTest()
    {
        UnityPlayer.UnitySendMessage("XfManager","FromAndroid","Android:消息發(fā)送至Unity");
    }
}

Json類(這個是訊飛demo里面的)

package com.example.mylibrary;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

/**
 * Json結果解析類
 */
public class JsonParser {

public static String parseIatResult(String json) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);

            JSONArray words = joResult.getJSONArray("ws");
            for (int i = 0; i < words.length(); i++) {
// 轉寫結果詞,默認使用第一個結果
                JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                JSONObject obj = items.getJSONObject(0);
                ret.append(obj.getString("w"));
//          如果需要多候選結果,解析數組其他字段
//          for(int j = 0; j < items.length(); j++)
//          {
//             JSONObject obj = items.getJSONObject(j);
//             ret.append(obj.getString("w"));
//          }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
return ret.toString();
    }

public static String parseGrammarResult(String json, String engType) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);

            JSONArray words = joResult.getJSONArray("ws");
            // 云端和本地結果分情況解析
            if ("cloud".equals(engType)) {
for (int i = 0; i < words.length(); i++) {
                    JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                    for (int j = 0; j < items.length(); j++) {
                        JSONObject obj = items.getJSONObject(j);
                        if (obj.getString("w").contains("nomatch")) {
                            ret.append("沒有匹配結果.");
                            return ret.toString();
                        }
                        ret.append("【結果】" + obj.getString("w"));
                        ret.append("【置信度】" + obj.getInt("sc"));
                        ret.append("\n");
                    }
                }
            } else if ("local".equals(engType)) {
                ret.append("【結果】");
                for (int i = 0; i < words.length(); i++) {
                    JSONObject wsItem = words.getJSONObject(i);
                    JSONArray items = wsItem.getJSONArray("cw");
                    if ("<contact>".equals(wsItem.getString("slot"))) {
// 可能會有多個聯(lián)系人供選擇,用中括號括起來,這些候選項具有相同的置信度
                        ret.append("【");
                        for (int j = 0; j < items.length(); j++) {
                            JSONObject obj = items.getJSONObject(j);
                            if (obj.getString("w").contains("nomatch")) {
                                ret.append("沒有匹配結果.");
                                return ret.toString();
                            }
                            ret.append(obj.getString("w")).append("|");
                        }
                        ret.setCharAt(ret.length() - 1, '】');
                    } else {
//本地多候選按照置信度高低排序,一般選取第一個結果即可
                        JSONObject obj = items.getJSONObject(0);
                        if (obj.getString("w").contains("nomatch")) {
                            ret.append("沒有匹配結果.");
                            return ret.toString();
                        }
                        ret.append(obj.getString("w"));
                    }
                }
                ret.append("【置信度】" + joResult.getInt("sc"));
                ret.append("\n");
            }

        } catch (Exception e) {
            e.printStackTrace();
            ret.append("沒有匹配結果.");
        }
return ret.toString();
    }

public static String parseGrammarResult(String json) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);

            JSONArray words = joResult.getJSONArray("ws");
            for (int i = 0; i < words.length(); i++) {
                JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                for (int j = 0; j < items.length(); j++) {
                    JSONObject obj = items.getJSONObject(j);
                    if (obj.getString("w").contains("nomatch")) {
                        ret.append("沒有匹配結果.");
                        return ret.toString();
                    }
                    ret.append("【結果】" + obj.getString("w"));
                    ret.append("【置信度】" + obj.getInt("sc"));
                    ret.append("\n");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            ret.append("沒有匹配結果.");
        }
return ret.toString();
    }

public static String parseLocalGrammarResult(String json) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);

            JSONArray words = joResult.getJSONArray("ws");
            for (int i = 0; i < words.length(); i++) {
                JSONArray items = words.getJSONObject(i).getJSONArray("cw");
                for (int j = 0; j < items.length(); j++) {
                    JSONObject obj = items.getJSONObject(j);
                    if (obj.getString("w").contains("nomatch")) {
                        ret.append("沒有匹配結果.");
                        return ret.toString();
                    }
                    ret.append("【結果】" + obj.getString("w"));
                    ret.append("\n");
                }
            }
            ret.append("【置信度】" + joResult.optInt("sc"));

        } catch (Exception e) {
            e.printStackTrace();
            ret.append("沒有匹配結果.");
        }
return ret.toString();
    }

public static String parseTransResult(String json, String key) {
        StringBuffer ret = new StringBuffer();
        try {
            JSONTokener tokener = new JSONTokener(json);
            JSONObject joResult = new JSONObject(tokener);
            String errorCode = joResult.optString("ret");
            if (!errorCode.equals("0")) {
return joResult.optString("errmsg");
            }
            JSONObject transResult = joResult.optJSONObject("trans_result");
            ret.append(transResult.optString(key));
         /*JSONArray words = joResult.getJSONArray("results");
         for (int i = 0; i < words.length(); i++) {
            JSONObject obj = words.getJSONObject(i);
            ret.append(obj.getString(key));
         }*/
        } catch (Exception e) {
            e.printStackTrace();
        }
return ret.toString();
    }
}

代碼就是以上這些了,接下來就是修改AndroidManifest

第五步:

AndroidManifest.xml文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mylibrary">

    <application
        android:allowBackup="true"
        android:supportsRtl="true">
        <activity android:name=".XunFeiSdk"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>
    </application>


    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <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"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>

第六步:

完成以上這些步驟就可以打包成arr文件了

選中你的庫文件然后點擊build-Make Module,如圖所示

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

arr生成路徑是

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

結果如下

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

把mylibrary.arr文件根目錄里的classes.jar和AndroidManifest復制出來(拖出來)

下面這個是從arr包里取出來的AndroidManifest文件,把<uses-sdk android:minSdkVersion="26" />刪掉

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

第七步:

下面就是Unity這邊了,Unity端比較簡單,直接看圖吧

這個AndroidManifest文件就是第六步的AndroidManifest文件,

classes.jar文件放在Plugins-Android-bin目錄下

libs目錄下放的是同第二步一樣的3個文件

unity 接受語音,android,unity,語音識別,Powered by 金山文檔
unity 接受語音,android,unity,語音識別,Powered by 金山文檔
unity 接受語音,android,unity,語音識別,Powered by 金山文檔

然后Unity測試界面

unity 接受語音,android,unity,語音識別,Powered by 金山文檔
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class XfManager : MonoBehaviour
{
    private AndroidJavaClass ajc;
    private AndroidJavaObject ajo;
    //private AndroidJavaObject XunFeiSdk;
    public Button StartButton,testBtn;
    public TextMeshProUGUI ResultText;

    private void Start()
    {
         ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
         ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");
        //XunFeiSdk = new AndroidJavaObject("com.example.mylibrary.XunFeiSdk");
        testBtn.onClick.AddListener(TestConnect);
        if (StartButton)
        {
            StartButton.onClick.AddListener(() => { StartListening(); });
        }
    }

    private void TestConnect()
    {
        ajo.Call("VoidTest");
    }


    public void FromAndroid(string s) 
    {
        ResultText.text = s;
    }

    public void StartListening()
    {
        ajo.Call("StartListening");
    }

    public void OnStartListening(string ret)
    {
        int result = int.Parse(ret);
        StartButton.interactable = result == 0;
    }

    public void OnResult(string result)
    {
        ResultText.text = result;
    }

    public void OnError(string errorMessage)
    {
        ResultText.text = errorMessage;
    }

    public void OnEndOfSpeech()
    {
        StartButton.GetComponentInChildren<TextMeshProUGUI>().text = "已結束,點擊聆聽";
        StartButton.interactable = true;
    }

    public void OnBeginOfSpeech()
    {
        StartButton.GetComponentInChildren<TextMeshProUGUI>().text = "聆聽ing";
        StartButton.interactable = false;
    }
}

最后就是打包了

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

注:這里的包名必須跟你配置文件里面的一致才行,還有就是再重復一遍,Classes.jar用mono還是IL2CPP得和Unity-PlayerSetting-ScriptBackend一致。

unity 接受語音,android,unity,語音識別,Powered by 金山文檔

打包成功,測試正常(注意開啟權限哦)文章來源地址http://www.zghlxwxcb.cn/news/detail-735452.html

到了這里,關于Unity2021接入訊飛語音聽寫(Android)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Unity+訊飛語音+訊飛星火+Motionverse打造智能數字人

    不廢話,先來效果視頻 unity+訊飛語音識別+訊飛星火大模型+Motionver 然后說說原理 要實現這個,主要的實現三個模塊的接入: 語音識別。作用是吧麥克風的語音轉化為gpt大模型能夠識別的文字。然后發(fā)給gpt。 GPT大模型。作用當然是把第一步中生成的問題文字轉換為解答文本。

    2024年02月12日
    瀏覽(27)
  • Unity+C#,訊飛 文本轉語音、語音轉文本

    Unity+C#,訊飛 文本轉語音、語音轉文本

    ??本文介紹在Unity3D中,使用C#編寫訊飛文本轉語音、語音轉文本的功能。這兩個功能相似,學會一個另一個就簡單了。建議新建一個Unity3D項目來進行測試,否則極大可能會出現各種問題。 首先在訊飛開放平臺上獲取以下三個內容: APPID、APISecret、APIKey 。 新建一個Unity3D項

    2024年02月03日
    瀏覽(18)
  • Unity接入GVoice騰訊實時語音

    Unity接入GVoice騰訊實時語音

    最近在做一個實時競技類游戲,類似于王者榮耀類型的MOBA類實時聯(lián)網游戲。針對戰(zhàn)斗和組隊界面需要加入語音的方便大家進行交流,看了幾家語音價格也都是參差不齊最后選擇的是騰訊的GVoice(價格很低折合費用下來一人一天0.012元),這個也是我們目前用的最合適的。后面

    2024年02月20日
    瀏覽(17)
  • UE4如何接入科大訊飛的語音識別

    UE4如何接入科大訊飛的語音識別

    本文用的是UE4 4.27測試 安卓版測試鏈接: 鏈接:https://pan.baidu.com/s/1CsdJecfyMTdxNd6XfSECQQ 提取碼:m122 B站視頻連接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0 GitHub地址:https://github.com/zhangmei126/XunFei 第一步 新建一個VS的UE4 4.27項目工程(注意是UE4 4.27 VS項目) 第二步 新建一

    2023年04月08日
    瀏覽(51)
  • Unity3d發(fā)布android項目,打包apk包流程(unity2021.3.10)

    Unity3d發(fā)布android項目,打包apk包流程(unity2021.3.10)

    1、如下圖,在安裝版本設置里,點擊添加模塊。如果沒有添加模塊,證明你安裝路徑不是目前版本的安裝路徑,先去設置回來。 2、框選Android Build Support,點擊繼續(xù),如下圖, 3、同意,安裝,如下圖, 4、等待安裝完成即可,如下圖。 1、點擊菜單欄File→Build Settings,進行編輯

    2023年04月23日
    瀏覽(92)
  • Unity與Android交互(4)——接入SDK

    Unity與Android交互(4)——接入SDK

    【前言】 unity接入Android SDK有兩種方式,一種是把Unity的工程導出google project的形式進行接入,另一種是通過把Android的工程做成Plugins的形式進行接入。我們接入SDK基本都是將SDK作為插件的形式接入的。 對我們接入SDK的人來說,SDK也是分等級的: 第一等級:只有so文件,這種

    2024年02月16日
    瀏覽(25)
  • Unity Android平臺接入支付寶支付全流程

    Unity Android平臺接入支付寶支付全流程

    ??Unity3D接入支付寶支付的流程非常復雜,涉及到很多方面(有任何問題都可以在評論區(qū)留言,我盡量盡快回復)所以寫篇文章記錄一下。支付寶支付和微信支付以及其它支付差不多,但是支付寶有沙箱環(huán)境,可以很方便地調試,所以選用支付寶平臺作為演示。 ??此教程

    2024年04月29日
    瀏覽(19)
  • Unity接入IAP內購(Android,IOS)最新流程,第一篇:內購接入

    Unity接入IAP內購(Android,IOS)最新流程,第一篇:內購接入

    你好! 這將是一個系列的文章 第一篇 介紹客戶端里支付的調起以及購買。 第二篇 介紹后臺對購買結果的驗證以及發(fā)貨(IOS)。 第三篇 介紹后臺對購買結果的驗證以及發(fā)貨(Android)。 第四篇 介紹后臺對內購退單問題的處理(IOS欺詐檢測以及欺詐信息反饋)。 我們是用的

    2024年04月13日
    瀏覽(21)
  • Unity 歐盟UMP用戶隱私協(xié)議Android接入指南

    Unity 歐盟UMP用戶隱私協(xié)議Android接入指南

    Google 歐盟地區(qū)用戶意見征求政策 UMPSDK接入文檔 mainTemplate.gradle 中引入 項目路徑下 Assets/Plugins/Android/mainTemplate.gradle CustomUnityPlayerActivity 導入UMP相關的包 java類中新增字段 初始化UMPSDK方法 在下面代碼注釋 “加載廣告”的地方處理你的開屏廣告 調用 測試 TEST-DEVICE-HASHED-ID 為你的

    2024年02月03日
    瀏覽(31)
  • Unity使用Android Stdio接入SDK制作AAR包

    Unity使用Android Stdio接入SDK制作AAR包

    最近需要在Unity2021版本中接入SDK,發(fā)現和直接接入SDK有些區(qū)別,這里把接入的流程記錄一下。 Unity在最新的版本中把UnityPlayActivity.java,從Class.jar中移除,需要在Unity的工程內找到這個文件,并把其加入到Android Stadio內,才能使用。 ①選擇Android Library ②包名要和Unity工程里面相

    2024年02月10日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包