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,支持 GET 和 POST 请求,并返回音频流或 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的书写规则
cmd把Enter解析为命令的结束换行必须用^(^后面不能有多余的空格)路径中有空格,必须用双引号包裹(
-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(v3也可以,两者对模型文件具有兼容) 点击后 会进入新的游览器网页 ----- 看了一圈,发现主要问题集中在模型的训练很需要CPU,也就是模型的制作上,问题很多,如果有现有…...
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集群使用哈希槽(Hash Slot)来管理数据分布,整个集群被划分为固定的16384个哈希槽。当我们在集群中存储一个键时,Redis会先对键进行哈希运算,得到一个哈希值。然后,Redis将该哈…...
docker pull 提示timeout
通过命令行拉取对应的mysql版本提示网络超时。 开始排查,首先确认是否能浏览器访问。ok的,可以正常访问。 终端curl 排查嗯 有问题 改了下 终端 vim ~/.zshrc 加入 export HTTP_PROXY"http://127.0.0.1:7890" export HTTPS_PROXY"…...
(超详细) ETL工具之Kettle
Kettle简介 kettle最早是一个开源的ETL工具,后命名为Pentaho Data Integration。由JAVA开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道,可对接包括传统数据库、文件、大数据平台、接口、流…...
Android第三次面试总结(网络篇)
在计算机网络领域,网络模型是理解通信原理的基础框架。本文将详细解析 OSI 参考模型和 TCP/IP 模型的分层结构、核心功能及实际应用,并通过对比帮助读者建立完整的知识体系。 一、OSI 参考模型:七层架构的理论基石 OSI(开放系统…...
国产编辑器EverEdit - Hex Dump插件:看到文本的另一面!
1 Hex Dump插件 1.1 应用场景 有时可能需要显示字母的ASCII编码,或其他文字的字节编码,可以使用Hex Dump插件来完成 1.2 使用方法 安装Hex Dump插件,安装插件方法参考:扩展管理 在编辑器中选中文本,选择扩展 -> …...
random_masking 函数测试
文章目录 1. description2. excel3. pytorch code 1. description 功能:按一定比例的随机部分样本,简单来说就是按照一定的比例将行向量从小到大的顺序提取出来。思考1: 用了均匀分布,并且按照一定比例,取前prob概率来…...
TDengine 中的流式计算
简介 TDengine 中的流计算,功能相当于简化版的 FLINK , 具有实时计算,计算结果可以输出到超级表中存储,同时也可用于窗口预计算,加快查询速度。 创建流式计算 CREATE STREAM [IF NOT EXISTS] stream_name [stream_o…...
Java 大视界 -- Java 大数据在智慧交通自动驾驶仿真与测试数据处理中的应用(136)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s中的组件
1.namespace Namespace 用于将集群资源划分为不同的逻辑组,方便管理和隔离 kubectl get namespace 查看所有逻辑组 kubectl describe namespace <namespace-name> 查看某个逻辑组信息详情 kubectl create namespace ... 创建逻辑组 kubectl delete names…...
JVM的一些知识
JVM简介 JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别: VMw…...
【安全运营】用户与实体行为分析(UEBA)浅析
目录 用户与实体行为分析(UEBA)简介一、UEBA的核心概念1. 行为基线建立2. 异常检测3. 风险评分4. 上下文关联 二、UEBA的应用场景1. 内部威胁检测2. 外部威胁应对3. 合规性和审计支持 三、UEBA的技术实现1. 大数据技术2. 机器学习算法3. 可视化工具 四、…...
sql小记,20250319
ps:基于sqlserver 一、绩效管理系统表设计 1.表设计 Users用户表:包含id,用户名,密码。 AppraisalBases评价(职位基数)表:包含职位id,职位年终奖基数 AppraisalCoeffcients评价系数表:包含类别id, 类别&…...
C语言每日一练——day_7
引言 针对初学者,每日练习几个题,快速上手C语言。第七天。(连续更新中) 采用在线OJ的形式 什么是在线OJ? 在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用…...
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#的简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式是一种创建型设计模式,主要将对象的创建和使用分离,使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式,以下是 C# 实现的三个案例: 简单工厂模式 简单工厂模式通过一个工厂类来创建…...
用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七层模型:网络世界的"七重天"生存指南(附快递小哥版图解) “如果你觉得网络分层很抽象,那就想象自己在寄快递” —— 来自一个被三次握手逼疯的程序员 开场白:网络通信就像送外卖 假设你要给隔壁妹子送奶…...
AI训练如何获取海量数据,论平台的重要性
引言:数据——AI时代的“新石油” 在人工智能和大模型技术飞速发展的今天,数据已成为驱动技术进步的 “ 燃料 ”。无论是训练聊天机器人、优化推荐算法,还是开发自动驾驶系统,都需要海量、多样化的数据支持。 然而,获…...
Axure高级功能深度解析一一高效原型设计的利器
Axure作为一款专业的原型设计工具,凭借其强大的功能和灵活的交互设计,成为了众多设计师和开发者的首选。本文将深入探讨Axure的高级功能,帮助大家更好地利用这款工具,提升原型设计的效率和质量。 一、Axure高级功能概览 • 变量管…...
QT国产化系统软件开发
一、国产操作系统 1、鸿蒙HarmonyOS NEXT 核心架构 采用自研鸿蒙内核,完全脱离Linux与AOSP代码,基于分布式架构实现跨设备资源虚拟化整合,支持动态调度多终端硬件能力。通过分布式软总线技术(D-Bus)实现低时延…...
Git 使用SSH登陆
一、SSH介绍 SSH连接相比于HTTP连接会简单一点,因为SSH连接通过了私钥与公钥进行身份认证,这样就不需要像HTTP一样,每次clone或者操作仓库都需要输入密码 其中私钥和密钥是需要在自己电脑上生成的,通过命令即可生成一个私钥和一个…...
织梦DedeCMS修改文章【标题、短标题、关键词】长度限制
在后台虽然可以设置标题的长度,但是数据库的字段固定是60个字符,短标题是36字符,关键词30字符,所以这里教大家修改一下织梦DedeCMS修改【标题】【短标题】【关键词】长度限制 一、后台配置 1、进入dede后台管理 -> 系统 ->…...
Powershell WSL部署ubuntu22.04.5子系统
前提条件WSL 安装 wsl 安装参考1wsl 安装csdn参考2wsl 百度网盘离线下载 本地目录安装ubuntu22.04.5 子系统 powershell 管理员打开执行(实现,下载安装ubuntu子系统,用户创建,远程ssh登录设置,防火墙端口开放)子系统IP 查看方法wsl...
umi自带的tailwindcss修改为手动安装
1》为什么改为手动? 主要是为了解决这个报错问题,虽然重新运行也可解决,但是总是要运行2-3次,比较麻烦 2》如何手动 1,先在devDependencies下安装这两个包 pnpm install postcss8.5.1 -D "autoprefixer"…...
Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战
一、问题背景与实现难点 在Android 13横屏设备开发中,系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧,这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现,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权限(可选) mkdir -p ~/.kube sudo cp /etc/r…...
SQL Server数据库简介及应用
SQL Server以高性能、高可用性著称,支持Windows/Linux跨平台部署,满足混合云需求。其内存优化表、列存储索引加速数据处理,AlwaysOn可用性组保障业务连续性。安全体系集成身份验证与加密,符合企业合规要求。与Azure无缝集成&#…...


