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

Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流

GPT-SoVITS

GPT-SoVITS- v2(v3也可以,两者对模型文件具有兼容)

点击后 会进入新的游览器网页

-----

看了一圈,发现主要问题集中在模型的训练很需要CPU,也就是模型的制作上,问题很多,如果有现有的模型,直接引用,使用“推理”即可

基于GPT-SoVITS一键包的合成语音基础 - 哔哩哔哩

就比如用GPT-SoVITS 一色彩羽语音模型分享_哔哩哔哩_bilibili

这个up主练出来的模型

自己要做的其实就很少了

导入之后重启webui.bat

再开启TTS推理WebUI,就进入了UI界面,自己点击交互设置,然后产出结果可以直接用

但这是SoVITS的界面交互,想在unity里使用,必须要用提供的API(不同于网络API的本地API,不需要联网,可以直接处理)

【unity+gpt-sovits接口集成】AI二次元小姐姐项目集成gpt-sovits的api模块,可以实现局域网的丝滑互动了_哔哩哔哩_bilibili

这个up的项目现在也在维护,进项目里了解是可以的,但是在里面的使用过程总是有一些报错,想解决比较麻烦

但是还是可以了解重要的区域是哪一块,哪里要改

而且up对功能的拆分也很不错,LLM类和TTS类分开,大概率是用了继承,然后下面的多个模型都可以使用,在各自里写网络传递请求的方法

---

GPT-SoVITS教程5-如何调用API_哔哩哔哩_bilibili

ViTS的Api调用,是和webui分开的一种更偏向接口功能切割,整块提供的,所以只需要api.bat文件打开,就可以连接api了

对于这个http

http://localhost:9880/docs用这个代替才能进fastapi

然后就进入了api的模块,,这里有参数设置然后自动生成请求格式的

这里的路径是可以填绝对路径的

prompt都是传入的材料的

之后的text则是需要生成的文本、语言(再后面的可以调整也可以不动)

api的格式,,在这生成的是一模一样的

URL 传输时,会对特殊字符进行 百分号编码(Percent-Encoding),比如:

  • \(反斜杠) → %5C
  • :(冒号) → %3A
  • 日文、中文等非 ASCII 字符 会用 UTF-8 编码 转成 %E7%等形式
  • 空格%20

所以会出现乱码一样的情况,但是信息没有变

把这一段直接粘贴到游览器,可以直接得到生成 的音频文件,

(换行清晰格式
localhost:9880/
?refer_wav_path=D%3A%5CBaiduNetdiskDownload%5CUnity_Related%5CIroha%5C参考音频%5C测试参考音频%5C001.私としては奉仕部が協力してくれるのが一番%E3%80%80面倒がないんです.wav
&prompt_text=私としては奉仕部が協力してくれるのが一番%E3%80%80面倒がないんです
&prompt_language=日文
&text=コネクタの使い方すら知らないなんてバカなの?
&text_language=日文
&top_k=15
&top_p=1
&temperature=1
&speed=1

TITS里的切分,是为了生成的时候不跳字吞字而切分的

但是默认的基础api里是不切分的,很容易出现问题

那问题来了,我要怎么整合到unity里用,通过这个网站上的这种格式简化肯定不现实

下面是api的注释内容,

基于 HTTP 请求的语音合成 API,支持 GETPOST 请求,并返回音频流或 JSON 结果。

在 Unity 里调用它,需要构建 HTTP 请求 并处理 返回的音频数据

简单测试的,用GET 请求,参数放在 URL 里(可见),要传的数据量少
URL 可直接访问,可以用浏览器打开测试

POST 请求,参数放在请求体里(Body),不会出现在 URL,不能用游览器打开
适用于复杂请求(大数据/JSON)浏览器不会缓存,数据不会暴露在 URL
支持 JSON、文件上传等复杂数据

直接按照api注释里的来不行

在unity中要使用http,在这里改成allow,,默认是为了安全不允许使用的

改了之后,就可以收到并和api产生交互了

本来以为这些填进去的东西一次只能一填,但并不是这样的

这个网站 是api文档,,对传输的输入字符串 的格式规则的介绍

并没有什么很复杂的地方

要做的是在unity的C#脚本里调用传入这段字符串的时候,这段字符串是符合格式的,是可以丢给UnityWebRequest去做访问请求,并且拿到返回的数据的

也就是说,在APi文档介绍下,我复制这种格式,然后把需要的部分变成变量,其实就已经可以做到APi较好的交互了

现在unity里已经可以发出声音了,,不过这个效果的确是一言难尽,

原来那些B站上发视频这么像的,都是自己一句一句挑最好的表现出来,,

那确实很肝,

---

处理GPTAPI的SSE响应流

功能是串通了,可以做到输入文本并且朗读出来了

但是没有使用流,  等待文本彻底发回----将文本整个进行TTS,有较长的等待周期,(对于DeepSeek这点更加严重,GPT回复的相对更快,两者的API文档差距并没有很多,接下来还是以GPT的API调用来develop)

为了改进,所以先去了解一下gpt的api调用里,是怎么规定实现流的传输的

想让GPT一边生成文本,TTS立刻 解析并且读出来

对于这个的解决方案就是多种的

比如GPT每生成一段文本到逗号和句号的位置,TTS就拆开了一段,并且解析成需要播放的资源

GPT生成文本的速度一般快于TTS转--读的速度,那是否需要一个queue来装载后续的每个文件,然后一直播放?这样会不会出现语句衔接不自然的问题?(但现在主要是解决等待问题,这一方面可以不考虑)

--

先是得到SSE的响应,这在OpenAI的API请求上有变化

下面是第一次成功用cmd接收了SSE响应的格式

curl -N -X POST "https://api.openai.com/v1/chat/completions" ^-x http://127.0.0.1:7890 ^-H "Authorization: Bearer sk-你的API密钥" ^-H "Content-Type: application/json" ^-H "Accept: text/event-stream" ^-H "Cache-Control: no-cache" ^-d "{ \"model\": \"gpt-4o\", \"messages\": [ { \"role\": \"user\", \"content\": \"和我讲讲陶喆是谁\" } ], \"stream\": true }"

这里坑最多的还是curl的测试,对语法的忽视,而这一点AI同样经常忽视

换行符,在很多地方粘贴为了美观会自动加上(或者自动删除没有内容的连续空格),这就让curl真的没有用都浑然不知,,比如我粘贴到了CSDN上,然后再复制,就不能在cmd窗口运行了

所以很有必要了解cmd的书写规则


cmdEnter 解析为命令的结束换行必须用^(^ 后面不能有多余的空格)

路径中有空格,必须用双引号包裹( -d 里JSON 里的空格不影响

curl 允许多个空格,但少部分情况下会出现问题,

出现More?的时候才是说明你是想为了美观用 ^换行了,本质上还是一串黏在一起的

在之后的测试里(注意这里^后面的空格是为了分开,在cmd里绝对不能加)

-X POST  并不必要特意声明post请求类型

-N 也不必要特意声明是(逐行读取流式数据,对于curl)

-x http://127.0.0.1:7890 ^  至关重要 这段对代理的引用,在cmd里curl发送请求给服务器(应该是cmd自己的问题,curl总是不按照代理的来走,手动set Proxy代理也出问题)

-H "Accept: text/event-stream" ^    这个也并不重要,可以去掉

-H "Cache-Control: no-cache" ^    这句也不重要(大部分应该都是openai的api网站已经配置好了)

最后保留的的确只有官方文档里的了curl请求格式了(注意一下换行符和空格)

-------curl可以访问之后,是想c#如何可以接收这种持久输出的格式--

可以接受响应了(apikey的粘贴复制容易出现一些莫名其妙的误差,会提示unauthorized就说明响应是没问题的,只是apikey有格式的问题,去了解一下key传过来的复制粘贴会不会额外动里面的数据)

在请求根据官方api格式发了之后,

 目前接受响应的办法,但是这些都是一次性发送到unity的,没有做到逐条更新var response = await httpClient.PostAsync(apiUrl, new StringContent(jsondata, Encoding.UTF8, "application/json"));Debug.Log(response.StatusCode);Debug.Log(response.Content.ReadAsStringAsync().Result);using (var stream = await response.Content.ReadAsStreamAsync())using (var reader = new StreamReader(stream, Encoding.UTF8)){string line;while ((line = await reader.ReadLineAsync()) != null){if (line.StartsWith("data:")){string data = line.Substring(5);// 在这里处理接收到的数据Debug.Log(data);}}}

完结,HttpClient.SendAsync 方法 (System.Net.Http) | Microsoft Learn

的确是因为httpclient本身的方法里没有可以设置接受请求头就返回的方法

要换成SendAsync(HttpRequestMessage requst)

必须 自己构建这个Message的内部消息,让httpclient帮忙发送

整个完整的函数,在各个类功能正常运行的情况下逻辑一定是没问题的(如果有问题就检查自己的httpclient要不要额外设置代理Proxy,还有就是apikey的复制粘贴可能自动修改内容的问题)

 async Task GetChatStream(string userInput){// 请求的 JSON 数据var requestData = new{model = "gpt-4",messages = new[]{new { role = "system",content = CharacterSetting },new { role = "user", content = userInput }},stream = true};string jsondata = JsonConvert.SerializeObject(requestData);// Print the complete request in a format that can be used directly with curl//string curlCommand = $"curl -X POST \"{apiUrl}\" -H \"Authorization: Bearer {apiKey}\" -H \"Content-Type: application/json\" -d '{jsondata}'";Debug.Log("jsondataBody_Ready");var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, apiUrl){Content = new StringContent(jsondata, Encoding.UTF8, "application/json")};httpRequestMessage.Headers.TryAddWithoutValidation("Authorization", $"Bearer {apiKey}");//*****************************************var response = await httpClient.SendAsync(httpRequestMessage, HttpCompletionOption.ResponseHeadersRead);Debug.Log("response.StatusCode:" + response.StatusCode);//Debug.Log(response.Content.ReadAsStringAsync().Result);using (var stream = await response.Content.ReadAsStreamAsync()){//  Debug.Log("stream");using (var reader = new StreamReader(stream, Encoding.UTF8)){// Debug.Log("reader");string line;while ((line = await reader.ReadLineAsync()) != null){//  Debug.Log("line");if (line.StartsWith("data:")){string chunkdata = line.Substring(5);// 在这里处理接收到的数据var openAIChunk = JsonConvert.DeserializeObject<OpenAIChunk>(chunkdata);Debug.Log(openAIChunk.Choices[0].Delta.Content);text.text += openAIChunk.Choices[0].Delta.Content;}}}}}

优化整理

需要的功能:玩家的对话,AI记得聊天历史

项目启动的时候自动打开SoVITS,可以的话不要显示控制台

目前暂时定这两个需求

之后的打算:把这个2d的交互场景设置到3D场景里,在3D的场景里实现这个2D窗口的所有功能

---

目前先做一个Scroll view,可以滚动查看聊天记录

配置好了,接下来接入SoVITS,还有角色动嘴

Process 类 (System.Diagnostics) | Microsoft Learn

//关于SoVITS的API打开,想了一下还是不管窗口显隐的问题了,还有打开会需要10秒左右的时间,不能产生空判断,这一段的过程比较重复,是一些使用信息的积累,可以做但是还是先管更重要的东西

---所以接下来都假设在SoVITS已经打开好的条件下(正常来说游戏的进入动画就可以把这些给做了,我在这做了也不知道实际如何)

Process类也不用了,直接到队列读取那一块了

这里把对话内容的 实时更新Text组件 和  拆分句子给SoVITS去转换成audioClip文件播放  分开

而且返回的响应一般是一个字的居多,也就不考虑一次来的响应里有多个字符,标点在前面了

很好,看的到播放的队列正常更新了,Clip队列也一直在运作 

现在就差口型的绑定了,这一部分就直接绑定audioSource就可以了

就会根据音量调整嘴巴的闭合

存在嘴巴没有跟着张开的情况,这里的模式调整为override,就可以避免视线 追踪 对2D模型的动画状态一直在调整

这里是调整声音大小的标准,让嘴巴在正确的区间里开闭

相关文章:

Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;两者对模型文件具有兼容&#xff09; 点击后 会进入新的游览器网页 ----- 看了一圈&#xff0c;发现主要问题集中在模型的训练很需要CPU&#xff0c;也就是模型的制作上&#xff0c;问题很多&#xff0c;如果有现有…...

Django初窥门径-Django REST Framework 基础使用

前言 在现代 Web 开发中,构建高效、安全且易于维护的 API 至关重要。Django REST framework(简称 DRF)作为 Django 生态中的强大工具,为开发者提供了创建 RESTful API 所需的完整解决方案。本文将详细介绍如何使用 Django 和 DRF 构建一个用户管理 API,涵盖环境配置、序列…...

LoRA中黑塞矩阵、Fisher信息矩阵是什么

LoRA中黑塞矩阵、Fisher信息矩阵是什么 1. 三者的核心概念 黑塞矩阵(Hessian) 二阶导数矩阵,用于优化问题中判断函数的凸性(如牛顿法),或计算参数更新方向(如拟牛顿法)。 Fisher信息矩阵(Fisher Information Matrix, FIM) 统计学中衡量参数估计的不确定性,反映数据…...

Redis哈希槽机制的实现

Redis哈希槽机制的实现 Redis集群使用哈希槽&#xff08;Hash Slot&#xff09;来管理数据分布&#xff0c;整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时&#xff0c;Redis会先对键进行哈希运算&#xff0c;得到一个哈希值。然后&#xff0c;Redis将该哈…...

docker pull 提示timeout

通过命令行拉取对应的mysql版本提示网络超时。 开始排查&#xff0c;首先确认是否能浏览器访问。ok的&#xff0c;可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…...

(超详细) ETL工具之Kettle

Kettle简介 kettle最早是一个开源的ETL工具&#xff0c;后命名为Pentaho Data Integration。由JAVA开发&#xff0c;支持跨平台运行&#xff0c;其特性包括&#xff1a;支持100%无编码、拖拽方式开发ETL数据管道&#xff0c;可对接包括传统数据库、文件、大数据平台、接口、流…...

Android第三次面试总结(网络篇)

在计算机网络领域&#xff0c;网络模型是理解通信原理的基础框架。本文将详细解析 OSI 参考模型和 TCP/IP 模型的分层结构、核心功能及实际应用&#xff0c;并通过对比帮助读者建立完整的知识体系。 一、OSI 参考模型&#xff1a;七层架构的理论基石 OSI&#xff08;开放系统…...

国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!

1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码&#xff0c;或其他文字的字节编码&#xff0c;可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件&#xff0c;安装插件方法参考&#xff1a;扩展管理 在编辑器中选中文本&#xff0c;选择扩展 -> …...

random_masking 函数测试

文章目录 1. description2. excel3. pytorch code 1. description 功能&#xff1a;按一定比例的随机部分样本&#xff0c;简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1&#xff1a; 用了均匀分布&#xff0c;并且按照一定比例&#xff0c;取前prob概率来…...

TDengine 中的流式计算

简介 TDengine 中的流计算&#xff0c;功能相当于简化版的 FLINK &#xff0c; 具有实时计算&#xff0c;计算结果可以输出到超级表中存储&#xff0c;同时也可用于窗口预计算&#xff0c;加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…...

Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

k8s中的组件

1.namespace Namespace 用于将集群资源划分为不同的逻辑组&#xff0c;方便管理和隔离 kubectl get namespace 查看所有逻辑组 kubectl describe namespace <namespace-name> 查看某个逻辑组信息详情 kubectl create namespace ... 创建逻辑组 kubectl delete names…...

JVM的一些知识

JVM简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; VMw…...

【安全运营】用户与实体行为分析(UEBA)浅析

目录 用户与实体行为分析&#xff08;UEBA&#xff09;简介一、UEBA的核心概念1. 行为基线建立2. 异常检测3. 风险评分4. 上下文关联 二、UEBA的应用场景1. 内部威胁检测2. 外部威胁应对3. 合规性和审计支持 三、UEBA的技术实现1. 大数据技术2. 机器学习算法3. 可视化工具 四、…...

sql小记,20250319

ps:基于sqlserver 一、绩效管理系统表设计 1.表设计 Users用户表&#xff1a;包含id&#xff0c;用户名&#xff0c;密码。 AppraisalBases评价(职位基数)表&#xff1a;包含职位id&#xff0c;职位年终奖基数 AppraisalCoeffcients评价系数表&#xff1a;包含类别id, 类别&…...

C语言每日一练——day_7

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第七天。&#xff08;连续更新中&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff09;是一种在编程竞赛中用…...

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...

C#的简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式是一种创建型设计模式&#xff0c;主要将对象的创建和使用分离&#xff0c;使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;以下是 C# 实现的三个案例&#xff1a; 简单工厂模式 简单工厂模式通过一个工厂类来创建…...

用hexo初始化博客执行hexo init时碰到的问题

用hexo初始化博客执行hexo init时碰到的问题 $ hexo init myblog INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: SSL certificate problem: unable to get local issuer cer…...

4.1--入门知识扫盲,ISO知识体系介绍(看一遍,协议啥的全部记住)

OSI七层模型&#xff1a;网络世界的"七重天"生存指南&#xff08;附快递小哥版图解&#xff09; “如果你觉得网络分层很抽象&#xff0c;那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白&#xff1a;网络通信就像送外卖 假设你要给隔壁妹子送奶…...

AI训练如何获取海量数据,论平台的重要性

引言&#xff1a;数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天&#xff0c;数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法&#xff0c;还是开发自动驾驶系统&#xff0c;都需要海量、多样化的数据支持。 然而&#xff0c;获…...

Axure高级功能深度解析一一高效原型设计的利器

Axure作为一款专业的原型设计工具&#xff0c;凭借其强大的功能和灵活的交互设计&#xff0c;成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能&#xff0c;帮助大家更好地利用这款工具&#xff0c;提升原型设计的效率和质量。 一、Axure高级功能概览 • 变量管…...

QT国产化系统软件开发

一、国产操作系统 1、鸿蒙HarmonyOS NEXT ‌核心架构‌ 采用自研鸿蒙内核&#xff0c;完全脱离Linux与AOSP代码&#xff0c;基于分布式架构实现跨设备资源虚拟化整合&#xff0c;支持动态调度多终端硬件能力‌。通过分布式软总线技术&#xff08;D-Bus&#xff09;实现低时延…...

Git 使用SSH登陆

一、SSH介绍 SSH连接相比于HTTP连接会简单一点&#xff0c;因为SSH连接通过了私钥与公钥进行身份认证&#xff0c;这样就不需要像HTTP一样&#xff0c;每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的&#xff0c;通过命令即可生成一个私钥和一个…...

织梦DedeCMS修改文章【标题、短标题、关键词】长度限制

在后台虽然可以设置标题的长度&#xff0c;但是数据库的字段固定是60个字符&#xff0c;短标题是36字符&#xff0c;关键词30字符&#xff0c;所以这里教大家修改一下织梦DedeCMS修改【标题】【短标题】【关键词】长度限制 一、后台配置 1、进入dede后台管理 -> 系统 ->…...

Powershell WSL部署ubuntu22.04.5子系统

前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl...

umi自带的tailwindcss修改为手动安装

1》为什么改为手动&#xff1f; 主要是为了解决这个报错问题&#xff0c;虽然重新运行也可解决&#xff0c;但是总是要运行2-3次&#xff0c;比较麻烦 2》如何手动 1&#xff0c;先在devDependencies下安装这两个包 pnpm install postcss8.5.1 -D "autoprefixer"…...

Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战

一、问题背景与实现难点 在Android 13横屏设备开发中&#xff0c;系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧&#xff0c;这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现&#xff0c;Android 13将相关逻辑迁移至Launche…...

基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程

1. 安装k3s集群 1.1 单节点快速部署 # 使用root或sudo权限执行 curl -sfL https://get.k3s.io | sh -# 验证安装 sudo kubectl get nodes # 输出应为Ready状态 sudo systemctl status k3s1.2 配置kubectl权限&#xff08;可选&#xff09; mkdir -p ~/.kube sudo cp /etc/r…...

SQL Server数据库简介及应用

SQL Server以高性能、高可用性著称&#xff0c;支持Windows/Linux跨平台部署&#xff0c;满足混合云需求。其内存优化表、列存储索引加速数据处理&#xff0c;AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密&#xff0c;符合企业合规要求。与Azure无缝集成&#…...