当前位置: 首页 > news >正文

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

最近工作上遇到了要接入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;}@Overridepublic 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);}}@Overridepublic 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());}}@Overridepublic 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,urlint 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

http://www.lryc.cn/news/204550.html

相关文章:

  • python轻量规则引擎rule-engine入门与应用实践
  • 栓Q八股文: C++ 14/17 新特性
  • 虚拟世界游戏定制开发:创造独一无二的虚拟体验
  • Tomcat及jdk安装下载及环境配置(超超超详解)
  • 专业安卓实时投屏软件:极限投屏(QtScrcpy作者开发)使用说明
  • C++:二叉搜索树的原理和模拟实现
  • 学习视觉CV Transformer (2)--Transformer原理及代码分析
  • 【AI视野·今日CV 计算机视觉论文速览 第271期】Thu, 19 Oct 2023
  • GoLong的学习之路(四)语法之循环语句
  • 【Lua语法】字符串
  • 程序员节的由来
  • 订水商城H5实战教程-03用户协议
  • 淘宝app商品详情源数据API接口(解决滑块问题)可高并发采集
  • xcode15一直显示正在连接iOS17真机问题解决
  • stm32通过AT指令与esp8622通信
  • Flutter 类似onResume 监听,解决入场动画卡顿
  • 1024勋章
  • C++栈、队列、优先级队列模拟+仿函数
  • ES挂载不上怎么处理?
  • 问题与分类
  • 021-Qt 配置GitHub Copilot
  • 如何使用 PostgreSQL 进行数据迁移和整合?
  • Qt Signals Slots VS QEvents - Qt跨线程异步操作性能测试与选取建议
  • Postgres 和 MySQL 应该怎么选?
  • 【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
  • 我终于搞明白了HTTPS协议了!超长文章!
  • Golang Testify介绍
  • DALL·E 3怎么用?DALL·E 3如何申请开通 ?DALL·E 3如何免费使用?AI绘画教程来喽~
  • 安装 Dispatch 库
  • 【Unity程序技巧】异步保险箱管理器