字节火山引擎-大模型声音复刻,流式语音合成接口
字节火山引擎-大模型声音复刻,流式语音合成接口
-
参考文档:火山引擎-大模型声音复刻文档
-
官网给出的示例代码有bug,这里已经修改了
创建应用
声音复刻大模型页面查看应用,获取接口调用需要的参数
注意调用tts接口时候需要三个参数:
- APP ID => 获取到对应的应用
- Access Token => 鉴权需要
- 声音ID => 语音合成需要
Http流式合成音频接口示例代码
package mainimport ("bytes""encoding/base64""encoding/json""errors""fmt""github.com/gin-gonic/gin""github.com/google/uuid""io/ioutil""net/http""time"
)var (app_id = "8678693223"clusterId = "volcano_icl"SpeakId = "S_v7xollyj1"BearerToken = "-50OZ81pPKpn8pRZEgNrxd0wCELJJMIN"resource_id = "volc.tts_async.emotion"
)
var durationTime time.Duration// TTSServResponse response from backend services
type TTSServResponse struct {ReqID string `json:"reqid"`Code int `json:"code"`Message string `json:"Message"`Operation string `json:"operation"`Sequence int `json:"sequence"`Data string `json:"data"`
}func httpPost(url string, headers map[string]string, body []byte, timeout time.Duration) ([]byte, error) {client := &http.Client{Timeout: timeout,}req, err := http.NewRequest(http.MethodPost, url, bytes.NewBuffer(body))if err != nil {return nil, err}for key, value := range headers {req.Header.Set(key, value)}resp, err := client.Do(req)if err != nil {return nil, err}defer resp.Body.Close()retBody, err := ioutil.ReadAll(resp.Body)if err != nil {return nil, err}return retBody, err
}func synthesis(text string) ([]byte, error) {// 记录合成开始时间startTime := time.Now()reqID := uuid.NewString()params := make(map[string]map[string]interface{})params["app"] = make(map[string]interface{})params["app"]["appid"] = app_idparams["app"]["token"] = "access_token"params["app"]["cluster"] = clusterIdparams["user"] = make(map[string]interface{})params["user"]["uid"] = "uid"params["audio"] = make(map[string]interface{})params["audio"]["voice_type"] = SpeakIdparams["audio"]["encoding"] = "wav"params["audio"]["speed_ratio"] = 1.0params["audio"]["volume_ratio"] = 1.0params["audio"]["pitch_ratio"] = 1.0params["request"] = make(map[string]interface{})params["request"]["reqid"] = reqIDparams["request"]["text"] = textparams["request"]["text_type"] = "plain"params["request"]["operation"] = "query"headers := make(map[string]string)headers["Content-Type"] = "application/json"headers["Authorization"] = fmt.Sprintf("Bearer;%s", BearerToken)url := "https://openspeech.bytedance.com/api/v1/tts"timeo := 30 * time.SecondbodyStr, _ := json.Marshal(params)synResp, err := httpPost(url, headers, []byte(bodyStr), timeo)if err != nil {fmt.Printf("http post fail [err:%s]\n", err.Error())return nil, err}fmt.Printf("resp body:%s\n", synResp)var respJSON TTSServResponseerr = json.Unmarshal(synResp, &respJSON)if err != nil {fmt.Printf("unmarshal response fail [err:%s]\n", err.Error())return nil, err}codeMessages := map[int]string{3001: "无效的请求,请检查参数",3003: "并发超限,请稍后重试",3005: "后端服务忙,请稍后重试",3006: "服务中断,请检查参数",3010: "文本长度超限,请检查文本长度",3011: "无效文本,请检查文本内容",3030: "处理超时,请重试或检查文本",3031: "处理错误,后端出现异常,请重试",3032: "等待获取音频超时,请重试",3040: "后端链路连接错误,请重试",3050: "音色不存在,请检查voice_type代号",}code := respJSON.Codeif code != 3000 {fmt.Printf("code fail [code:%d]\n", code)message, exists := codeMessages[respJSON.Code]if !exists {message = "未知错误,请重试"}return nil, errors.New(message)}audio, _ := base64.StdEncoding.DecodeString(respJSON.Data)// 记录合成结束时间endTime := time.Now()durationTime = endTime.Sub(startTime)// 打印合成时间fmt.Printf("音频合成时间: %s\n", durationTime)return audio, nil
}// Handle TTS synthesis via Gin
func handleTTS(c *gin.Context) {var input map[string]stringif err := c.ShouldBindJSON(&input); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid input"})return}text, exists := input["text"]if !exists || text == "" {c.JSON(http.StatusBadRequest, gin.H{"error": "Text is required"})return}audio, err := synthesis(text)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": "Synthesis failed", "details": err.Error()})return}// Return audio in responsec.Data(http.StatusOK, "audio/wav", audio)
}func main() {r := gin.Default()// POST request to synthesize text to speechr.POST("/synthesize", handleTTS)// Start the serverr.Run(":8080")
}
websocket流式合成音频接口示例代码
package mainimport ("bytes""compress/gzip""encoding/binary""encoding/json""errors""fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""github.com/satori/go.uuid""io/ioutil""net/http""net/url""time"
)var (enumMessageType = map[byte]string{11: "audio-only server response",12: "frontend server response",15: "error message from server",}enumMessageTypeSpecificFlags = map[byte]string{0: "no sequence number",1: "sequence number > 0",2: "last message from server (seq < 0)",3: "sequence number < 0",}enumMessageSerializationMethods = map[byte]string{0: "no serialization",1: "JSON",15: "custom type",}enumMessageCompression = map[byte]string{0: "no compression",1: "gzip",15: "custom compression method",}
)const (optQuery string = "query"optSubmit string = "submit"
)var duration time.Duration
var addr = "openspeech.bytedance.com"
var ZijieWs_Url = url.URL{Scheme: "wss", Host: addr, Path: "/api/v1/tts/ws_binary"}// 保存appid和token的映射关系
var appTokenMap = map[string]string{"8678693223": "-50OZ81pPKpn8pRZEgNrxd0wCELJJMIN1ww", //胡桃"8724961923": "Ut0tYdEdwVvHgSzeV9gdXEN8EGXSlqBesdd", // 郭德纲"5046524282": "xRcD5NYAo0BMkMajm9JT3XAigKtRUBCOddd", // 钟离
}type synResp struct {Audio []byteIsLast bool
}// version: b0001 (4 bits)
// header size: b0001 (4 bits)
// message type: b0001 (Full client request) (4bits)
// message type specific flags: b0000 (none) (4bits)
// message serialization method: b0001 (JSON) (4 bits)
// message compression: b0001 (gzip) (4bits)
// reserved data: 0x00 (1 byte)
var defaultHeader = []byte{0x11, 0x10, 0x11, 0x00}func setupInput(text, voiceType, appid, opt string) []byte {var err errorreqID := uuid.Must(uuid.NewV4(), err).String()params := make(map[string]map[string]interface{})params["app"] = make(map[string]interface{})//平台上查看具体appidparams["app"]["appid"] = appidparams["app"]["token"] = "access_token"//平台上查看具体集群名称params["app"]["cluster"] = "volcano_icl"params["user"] = make(map[string]interface{})params["user"]["uid"] = "uid"params["audio"] = make(map[string]interface{})params["audio"]["voice_type"] = voiceTypeparams["audio"]["encoding"] = "mp3" // 设为 MP3 格式params["audio"]["sample_rate"] = 24000 // 设为 24kHz 采样率params["audio"]["speed_ratio"] = 1.0params["audio"]["volume_ratio"] = 1.0params["audio"]["pitch_ratio"] = 1.0params["request"] = make(map[string]interface{})params["request"]["reqid"] = reqIDparams["request"]["text"] = textparams["request"]["text_type"] = "plain"params["request"]["operation"] = optresStr, _ := json.Marshal(params)return resStr
}func gzipCompress(input []byte) []byte {var b bytes.Bufferw := gzip.NewWriter(&b)w.Write(input)w.Close()return b.Bytes()
}func gzipDecompress(input []byte) []byte {b := bytes.NewBuffer(input)r, _ := gzip.NewReader(b)out, _ := ioutil.ReadAll(r)r.Close()return out
}func parseResponse(res []byte) (resp synResp, err error) {protoVersion := res[0] >> 4headSize := res[0] & 0x0fmessageType := res[1] >> 4messageTypeSpecificFlags := res[1] & 0x0fserializationMethod := res[2] >> 4messageCompression := res[2] & 0x0freserve := res[3]headerExtensions := res[4 : headSize*4]payload := res[headSize*4:]fmt.Printf(" Protocol version: %x - version %d\n",protoVersion, protoVersion)fmt.Printf(" Header size: %x - %d bytes\n",headSize, headSize*4)fmt.Printf(" Message type: %x - %s\n", messageType,enumMessageType[messageType])fmt.Printf(" Message type specific flags: %x - %s\n", messageTypeSpecificFlags,enumMessageTypeSpecificFlags[messageTypeSpecificFlags])fmt.Printf("Message serialization method: %x - %s\n",serializationMethod, enumMessageSerializationMethods[serializationMethod])fmt.Printf(" Message compression: %x - %s\n",messageCompression, enumMessageCompression[messageCompression])fmt.Printf(" Reserved: %d\n", reserve)if headSize != 1 {fmt.Printf(" Header extensions: %s\n",headerExtensions)}// audio-only server responseif messageType == 0xb {// no sequence number as ACKif messageTypeSpecificFlags == 0 {fmt.Println(" Payload size: 0")} else {sequenceNumber := int32(binary.BigEndian.Uint32(payload[0:4]))payloadSize := int32(binary.BigEndian.Uint32(payload[4:8]))payload = payload[8:]resp.Audio = append(resp.Audio, payload...)fmt.Printf(" Sequence number: %d\n",sequenceNumber)fmt.Printf(" Payload size: %d\n", payloadSize)if sequenceNumber < 0 {resp.IsLast = true}}} else if messageType == 0xf {code := int32(binary.BigEndian.Uint32(payload[0:4]))errMsg := payload[8:]if messageCompression == 1 {errMsg = gzipDecompress(errMsg)}fmt.Printf(" Error code: %d\n", code)fmt.Printf(" Error msg: %s\n", string(errMsg))err = errors.New(string(errMsg))return} else if messageType == 0xc {var msgSize int32msgSize = int32(binary.BigEndian.Uint32(payload[0:4]))fmt.Println(msgSize)payload = payload[4:]if messageCompression == 1 {payload = gzipDecompress(payload)}fmt.Printf(" Frontend message: %s\n", string(payload))} else {fmt.Printf(" wrong message type:%d\n", messageType)err = errors.New("wrong message type")return}return
}// 流式合成
func DouBaoAudioStreamSynth(text, voiceType, appid string) ([]byte, time.Duration, error) {// 记录合成开始时间startTime := time.Now()// 从appTokenMap获取对应的tokentoken, exists := appTokenMap[appid]if !exists {return nil, 0, errors.New("invalid appid")}//鉴权使用var header = http.Header{"Authorization": []string{fmt.Sprintf("Bearer;%s", token)}}input := setupInput(text, voiceType, appid, optSubmit)input = gzipCompress(input)payloadSize := len(input)payloadArr := make([]byte, 4)binary.BigEndian.PutUint32(payloadArr, uint32(payloadSize))clientRequest := append(defaultHeader, payloadArr...)clientRequest = append(clientRequest, input...)// websocket连接到字节服务器c, _, err := websocket.DefaultDialer.Dial(ZijieWs_Url.String(), header)if err != nil {return nil, 0, err}defer c.Close()//c.WriteMessage(websocket.TextMessage, []byte("已连接至字节服务器..."))// 连接成功后提醒fmt.Println("Successfully connected to the byte server.")err = c.WriteMessage(websocket.BinaryMessage, clientRequest)if err != nil {return nil, 0, err}var audio []bytefor {_, message, err := c.ReadMessage()if err != nil {break}resp, err := parseResponse(message)if err != nil {break}audio = append(audio, resp.Audio...)if resp.IsLast {break}}// 记录合成结束时间endTime := time.Now()duration = endTime.Sub(startTime)// 打印合成时间fmt.Printf("音频合成时间: %s\n", duration)return audio, duration, nil
}// WebSocket流式合成
func WsStreamSynth2(c *gin.Context) {//创建websocket连接conn, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true}}).Upgrade(c.Writer, c.Request, nil)if err != nil {http.NotFound(c.Writer, c.Request)return}defer conn.Close()appid := c.Query("appid")voiceType := c.Query("voiceType")//appid := c.Query("appid")// 从appTokenMap获取对应的token//token, exists := appTokenMap[appid]//if !exists {// conn.WriteMessage(websocket.TextMessage, []byte("无效的 appid"))// return//}// 设置请求头//var header = http.Header{"Authorization": []string{fmt.Sprintf("Bearer;%s", token)}}conn.WriteMessage(websocket.TextMessage, []byte("连接已建立"))for {type RequestData struct {Text string `json:"text"`}var requestData RequestDataerr = conn.ReadJSON(&requestData)if err != nil {conn.WriteMessage(websocket.TextMessage, []byte("Invalid JSON format"))break//return}text := requestData.Text//voiceType := c.DefaultPostForm("voiceType", "S_v7xollyj1")// 从voiceTypeNameMap获取对应的声线//voiceType, exists := voiceTypeNameMap[voiceTypeName]//if !exists {// conn.WriteMessage(websocket.TextMessage, []byte("声线类型选择失败"))// return//}conn.WriteMessage(websocket.TextMessage, []byte("开始处理合成音频"))audio, duration, err := DouBaoAudioStreamSynth(text, voiceType, appid)if err != nil {conn.WriteMessage(websocket.TextMessage, []byte("生成音频失败"))break//return}// 将 time.Duration 转换为字符串durationStr := duration.String()// Send the audio back to the clientconn.WriteMessage(websocket.BinaryMessage, audio) // 发送二进制音频数据conn.WriteMessage(websocket.TextMessage, []byte("本次合成时间: "+durationStr))conn.WriteMessage(websocket.TextMessage, []byte("继续监听..."))}// You can keep the WebSocket open for further communication if needed:// For example, waiting for further synthesis requests or other commands.// Continue waiting for further requests or close after some time if no requests come.//for {// _, msg, err := conn.ReadMessage()// if err != nil {// // Handle connection close or error// break// }//// // Handle any incoming messages here if needed (optional)// // For instance, send a "ping" to keep the connection alive, or re-trigger synthesis.// conn.WriteMessage(websocket.TextMessage, []byte("继续监听..."))//}}func main() {// 初始化 Gin 路由r := gin.Default()// WebSocket 请求处理r.GET("/WsStreamSynth/ws", WsStreamSynth2)// 启动服务器r.Run(":8081")
}
Postman测试
相关文章:
字节火山引擎-大模型声音复刻,流式语音合成接口
字节火山引擎-大模型声音复刻,流式语音合成接口 参考文档:火山引擎-大模型声音复刻文档 官网给出的示例代码有bug,这里已经修改了 创建应用 声音复刻大模型页面查看应用,获取接口调用需要的参数 注意调用tts接口时候需要三个参数…...
QT:Graphics View的坐标系介绍
在 Qt 的 Graphics View 框架中,存在三种不同的坐标系,分别是 物品坐标系(Item Coordinates)、场景坐标系(Scene Coordinates) 和 视图坐标系(View Coordinates)。这三种坐标系在图形…...
轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置
一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…...
Unity TMPro显示中文字体
TMP默认的字体只能显示英语,那么怎么显示中文呢 1、找到支持中文的字体文件 在c盘搜索Fonts文件夹有很多支持中文的字体文件 我这里选择雅黑 PS.双击打开发现里面有粗体细体普通三个版本,也可以只导入一个版本进去 2、将其拖入到unity Assets里面 3…...
【嵌入式原理设计】实验五:远程控制翻盖设计
目录 一、实验目的 二、实验环境 三、实验内容 四、实验记录及处理 五、实验小结 六、成果文件提取链接 一、实验目的 熟悉和掌握舵机及串口控制方式 二、实验环境 Win10ESP32实验开发板 三、实验内容 1、熟悉舵机的控制方式; 2、用串口发…...
矩阵乘积态简介
定义 矩阵乘积态(Matrix Product State, MPS)是一种用于表示量子多体系统的强大工具,特别是在一维系统中。MPS 是一种张量网络状态,它通过将全局量子态分解为一系列局部张量的乘积来有效地表示量子态。 注释: 量子态表…...
国自然面上项目|基于肺癌精准靶向治疗的基因影像组学研究|基金申请·25-02-26
小罗碎碎念 今天和大家分享一个国自然面上项目,执行年限为2019.01~2022.12,直接费用为57万元。 项目旨在解决肺癌靶向治疗耐药问题,通过整合多组学和影像组学技术构建预测模型。 研究期间,对非小细胞肺癌 CT 影像组学…...
OA办公系统自动渗透测试过程
目录 一、下载环境源码 二、部署环境 三、测试 XSS漏洞 SQL注入 文件上传漏洞 一、下载环境源码 OA源码打包地址: https://download.csdn.net/download/weixin_43650289/90434502?spm=1001.2014.3001.5503 二、部署环境...
Fisher信息矩阵(Fisher Information Matrix,简称FIM)
Fisher信息矩阵简介 Fisher信息矩阵(Fisher Information Matrix,简称FIM)是统计学和信息理论中的一个重要概念,广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔(Ronald Fisher)的名…...
nginx反向代理以及负载均衡(常见案例)
一、nginx反向代理 1、什么是代理服务器? 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据…...
LabVIEW形状误差测量系统
在机械制造领域,形状与位置公差(GD&T)直接影响装配精度与产品寿命。国内中小型机加工企业因形状误差导致的返工率高达12%-18%。传统测量方式存在以下三大痛点: 设备局限:机械式千分表需人工读数,精度…...
将VsCode变得顺手好用(1
目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…...
排序模板——C++
0.排序模板题目 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai,为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。 …...
HTTP/HTTPS 服务端口监测的简易实现
一 HTTP/HTTPS 服务端口监测的简易实现方法 在当今快节奏的工作环境中,工作忙碌成为了许多职场人的常态。就拿我们团队最近经历的事情来说,工作任务一个接一个,大家都在各自的岗位上争分夺秒地忙碌着。然而,就在这样高强度的工作…...
快速入门——状态管理VueX
Vuex介绍 状态管理 每一个Vuex应用的核心都是一个store,与普通的全局对象不同的是,基于Vue数据与视图绑定的特点,当store中的状态发生变化时,与之绑定的视图也会被重新渲染。 store中的状态不允许被直接修改,改变sto…...
C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手
在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中,我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手,但是需要运行Py脚本,还比较麻烦,下面我们用C#依据Ollama提供的API接口开发一个本地A…...
Flutter - 基础Widget
Flutter 中万物皆 Widget,基础Widget 同步对应 Android View. 普通文本 Text /*** 控制文本样式统一使用 style:TextStyle, 例:fontSize(字体大小),color(颜色),shadows(阴影)等等* 控制文本布局需单独设置:* textAlign(文不对齐方式)* te…...
Tips :仿真竞争条件 指的是什么?
文章目录 **为什么会出现仿真竞争条件?****典型场景举例****System Verilog 如何解决竞争条件?****1. 使用 `program` 块隔离测试平台****2. 使用 `clocking` 块明确时序关系****3. 非阻塞赋值(`<=`)的合理使用****竞争条件的根本原因****总结****代码结构****1. 设计模…...
【Elasticsearch】script_fields 和 runtime_fields的区别
script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能,但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比: 1.定义和应用场景 • script_fields: • 定义:通过 Painless 脚本…...
达梦DTS数据迁移工具生产篇(MySQL->DM8)
本文章使用的DTS工具为 2024年9月18日的版本,使用的目的端DM8数据库版本为2023年12月的版本,注意数据库版本和DTS版本之间跨度不要太大,以免出现各种兼容性的报错。若发现版本差距过大时,请联系达梦技术服务工程师处理。 1. 迁移…...
【安卓逆向】逆向APP界面UI修改再安装
1.背景 有一客户找到我,说能不能把APP首页的底部多余界面去掉。 逆向实战 想要去除安卓应用软件中的内容,需要对APP逆向进行修改再打包。 通过工具 MIT管理器工具 提取APK包,点击apk文件,点击查看反编译apk。 搜索关键字。这里关键…...
企业级大模型应用的Java-Python异构融合架构实践
一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持: 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers(社区生态为主) 常见Python框架 …...
深度剖析数据中台架构图,铸造数字文明的基石
🔥🔥 AllData大数据产品是可定义数据中台,以数据平台为底座,以数据中台为桥梁,以机器学习平台为中层框架,以大模型应用为上游产品,提供全链路数字化解决方案。 ✨奥零数据科技官网:http://www.aolingdata.com ✨AllData开源项目:https://github.com/alldatacenter/a…...
python实现基于文心一言大模型的sql小工具
一、准备工作 注册与登录: 登录百度智能云千帆控制台,注册并登录您的账号。 创建千帆应用: 根据实际需求创建千帆应用。创建成功后,获取AppID、API Key、Secret Key等信息。如果已有千帆应用,可以直接查看已有应用的AP…...
飞腾腾锐D2000 + OpenHarmony 4.1release部署deepseek大模型
简介 1.1 飞腾腾锐D2000 飞腾腾锐D2000是一款面向桌面应用的高性能通用处理,集成8个飞腾自主研发的高能效处理器核FTC663,兼 容64位ARMv8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理 指令,主…...
进程概念、PCB及进程查看
文章目录 一.进程的概念进程控制块(PCB) 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序,而程序是存放在磁盘的,cpu要想执行程序的指…...
Oracle 数据库基础入门(一):搭建数据管理基石
在当今数字化时代,数据库作为数据管理的核心工具,对于各类应用系统的开发至关重要。尤其是在 Java 全栈开发领域,掌握一款强大的数据库技术是必备技能。Oracle 数据库以其卓越的性能、高度的可靠性和丰富的功能,在企业级应用中广泛…...
selenium如何实现,开启浏览器的开发者工具模式,并且开启 toggle移动设备模拟模式
核心实现代码 pythonCopy Code from selenium import webdriver from selenium.webdriver.chrome.options import Options def enable_devtools_with_toggle(): options Options() # 强制开启开发者工具 options.add_argument("--auto-open-devtools-for-tabs&quo…...
分布式锁实现(数据库+Redis+Zookeeper)
1. 数据库分布式锁 实现原理 基于唯一索引: 创建一张锁表,通过唯一索引(如锁名称)保证互斥性。 加锁:插入一条记录,成功则获取锁,失败则重试。 解锁:删除对应记录。 乐观锁&…...
七、Spring Boot:初识与项目搭建
深入解析 Spring Boot:初识与项目搭建 Spring Boot 是基于 Spring Framework 的开源 Java 基础框架,旨在简化 Spring 应用的开发过程。它通过“约定优于配置”的理念,极大地减少了开发中的配置工作,同时提供了“开箱即用”的功能…...
记录一下用docker克隆某授权制定ip的环境恢复
#首先还是要看日志根据问题去进行调整 java web的老项目配置文件一般是 bin启动里边的脚本 还有conf中的 xml配置文件 再或者就是classes中的配置文件,再或者就是lib中的jar包中的配置文件 1.安装docker 2.创建docker网络 docker network create --driver bridge --subnet…...
【含文档+PPT+源码】基于微信小程序的健康饮食食谱推荐平台的设计与实现
项目介绍 本课程演示的是一款基于微信小程序的健康饮食食谱推荐平台的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…...
主流虚拟化技术讲解
目录 VMware vSphere Microsoft Hyper-V KVM(Kernel-based Virtual Machine) OpenStack VMware vSphere 架构与组件:VMware vSphere 是基于裸金属虚拟化技术的平台,核心组件包括 ESXi 主机和 vCenter Server。ESXi 是虚拟化层…...
java开发——为什么要使用动态代理?
举个例子:假如有一个杀手专杀男的,不杀女的。代码如下: public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…...
kotlin 知识点一 变量和函数
在Kotlin中定义变量的方式和Java 区别很大,在Java 中如果想要定义一个变 量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表 示b是一个字符串变量。而Kotlin中定义一个变量,只允许在变量…...
将CUBE或3DL LUT转换为PNG图像
概述 在大部分情况下,LUT 文件通常为 CUBE 或 3DL 格式。但是我们在 OpenGL Shader 中使用的LUT,通常是图像格式的 LUT 文件。下面,我将教大家如何将这些文件转换为 PNG 图像格式。 条形LUT在线转换(不是8x8网络)&am…...
侯捷 C++ 课程学习笔记:类的声明与构造函数
目录 一、类的声明 二、内联函数 三、访问级别 四、构造函数 五、构造函数重载 六、实际应用案例 七、学习心得 一、类的声明 类的声明是定义类的基本结构,包括类的成员变量和成员函数。类的声明分为类头和类体两部分。 类头(class head…...
BGP状态和机制
BGP邻居优化 为了增加稳定性,通常建议实验回环口来建立邻居。更新源:建立邻居和邻居所学习到的路由的下一跳。多跳:EBGP邻居建立默认选哟直连,因为TTL=1,如果非直连,必须修改TTL。命令备注peer 2.2.2.2 connect-interface lo1配置更新源peer 2.2.2.2 ebgp-max-hop 2配置T…...
MongoDB 数据库简介
MongoDB 数据库简介 引言 随着互联网技术的飞速发展,数据已经成为企业的重要资产。为了高效地管理和处理这些数据,数据库技术应运而生。MongoDB作为一种流行的NoSQL数据库,因其灵活的数据模型和高效的数据处理能力,受到了广泛的关注。本文将为您详细介绍MongoDB的基本概念…...
浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器
1、谷歌浏览器下载: 情况一:如果谷歌应用商店可以打开,那么就直接到谷歌应用商店下载,直接搜索vue.js.devtools添加扩展即可。 情况二:谷歌浏览器的谷歌应用商城打不开,那么就百度搜索极简插件找到vue.js.…...
Android AOSP系统裁记录
Android 系统裁剪是指根据需求移除不必要的组件和功能,以优化系统性能、减少存储占用或满足特定设备需求。以下是 Android 系统裁剪的基本步骤: 1. 准备环境 操作系统:推荐使用 Ubuntu 或 macOS。 工具: Android SDK Android N…...
Could not download npm for node v14.21.3(nvm无法下载节点v14.21.3的npm)
场景描述:之前的项目用的是node以前的版本,使用nvm没下载下来,npm命令执行不了 错误如下图,15版本的node同理,下载的都是.exe可执行文件的扩展名,使用npm命令终端无法识别 解决思路:去node官网…...
React进阶之React核心源码解析(三)
React核心源码解析 diff多节点比较diff两轮遍历比较第一轮比较第二轮比较Update 状态更新Concurrent Modediff 多节点比较diff isArray方法比较 节点更新// 更新前 <ul><li key="0" className="before">0<li><li key=...
2025吐槽季第一弹---腾讯云EO边缘安全加速平台服务
前言: 关于EO边缘安全加速平台服务 参照:产品概述,具体如下: 边缘安全加速平台 EO(Tencent Cloud EdgeOne,下文简称为 EdgeOne)是国内首款基于全新架构的真正一体化的边缘安全加速平台。提供全面的安全防…...
Dify自定义工作流集成指南:对接阿里云百炼文生图API的实现方案
dify工作流的应用基本解释 dify应用发布相关地址:应用发布 | Dify 根据官方教程,我们可以看到dify自定义的工作流可以发布为----工具 这个教程将介绍如何通过工作流建立一个使用阿里云百炼文生图模型。 工具则可以给其他功能使用,如agent…...
WebSocket简单介绍 并接入deepseek
目录 什么是 WebSocket?工作原理: 为什么需要 WebSocket?WebSocket 的优势HTTP 和 WebSocket 的区别WebSocket 的劣势WebSocket 的应用场景WebSocket 握手过程1. 客户端发起握手请求2. 服务器响应握手请求3. 建立连接 WebSocket 事件处理WebS…...
android 新增native binder service 方式(三)
书接上回,继续第三种方式,是手动生成 service binder 的方法,项目结构 1,编译aidl aidl 文件保持不变,如何生成Bn和Bp 文件呢。 aidl -I ./libserviceaidl/aidl -h ./ -o ./ --langcpp libserviceaidl/aidl/com/test/IService.a…...
linux--多进程开发(5)--进程
进程间通讯概念 每两个进程之间都是独立的资源分配单元,不同进程之间不能直接访问另一个进程的资源。 但不同的进程需要进行信息的交互和状态的传递等,因此需要进程间通信(IPC,inter processes cimmunication) 进程通信的目的: …...
分享httprunner 结合django实现平台接口自动化方案
说明,可以直接在某个视图集定义自定义接口来验证。 调试1:前端界面直接编写yaml文件. 新增要实现存数据到mysql,同时存文件到testcase下, 如test.yaml 更新yaml数据,同时做到更新 testcase下的文件,如test.yaml acti…...
前端面试题之HTML篇
1.src和href的区别 src用于替换当前元素,href用于在当前文档和引用资源之间确立联系。 src可用于img、input、style、script、iframe---同步加载执行 href可用于link、a---异步 1.用途不同 src 用于引入外部资源,通常是图像、视频、JavaScript 文件等&am…...