Unity 通过jar包形式接入讯飞星火SDK

本文详细介绍了如何在安卓Unity项目中接入讯飞星火的SDK,包括下载、集成、修改代码以及使用WebSocket接口实现基础功能,最后提供了一个示例工程链接。
摘要由CSDN通过智能技术生成

最近工作上遇到了要接入gpt相关内容的需求,简单实现了一个安卓端接入讯飞星火的UnitySDK。
或者也可以接入WebSocket接口的。本文只讲安卓实现
我使用的Unity版本为2021.3.27f1c2
Android版本为4.2.2

1.下载SDK

登陆讯飞开放平台下载如图所示SDK
在这里插入图片描述

2.新建安卓工程

新建安卓工程,在工程下创建libs文件夹
在这里插入图片描述
下载的SDK解压后的aar文件至安卓工程的libs文件夹下
打开工程的build.gradle
复制以下代码
在这里插入图片描述
上面红框部分是引用aar,下面是打jar包的逻辑

3.根据原来的demo工程修改代码

package com.rayneo.sparklib;
import android.app.Activity;
import com.iflytek.sparkchain.core.LLM;
import com.iflytek.sparkchain.core.LLMCallbacks;
import com.iflytek.sparkchain.core.LLMConfig;
import com.iflytek.sparkchain.core.SparkChain;
import com.iflytek.sparkchain.core.SparkChainConfig;

public class SparkTool {

    private static final String TAG = "SparkLLM";
    private Activity _unityActivity;

    private String domain ="general";
    private String url = "wss://spark-api.xf-yun.com/v1.1/chat";

    public int initSDK(String appid,String apiKey,String apiSecret,int logLevel,String domain,String url) {
        // 初始化SDK,Appid等信息在清单中配置
        SparkChainConfig sparkChainConfig = SparkChainConfig.builder();
        sparkChainConfig.appID(appid)
                .apiKey(apiKey)
                .apiSecret(apiSecret)//应用申请的appid三元组
                .logLevel(logLevel);

        int ret = SparkChain.getInst().init(getActivity(),sparkChainConfig);

        this.domain = domain;
        this.url = url;

        return ret;
    }

    public void unInitSDK() {
        SparkChain.getInst().unInit();
    }

    Activity getActivity(){
        if(null == _unityActivity) {
            try {
                Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
                Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
                _unityActivity = activity;
            } catch (ClassNotFoundException e) {

            } catch (IllegalAccessException e) {

            } catch (NoSuchFieldException e) {

            }
        }
        return _unityActivity;
    }

    public int startChat(ISparkLLMProxy unityProxy,String msg) {

        LLMConfig llmConfig = LLMConfig.builder();
        llmConfig.domain(domain)
                .url(url);
        LLM llm = new LLM(llmConfig);
        LLMCallbacks llmCallbacks = new SparkLLMCallbacks(unityProxy);
        llm.registerLLMCallbacks(llmCallbacks);
        String myContext = "myContext";

        int ret = llm.arun(msg,myContext);

        return ret;
    }

}

这几个接口分别是初始化,释放,获取Unity的Activity,开始gpt。

package com.rayneo.sparklib;

public interface ISparkLLMProxy {

    void onLLMResult(int status, String Content);

    void onLLMEvent(int eventID, String eventMsg);

    void onLLMError(int errorCode, String var2);

}

package com.rayneo.sparklib;

import android.util.Log;

import com.iflytek.sparkchain.core.LLMCallbacks;
import com.iflytek.sparkchain.core.LLMError;
import com.iflytek.sparkchain.core.LLMEvent;
import com.iflytek.sparkchain.core.LLMResult;

public class SparkLLMCallbacks implements LLMCallbacks {

    private static final String TAG = "SparkLLMCallbacks";
    private ISparkLLMProxy unityProxy;

    public SparkLLMCallbacks(ISparkLLMProxy unityProxy) {
        this.unityProxy = unityProxy;
    }

    @Override
    public void onLLMResult(LLMResult llmResult, Object usrContext) {
        Log.d(TAG, "onLLMResult\n");
        String content = llmResult.getContent();
        Log.e(TAG, "onLLMResult:" + content);
        int status = llmResult.getStatus();
        if (unityProxy != null) {
            unityProxy.onLLMResult(status, content);
        }
    }

    @Override
    public void onLLMEvent(LLMEvent event, Object usrContext) {
        Log.d(TAG, "onLLMEvent\n");
        Log.w(TAG, "onLLMEvent:" + " " + event.getEventID() + " " + event.getEventMsg());
        if (unityProxy != null) {
            unityProxy.onLLMEvent(event.getEventID(), event.getEventMsg());
        }
    }

    @Override
    public void onLLMError(LLMError error, Object usrContext) {
        Log.d(TAG, "onLLMError\n");
        Log.e(TAG, "errCode:" + error.getErrCode() + "errDesc:" + error.getErrMsg());
        if (unityProxy != null) {
            unityProxy.onLLMError(error.getErrCode(), error.getErrMsg());
        }
    }
}

实现回调接口,让Unity可以注册
在这里插入图片描述
点击此处导出jar包
在这里插入图片描述

4.导入Unity工程

拷贝jar包和aar包至Unity工程此目录下
在这里插入图片描述

Androidmanifest增加
在这里插入图片描述
权限

using System;
using UnityEngine;
using UnityEngine.UI;
//using FfalconXR;

public class IFlyLLMHandler : MonoBehaviour
{
    public InputField input;

    public Button button;

    public Text text;

    private AndroidJavaObject sparkToolInstance;
    private void Start()
    {
        Loom.Initialize();
        sparkToolInstance = new AndroidJavaObject("com.rayneo.sparklib.SparkTool");

        InitializeSDK();

        button.onClick.AddListener(() =>
        {
            text.text = "";
            StartChat(input.text);
        });
    }
    public void InitializeSDK()
    {
        if (sparkToolInstance != null)
        {
            //输入开放平台的apikey等数据,appid,apiKey,apiSecret,logLevel,domain,url
            int ret = sparkToolInstance.Call<int>("initSDK", "9e803172", "e4045501df3916cad0c4137d43db8b3b", "ZWFiZGYwMjllNTkyYTFmNjE1YTNiMWRk", 0, "general", "");
            Debug.Log("initializeSDK error code is" + ret);
        }
        else
        {
            Debug.LogError("SparkTool instance is null. Make sure the Android plugin is properly imported.");
        }
    }
    public void StartChat(string msg)
    {
        if (sparkToolInstance != null)
        {
            int ret = sparkToolInstance.Call<int>("startChat", new SparkLLMProxy(onLLMResult, onLLMEvent, onLLMError), msg);
            Debug.Log("startChat error code is" + ret);
        }
        else
        {
            Debug.LogError("SparkTool instance is null. Make sure the Android plugin is properly imported.");
        }
    }

    private void onLLMError(int errorCode, string error)
    {
        Debug.Log("onLLMError errorCode " + errorCode + " error message " + error);
    }

    private void onLLMEvent(int eventID, string eventMsg)
    {
        Debug.Log("onLLMError eventID " + eventID + " eventMsg " + eventMsg);
    }

    private void onLLMResult(int status, string content)
    {
        Loom.QueueOnMainThread((p) =>
        {
            text.text += content;
        }, null);

        Debug.Log("onLLMResult status " + status + " content " + content);
    }

    public void UninitializeSDK()
    {
        if (sparkToolInstance != null)
        {
            sparkToolInstance.Call("unInitSDK");
        }
        else
        {
            Debug.LogError("SparkTool instance is null. Make sure the Android plugin is properly imported.");
        }
    }
}
public class SparkLLMProxy : AndroidJavaProxy
{

    private Action<int, string> onLLMResultCallback;
    private Action<int, string> onLLMEventCallback;
    private Action<int, string> onLLMErrorCallback;

    public SparkLLMProxy(Action<int, string> onLLMResult, Action<int, string> onLLMEvent, Action<int, string> onLLMError) : base("com.rayneo.sparklib.ISparkLLMProxy")
    {
        onLLMResultCallback = onLLMResult;
        onLLMEventCallback = onLLMEvent;
        onLLMErrorCallback = onLLMError;
    }

    public void onLLMResult(int status, string content)
    {
        if (onLLMResultCallback != null)
        {
            onLLMResultCallback(status, content);
        }
    }

    public void onLLMEvent(int eventID, string eventMsg)
    {
        if (onLLMEventCallback != null)
        {
            onLLMEventCallback(eventID, eventMsg);
        }
    }

    public void onLLMError(int errorCode, string error)
    {
        if (onLLMErrorCallback != null)
        {
            onLLMErrorCallback(errorCode, error);
        }
    }

}

接入安卓接口
打包运行至手机上
在这里插入图片描述
左边输入栏输入文本,点击按钮发送。收到返回即代表成功。

工程仓库地址为:https://github.com/oneSitDown/spark-unity

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值