Fish Speech-1.5多终端适配:H5网页嵌入、Android SDK、iOS语音播放集成

news2026/5/2 20:27:05
Fish Speech-1.5多终端适配H5网页嵌入、Android SDK、iOS语音播放集成Fish Speech-1.5是一个让人惊艳的文本转语音模型它基于超过100万小时的多语言音频数据训练而成能生成非常自然、富有表现力的语音。通过Xinference2.0.0部署后你可以在Web UI里轻松体验它的强大能力。但真正的价值在于如何把这个能力集成到你的实际项目中比如你想在自己的网站里加入语音播报功能或者在移动App里让虚拟助手开口说话。这篇文章我就来手把手带你实现Fish Speech-1.5在H5网页、Android和iOS三大终端上的集成让你能真正把这个技术用起来。1. 准备工作部署与基础调用在开始集成之前你得先有一个运行起来的Fish Speech-1.5服务。这里假设你已经通过Xinference完成了部署并且可以通过Web UI正常生成语音。1.1 确认服务状态首先确保你的模型服务已经成功启动。你可以通过查看日志来确认cat /root/workspace/model_server.log如果看到服务启动成功的相关日志就说明一切正常。初次加载模型可能需要一些时间请耐心等待。1.2 获取API访问信息终端集成需要通过API来调用模型。你需要知道服务的地址IP和端口。通常Xinference部署后会提供一个Web UI地址比如http://你的服务器IP:9997。这个地址的根路径就是你的API服务地址。为了测试API是否可用我们可以先用一个简单的curl命令试试水curl -X POST http://你的服务器IP:9997/v1/audio/speech \ -H Content-Type: application/json \ -d { model: fish-speech-1.5, input: 你好世界这是一段测试语音。, voice: default, language: zh } \ --output test_audio.wav如果命令执行成功并且生成了一个test_audio.wav文件用播放器打开能听到清晰的“你好世界”那么恭喜你API调用这条路就通了。这是后续所有终端集成的基础。2. H5网页嵌入实战现在我们来看看怎么在网页里使用这个语音合成能力。想象一下你有一个新闻网站想让用户能“听”新闻或者有一个教育平台需要语音朗读题目。H5集成是最直接的方式。2.1 前端调用API核心思路是网页上的JavaScript代码去调用我们刚才测试过的那个API。下面是一个最基础的HTML示例包含一个输入框、一个按钮和一个音频播放器。!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleFish Speech H5 语音合成演示/title /head body h2网页语音合成演示/h2 textarea idtextInput rows4 cols50 placeholder请输入要合成的文本...欢迎使用Fish Speech语音合成服务。/textarea brbr button onclicksynthesizeSpeech()生成语音/button brbr audio idaudioPlayer controls/audio script // 替换成你的实际服务器地址 const API_BASE_URL http://你的服务器IP:9997/v1; async function synthesizeSpeech() { const text document.getElementById(textInput).value; const audioPlayer document.getElementById(audioPlayer); if (!text.trim()) { alert(请输入文本); return; } // 显示加载状态 audioPlayer.src ; const button event.target; button.textContent 生成中...; button.disabled true; try { const response await fetch(${API_BASE_URL}/audio/speech, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ model: fish-speech-1.5, input: text, voice: default, // 可根据需要选择音色 language: zh }) }); if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } // 获取音频Blob数据 const audioBlob await response.blob(); // 创建本地播放URL const audioUrl URL.createObjectURL(audioBlob); audioPlayer.src audioUrl; // 可选自动播放注意浏览器自动播放策略 // audioPlayer.play().catch(e console.log(自动播放被阻止:, e)); } catch (error) { console.error(语音合成失败:, error); alert(语音合成失败请检查控制台或网络。); } finally { // 恢复按钮状态 button.textContent 生成语音; button.disabled false; } } /script /body /html把这段代码保存为index.html用浏览器打开填入你的服务器IP就可以在网页里直接生成和播放语音了。2.2 处理跨域与优化体验在实际项目中你可能会遇到跨域问题。因为你的网页域名和API服务器域名不同浏览器出于安全考虑会阻止请求。解决方法是在部署Xinference的服务端配置CORS跨域资源共享。此外为了更好的用户体验你还可以添加加载动画在生成语音时显示一个旋转的加载图标。错误处理更优雅地提示网络错误、服务器错误或合成失败。参数扩展让用户可以选择语速、音调、不同音色等如果模型支持。兼容性处理确保代码在不同浏览器上都能正常工作。3. Android SDK集成指南对于Android应用比如阅读类App、语音助手、教育软件等集成语音合成功能能极大提升用户体验。我们通过封装网络请求可以轻松地将Fish Speech-1.5的能力接入Android App。3.1 核心网络请求封装首先在Android项目中你需要添加网络请求库的依赖比如Retrofit它是处理HTTP请求的利器。在app/build.gradle文件中添加dependencies { implementation com.squareup.retrofit2:retrofit:2.9.0 implementation com.squareup.retrofit2:converter-gson:2.9.0 // 用于JSON解析 // 如果你需要处理更复杂的响应如直接获取二进制音频流可以添加scalars转换器 // implementation com.squareup.retrofit2:converter-scalars:2.9.0 }然后我们定义一个数据模型和API接口// SpeechRequest.kt data class SpeechRequest( val model: String fish-speech-1.5, val input: String, val voice: String default, val language: String zh // 可以添加更多参数如 speed, pitch 等 ) // FishSpeechApiService.kt import okhttp3.ResponseBody import retrofit2.Call import retrofit2.http.Body import retrofit2.http.POST interface FishSpeechApiService { POST(audio/speech) // 相对路径基础URL在Retrofit构建器中设置 fun synthesizeSpeech(Body request: SpeechRequest): CallResponseBody // 直接返回二进制流 }接下来创建一个管理类来处理语音合成// FishSpeechManager.kt import android.content.Context import android.media.MediaPlayer import android.util.Log import okhttp3.OkHttpClient import okhttp3.ResponseBody import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.io.File import java.io.FileOutputStream import java.util.concurrent.TimeUnit class FishSpeechManager private constructor(context: Context) { companion object { private var instance: FishSpeechManager? null fun getInstance(context: Context): FishSpeechManager { return instance ?: synchronized(this) { instance ?: FishSpeechManager(context.applicationContext).also { instance it } } } } private val appContext: Context context private val apiService: FishSpeechApiService private var mediaPlayer: MediaPlayer? null private var currentAudioFile: File? null init { val client OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) // 合成可能需要时间设置长一点 .readTimeout(60, TimeUnit.SECONDS) .build() val retrofit Retrofit.Builder() .baseUrl(http://你的服务器IP:9997/v1/) // 设置基础URL .client(client) .addConverterFactory(GsonConverterFactory.create()) .build() apiService retrofit.create(FishSpeechApiService::class.java) } interface SynthesisCallback { fun onSuccess(audioFile: File) fun onFailure(errorMessage: String) fun onProgress(progress: Int) // 可用于显示进度但简单API可能不支持 } fun synthesizeText(text: String, callback: SynthesisCallback) { if (text.isBlank()) { callback.onFailure(输入文本为空) return } val request SpeechRequest(input text) val call apiService.synthesizeSpeech(request) call.enqueue(object : CallbackResponseBody { override fun onResponse(call: CallResponseBody, response: ResponseResponseBody) { if (response.isSuccessful response.body() ! null) { // 将音频流保存到文件 val body response.body()!! try { // 创建临时文件存储音频 val tempFile File.createTempFile(fish_speech_, .wav, appContext.cacheDir) val inputStream body.byteStream() val outputStream FileOutputStream(tempFile) inputStream.copyTo(outputStream) outputStream.close() inputStream.close() currentAudioFile tempFile callback.onSuccess(tempFile) } catch (e: Exception) { Log.e(FishSpeechManager, 保存音频文件失败, e) callback.onFailure(保存音频失败: ${e.message}) } } else { val errorMsg 请求失败: ${response.code()} - ${response.message()} Log.e(FishSpeechManager, errorMsg) callback.onFailure(errorMsg) } } override fun onFailure(call: CallResponseBody, t: Throwable) { Log.e(FishSpeechManager, 网络请求失败, t) callback.onFailure(网络请求失败: ${t.message}) } }) } fun playAudio(file: File) { stopPlayback() // 停止当前播放 mediaPlayer MediaPlayer().apply { setDataSource(file.path) prepareAsync() setOnPreparedListener { it.start() } setOnCompletionListener { stopPlayback() } setOnErrorListener { mp, what, extra - Log.e(FishSpeechManager, 播放错误: what$what, extra$extra) false } } } fun stopPlayback() { mediaPlayer?.release() mediaPlayer null } fun cleanup() { stopPlayback() currentAudioFile?.delete() // 清理临时文件 currentAudioFile null } }3.2 在Activity中使用在Android的Activity或Fragment中你可以这样调用// MainActivity.kt 示例 import android.os.Bundle import android.widget.Button import android.widget.EditText import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import java.io.File class MainActivity : AppCompatActivity() { private lateinit var editText: EditText private lateinit var synthButton: Button private lateinit var playButton: Button private lateinit var fishSpeechManager: FishSpeechManager private var currentAudioFile: File? null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) editText findViewById(R.id.editText) synthButton findViewById(R.id.synthButton) playButton findViewById(R.id.playButton) playButton.isEnabled false fishSpeechManager FishSpeechManager.getInstance(applicationContext) synthButton.setOnClickListener { val text editText.text.toString() synthButton.isEnabled false synthButton.text 合成中... fishSpeechManager.synthesizeText(text, object : FishSpeechManager.SynthesisCallback { override fun onSuccess(audioFile: File) { runOnUiThread { synthButton.isEnabled true synthButton.text 合成语音 currentAudioFile audioFile playButton.isEnabled true Toast.makeText(thisMainActivity, 语音合成成功, Toast.LENGTH_SHORT).show() } } override fun onFailure(errorMessage: String) { runOnUiThread { synthButton.isEnabled true synthButton.text 合成语音 Toast.makeText(thisMainActivity, 失败: $errorMessage, Toast.LENGTH_LONG).show() } } override fun onProgress(progress: Int) { // 如果API支持进度回调可以在这里更新UI } }) } playButton.setOnClickListener { currentAudioFile?.let { file - fishSpeechManager.playAudio(file) } ?: run { Toast.makeText(this, 请先合成语音, Toast.LENGTH_SHORT).show() } } } override fun onDestroy() { super.onDestroy() fishSpeechManager.cleanup() } }记得在AndroidManifest.xml中添加网络权限uses-permission android:nameandroid.permission.INTERNET /这样一个基本的Android语音合成功能就完成了。你可以根据需求增加音色选择、语速调节、播放列表管理等功能。4. iOS语音播放集成在iOS平台上无论是SwiftUI还是UIKit项目集成思路类似网络请求获取音频数据然后用系统框架播放。这里以Swift语言为例。4.1 网络请求与音频播放首先创建一个管理网络请求和音频播放的类// FishSpeechService.swift import Foundation import AVFoundation class FishSpeechService: NSObject, AVAudioPlayerDelegate { static let shared FishSpeechService() private override init() {} private var audioPlayer: AVAudioPlayer? private let baseURL http://你的服务器IP:9997/v1 // 替换为你的地址 typealias SynthesisCompletion (ResultURL, Error) - Void func synthesizeSpeech(text: String, completion: escaping SynthesisCompletion) { guard !text.isEmpty else { completion(.failure(NSError(domain: FishSpeech, code: -1, userInfo: [NSLocalizedDescriptionKey: 输入文本为空]))) return } let url URL(string: \(baseURL)/audio/speech)! var request URLRequest(url: url) request.httpMethod POST request.setValue(application/json, forHTTPHeaderField: Content-Type) let requestBody: [String: Any] [ model: fish-speech-1.5, input: text, voice: default, language: zh ] do { request.httpBody try JSONSerialization.data(withJSONObject: requestBody) } catch { completion(.failure(error)) return } let task URLSession.shared.dataTask(with: request) { [weak self] data, response, error in guard let self self else { return } if let error error { DispatchQueue.main.async { completion(.failure(error)) } return } guard let httpResponse response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode), let audioData data else { let statusCode (response as? HTTPURLResponse)?.statusCode ?? -1 let error NSError(domain: FishSpeech, code: statusCode, userInfo: [NSLocalizedDescriptionKey: 服务器返回错误: \(statusCode)]) DispatchQueue.main.async { completion(.failure(error)) } return } // 将音频数据保存到临时文件 do { let tempDir FileManager.default.temporaryDirectory let tempFileURL tempDir.appendingPathComponent(UUID().uuidString).appendingPathExtension(wav) try audioData.write(to: tempFileURL) DispatchQueue.main.async { completion(.success(tempFileURL)) } } catch { DispatchQueue.main.async { completion(.failure(error)) } } } task.resume() } func playAudio(from fileURL: URL) throws { // 停止当前播放 stopPlayback() audioPlayer try AVAudioPlayer(contentsOf: fileURL) audioPlayer?.delegate self audioPlayer?.prepareToPlay() audioPlayer?.play() } func stopPlayback() { audioPlayer?.stop() audioPlayer nil } var isPlaying: Bool { return audioPlayer?.isPlaying ?? false } // MARK: - AVAudioPlayerDelegate func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { stopPlayback() // 可以在这里发送播放完成的通知 } func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) { stopPlayback() print(音频解码错误: \(error?.localizedDescription ?? 未知错误)) } }4.2 在SwiftUI视图中使用下面是一个简单的SwiftUI视图演示如何调用上述服务// ContentView.swift import SwiftUI struct ContentView: View { State private var inputText: String 欢迎使用Fish Speech语音合成。 State private var isSynthesizing: Bool false State private var currentAudioURL: URL? State private var errorMessage: String? State private var showError: Bool false var body: some View { VStack(spacing: 20) { Text(Fish Speech iOS 演示) .font(.largeTitle) .padding() TextEditor(text: $inputText) .frame(height: 150) .padding(4) .overlay( RoundedRectangle(cornerRadius: 8) .stroke(Color.gray.opacity(0.5), lineWidth: 1) ) .padding(.horizontal) Button(action: synthesizeSpeech) { HStack { if isSynthesizing { ProgressView() .scaleEffect(0.8) Text(合成中...) } else { Image(systemName: waveform) Text(合成语音) } } .frame(maxWidth: .infinity) .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) } .disabled(isSynthesizing || inputText.isEmpty) .padding(.horizontal) if let url currentAudioURL { HStack(spacing: 20) { Button(action: playAudio) { HStack { Image(systemName: FishSpeechService.shared.isPlaying ? pause.circle.fill : play.circle.fill) Text(FishSpeechService.shared.isPlaying ? 播放中 : 播放) } .padding() .background(Color.green) .foregroundColor(.white) .cornerRadius(10) } Button(action: stopAudio) { HStack { Image(systemName: stop.circle.fill) Text(停止) } .padding() .background(Color.red) .foregroundColor(.white) .cornerRadius(10) } } } Spacer() } .padding() .alert(错误, isPresented: $showError, presenting: errorMessage) { _ in Button(确定, role: .cancel) { } } message: { message in Text(message) } } private func synthesizeSpeech() { guard !inputText.isEmpty else { return } isSynthesizing true errorMessage nil FishSpeechService.shared.synthesizeSpeech(text: inputText) { result in isSynthesizing false switch result { case .success(let url): self.currentAudioURL url print(音频文件已保存至: \(url.path)) case .failure(let error): self.errorMessage error.localizedDescription self.showError true print(合成失败: \(error)) } } } private func playAudio() { guard let url currentAudioURL else { return } do { try FishSpeechService.shared.playAudio(from: url) } catch { errorMessage 播放失败: \(error.localizedDescription) showError true } } private func stopAudio() { FishSpeechService.shared.stopPlayback() } }重要提示在iOS中你需要配置App Transport Security (ATS) 以允许HTTP请求如果你的服务器没有使用HTTPS。在Info.plist中添加keyNSAppTransportSecurity/key dict keyNSAllowsArbitraryLoads/key true/ /dict对于生产环境强烈建议使用HTTPS并配置正确的ATS例外。5. 总结与进阶建议通过上面的步骤你应该已经成功将Fish Speech-1.5的语音合成能力集成到了H5网页、Android和iOS应用中。我们来回顾一下关键点并看看还能如何做得更好。5.1 核心步骤回顾服务部署与验证确保通过Xinference部署的Fish Speech-1.5 API可以正常访问和调用。H5网页集成使用JavaScript的Fetch API调用后端服务获取音频流并通过audio标签播放。核心是处理跨域和用户体验。Android集成使用Retrofit等库封装网络请求将音频数据保存为临时文件然后通过Android的MediaPlayer进行播放。需要注意生命周期管理和资源释放。iOS集成使用URLSession进行网络请求将音频数据保存到临时目录然后通过AVAudioPlayer框架播放。需要处理ATS安全策略。5.2 进阶优化建议当你完成了基础集成后可以考虑以下方向来提升应用的稳定性和用户体验网络优化超时与重试为网络请求设置合理的超时时间并实现失败重试机制。离线缓存对于合成过的文本可以将音频文件缓存到本地下次直接播放节省流量和等待时间。断点续传如果合成很长的文本可以考虑支持断点续传但这需要后端API支持。播放功能增强播放控制实现播放、暂停、停止、快进、快退等完整控制。播放列表支持多个语音片段的队列播放。后台播放在iOS和Android上配置后台播放权限让语音在App退到后台时也能继续适用于听书类应用。性能与稳定性内存管理及时释放不再使用的音频文件和播放器资源防止内存泄漏。错误监控收集合成失败、播放错误等日志便于排查问题。多音色与参数如果Fish Speech模型支持可以开放更多参数如语速、音高、不同说话人供用户选择。安全与合规使用HTTPS在生产环境中务必为你的API服务配置HTTPS以保证数据传输安全。鉴权与限流为API接口添加简单的Token鉴权防止被滥用。可以设置调用频率限制。把一项强大的AI能力从演示页面搬到真实可用的产品里中间需要这些扎实的工程化工作。希望这份指南能帮你跨过这道坎顺利在你的网页或App中响起Fish Speech合成的、自然流畅的语音。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2527239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…