Qwen3-TTS部署教程:Qwen3-TTS与Whisper ASR构建双向语音对话系统

Qwen3-TTS部署教程:Qwen3-TTS与Whisper ASR构建双向语音对话系统

想象一下,你对着电脑说一句话,电脑不仅能听懂,还能用自然、有感情的声音回答你,整个过程流畅得就像在和朋友聊天。这听起来像是科幻电影里的场景,但现在,通过Qwen3-TTS和Whisper ASR这两个强大的开源模型,我们完全可以自己动手搭建这样一个系统。

今天,我就带你一步步实现这个目标。无论你是想做一个智能语音助手,还是想为你的应用增加语音交互功能,这篇教程都会给你一个清晰的路线图。我们会从最基础的部署开始,到最终实现一个能听会说的双向对话系统。

1. 准备工作与环境搭建

在开始之前,我们先来了解一下今天要用到的两个核心工具。

Qwen3-TTS 是一个强大的文本转语音模型。它最吸引人的地方在于,它支持10种主要语言,包括中文、英文、日文等,还能生成多种方言和语音风格。更厉害的是,它能理解你文本里的情感和意图,自动调整说话的语调、语速,让生成的声音听起来特别自然。

Whisper ASR 则是OpenAI开源的语音识别模型,它的识别准确率非常高,支持多种语言,而且对带口音、有噪声的语音也有很好的处理能力。

把这两个模型组合起来,一个负责“听”(Whisper),一个负责“说”(Qwen3-TTS),一个完整的语音对话闭环就形成了。

1.1 基础环境要求

为了顺利运行,你的电脑需要满足以下条件:

  • 操作系统:推荐使用Linux(如Ubuntu 20.04+)或macOS。Windows系统也可以,但可能需要额外配置。
  • Python版本:Python 3.8 或更高版本。
  • 内存:至少16GB RAM。如果要用到更大的模型或进行批量处理,建议32GB以上。
  • 存储空间:预留10-20GB空间用于存放模型和依赖库。
  • GPU(可选但推荐):虽然CPU也能运行,但有NVIDIA GPU(显存8GB以上)会快很多。

1.2 快速安装依赖

打开你的终端,我们一步步来安装必要的软件包。

首先,创建一个独立的Python环境是个好习惯,这样可以避免不同项目之间的依赖冲突:

# 创建新的虚拟环境 python -m venv voice_chat_env # 激活环境(Linux/macOS) source voice_chat_env/bin/activate # 激活环境(Windows) voice_chat_env\Scripts\activate 

环境激活后,你会看到命令行前面多了个环境名。接下来安装核心依赖:

# 升级pip到最新版本 pip install --upgrade pip # 安装PyTorch(根据你的CUDA版本选择,如果没有GPU就用CPU版本) # 有CUDA 11.8的情况 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 没有GPU的情况 pip install torch torchvision torchaudio # 安装Transformers库(Hugging Face的核心库) pip install transformers # 安装音频处理相关库 pip install soundfile librosa pydub # 安装Web界面相关(可选,用于可视化操作) pip install gradio streamlit 

安装过程可能需要几分钟,取决于你的网速。如果遇到网络问题,可以尝试使用国内的镜像源,比如清华源:

pip install transformers -i https://pypi.tuna.tsinghua.edu.cn/simple 

2. Qwen3-TTS模型部署与初体验

环境准备好后,我们先来部署和测试Qwen3-TTS模型。这是整个系统的“嘴巴”,负责把文字变成声音。

2.1 下载与加载Qwen3-TTS模型

Qwen3-TTS模型可以通过Hugging Face平台获取。这里我们使用代码直接加载:

from transformers import AutoModelForTextToSpeech, AutoTokenizer import torch # 指定模型名称 model_name = "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign" print("正在加载Qwen3-TTS模型,这可能需要几分钟...") # 加载tokenizer(文本处理器) tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) # 加载模型 model = AutoModelForTextToSpeech.from_pretrained( model_name, torch_dtype=torch.float16, # 使用半精度减少内存占用 device_map="auto", # 自动分配设备(GPU/CPU) trust_remote_code=True ) print("模型加载完成!") 

第一次运行这段代码时,它会从网上下载模型文件,文件大小约3-4GB,所以需要一些时间和足够的磁盘空间。下载完成后,后续使用就会快很多。

2.2 你的第一次语音合成

模型加载成功后,我们来试试让它说句话:

def text_to_speech(text, language="中文", voice_description="亲切的女声"): """ 将文本转换为语音 参数: text: 要转换的文本 language: 语言类型,支持中文、英文、日文等 voice_description: 音色描述,如“亲切的女声”、“沉稳的男声” """ # 准备输入文本 input_text = f"{language}|{voice_description}|{text}" # 使用tokenizer处理文本 inputs = tokenizer(input_text, return_tensors="pt") # 将输入数据移到与模型相同的设备 if torch.cuda.is_available(): inputs = {k: v.cuda() for k, v in inputs.items()} # 生成语音 with torch.no_grad(): # 不计算梯度,加快推理速度 speech = model.generate(**inputs) # 将语音数据转换为numpy数组(便于保存) speech = speech.cpu().numpy() return speech # 测试一下 test_text = "你好,我是Qwen3-TTS,很高兴为你服务。" audio_data = text_to_speech(test_text, language="中文", voice_description="亲切的女声") print(f"语音生成完成!音频数据形状:{audio_data.shape}") 

运行成功后,你会得到一个numpy数组,这就是音频的原始数据。但光有数据还不行,我们得把它保存成能播放的音频文件。

2.3 保存和播放生成的语音

生成音频数据后,我们需要把它保存为常见的音频格式,比如WAV或MP3:

import soundfile as sf import numpy as np def save_audio(audio_data, filename="output.wav", sample_rate=24000): """ 保存音频数据为文件 参数: audio_data: 音频数据(numpy数组) filename: 保存的文件名 sample_rate: 采样率,Qwen3-TTS默认是24000Hz """ # 确保音频数据是单声道(如果是立体声,取第一个声道) if len(audio_data.shape) > 1: audio_data = audio_data[0] # 归一化到[-1, 1]范围(如果不在这个范围) if audio_data.max() > 1.0 or audio_data.min() < -1.0: audio_data = audio_data / np.max(np.abs(audio_data)) # 保存为WAV文件 sf.write(filename, audio_data, sample_rate) print(f"音频已保存为:{filename}") # 保存刚才生成的语音 save_audio(audio_data, "first_speech.wav") 

现在,你可以在当前文件夹下找到first_speech.wav文件,用任何音频播放器打开它,就能听到Qwen3-TTS生成的声音了!

2.4 探索不同的语音风格

Qwen3-TTS的强大之处在于它的灵活性。我们可以通过改变参数来调整生成语音的风格:

# 尝试不同的语言和音色 test_cases = [ {"text": "Hello, welcome to our AI voice system.", "language": "英文", "voice": "专业的女声"}, {"text": "こんにちは、AI音声システムへようこそ。", "language": "日文", "voice": "可爱的女声"}, {"text": "今天天气真好,我们出去散步吧。", "language": "中文", "voice": "欢快的女声"}, {"text": "请注意,系统将在5分钟后进行维护。", "language": "中文", "voice": "严肃的男声"}, ] for i, case in enumerate(test_cases): print(f"生成中:{case['text']}") audio = text_to_speech(case["text"], case["language"], case["voice"]) save_audio(audio, f"test_{i+1}.wav") print(f"已保存:test_{i+1}.wav") 

运行这段代码,你会得到4个不同风格的声音文件。听听看,是不是每种风格都有明显的区别?这就是Qwen3-TTS的上下文理解能力在起作用——它能根据文本内容和你的描述,自动调整语音的情感色彩。

3. Whisper ASR模型部署与测试

现在我们的系统有了“嘴巴”,接下来要给它装上“耳朵”。Whisper ASR就是我们的语音识别引擎,负责把你说的话转换成文字。

3.1 加载Whisper模型

Whisper有多个版本,从最小的tiny到最大的large。模型越大,识别准确率越高,但需要的计算资源也越多。对于大多数应用场景,basesmall版本已经足够用了。

from transformers import WhisperProcessor, WhisperForConditionalGeneration import librosa # 选择模型大小(tiny, base, small, medium, large) model_size = "base" # 平衡准确率和速度 print(f"正在加载Whisper-{model_size}模型...") # 加载处理器和模型 processor = WhisperProcessor.from_pretrained(f"openai/whisper-{model_size}") asr_model = WhisperForConditionalGeneration.from_pretrained(f"openai/whisper-{model_size}") # 如果有GPU,把模型移到GPU上 if torch.cuda.is_available(): asr_model = asr_model.cuda() print("Whisper模型加载完成!") 

3.2 实现语音识别功能

有了模型,我们就可以实现一个函数,把音频文件转换成文字:

def speech_to_text(audio_path, language="zh"): """ 将音频文件转换为文本 参数: audio_path: 音频文件路径 language: 语言代码,zh=中文,en=英文,ja=日文等 """ # 加载音频文件 audio, sr = librosa.load(audio_path, sr=16000) # Whisper需要16000Hz采样率 # 使用处理器提取特征 input_features = processor( audio, sampling_rate=sr, return_tensors="pt" ).input_features # 将特征移到正确的设备 if torch.cuda.is_available(): input_features = input_features.cuda() # 生成文本 predicted_ids = asr_model.generate(input_features) # 解码文本 transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0] return transcription # 测试一下(需要先有一个音频文件) # 你可以用手机录一段话,保存为test_voice.wav try: text = speech_to_text("test_voice.wav", language="zh") print(f"识别结果:{text}") except FileNotFoundError: print("找不到测试音频文件,请先录制一段语音保存为test_voice.wav") 

3.3 实时语音识别

上面的例子是从文件识别,但在实际对话系统中,我们更需要实时识别。下面是一个简单的实时识别示例:

import pyaudio import numpy as np import wave from queue import Queue import threading class RealTimeASR: def __init__(self, model_size="base"): """初始化实时语音识别""" self.processor = WhisperProcessor.from_pretrained(f"openai/whisper-{model_size}") self.model = WhisperForConditionalGeneration.from_pretrained(f"openai/whisper-{model_size}") if torch.cuda.is_available(): self.model = self.model.cuda() # 音频参数 self.CHUNK = 1024 # 每次读取的音频块大小 self.FORMAT = pyaudio.paInt16 # 音频格式 self.CHANNELS = 1 # 单声道 self.RATE = 16000 # 采样率 self.audio_queue = Queue() self.is_recording = False def record_audio(self): """录制音频""" p = pyaudio.PyAudio() stream = p.open( format=self.FORMAT, channels=self.CHANNELS, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK ) print("开始录音...(按Ctrl+C停止)") self.is_recording = True try: while self.is_recording: data = stream.read(self.CHUNK) self.audio_queue.put(data) except KeyboardInterrupt: print("\n录音停止") finally: stream.stop_stream() stream.close() p.terminate() self.is_recording = False def transcribe_audio(self, audio_data): """转录音频数据""" # 将字节数据转换为numpy数组 audio_array = np.frombuffer(audio_data, dtype=np.int16).astype(np.float32) / 32768.0 # 提取特征 input_features = self.processor( audio_array, sampling_rate=self.RATE, return_tensors="pt" ).input_features if torch.cuda.is_available(): input_features = input_features.cuda() # 生成文本 predicted_ids = self.model.generate(input_features) transcription = self.processor.batch_decode(predicted_ids, skip_special_tokens=True)[0] return transcription # 使用示例 # asr = RealTimeASR("base") # 在另一个线程中录音 # record_thread = threading.Thread(target=asr.record_audio) # record_thread.start() 

这个实时识别类可以持续监听麦克风输入,适合构建交互式应用。不过要注意,实时识别对计算资源要求较高,如果感觉卡顿,可以尝试使用更小的模型(如tiny)。

4. 构建双向语音对话系统

现在,我们已经有了独立的“听”和“说”功能,是时候把它们组合起来,创建一个真正的双向对话系统了。

4.1 系统架构设计

我们的对话系统会按照这个流程工作:

用户说话 → Whisper识别为文字 → 处理文字(可以接入大语言模型) → Qwen3-TTS转换为语音 → 播放给用户 

这个流程形成了一个完整的交互闭环。中间的“处理文字”环节很灵活,可以是一个简单的规则引擎,也可以接入像ChatGPT这样的大语言模型,让对话更智能。

4.2 基础对话系统实现

我们先实现一个基础版本,它会把用户说的话直接重复一遍:

import time from pydub import AudioSegment from pydub.playback import play import tempfile class SimpleVoiceChat: def __init__(self, tts_model_name="Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign", asr_model_size="base"): """初始化简单语音聊天系统""" print("初始化语音对话系统...") # 初始化TTS self.tts_tokenizer = AutoTokenizer.from_pretrained( tts_model_name, trust_remote_code=True ) self.tts_model = AutoModelForTextToSpeech.from_pretrained( tts_model_name, torch_dtype=torch.float16, device_map="auto", trust_remote_code=True ) # 初始化ASR self.asr_processor = WhisperProcessor.from_pretrained( f"openai/whisper-{asr_model_size}" ) self.asr_model = WhisperForConditionalGeneration.from_pretrained( f"openai/whisper-{asr_model_size}" ) if torch.cuda.is_available(): self.asr_model = self.asr_model.cuda() print("系统初始化完成!") def listen(self, audio_path): """听:语音转文字""" try: # 加载音频 audio, sr = librosa.load(audio_path, sr=16000) # 提取特征 input_features = self.asr_processor( audio, sampling_rate=sr, return_tensors="pt" ).input_features if torch.cuda.is_available(): input_features = input_features.cuda() # 生成文字 predicted_ids = self.asr_model.generate(input_features) text = self.asr_processor.batch_decode( predicted_ids, skip_special_tokens=True )[0] return text except Exception as e: print(f"语音识别失败:{e}") return "" def think(self, user_text): """思考:处理用户输入(这里简单重复)""" # 这是一个简单的示例,实际可以接入大语言模型 response = f"你说的是:{user_text}" return response def speak(self, text, language="中文", voice="友好的助手"): """说:文字转语音并播放""" try: # 准备输入 input_text = f"{language}|{voice}|{text}" inputs = self.tts_tokenizer(input_text, return_tensors="pt") if torch.cuda.is_available(): inputs = {k: v.cuda() for k, v in inputs.items()} # 生成语音 with torch.no_grad(): speech = self.tts_model.generate(**inputs) # 转换为numpy数组 speech = speech.cpu().numpy() # 保存临时文件并播放 with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: temp_path = tmp.name # 确保是单声道 if len(speech.shape) > 1: speech = speech[0] sf.write(temp_path, speech, 24000) # 播放音频 audio = AudioSegment.from_wav(temp_path) play(audio) return True except Exception as e: print(f"语音合成失败:{e}") return False def chat(self, user_audio_path): """完整的对话流程""" print("正在聆听...") # 1. 听:语音转文字 user_text = self.listen(user_audio_path) if not user_text: print("没有识别到有效语音") return print(f"你说:{user_text}") # 2. 思考:生成回复 response_text = self.think(user_text) print(f"我回答:{response_text}") # 3. 说:文字转语音 print("正在生成语音回复...") self.speak(response_text) # 使用示例 # chat_system = SimpleVoiceChat() # chat_system.chat("你的音频文件.wav") 

这个基础版本虽然简单,但已经实现了完整的语音对话流程。你可以对着麦克风说句话,保存为音频文件,然后让系统处理,它会用语音重复你的话。

4.3 接入大语言模型增强对话能力

上面的例子只是简单重复,没什么实际用处。要让对话真正智能起来,我们需要接入一个大语言模型。这里以使用OpenAI API为例(你也可以使用其他开源模型):

import openai class SmartVoiceChat(SimpleVoiceChat): def __init__(self, openai_api_key, **kwargs): """初始化智能语音聊天系统""" super().__init__(**kwargs) # 设置OpenAI API密钥 openai.api_key = openai_api_key # 对话历史 self.conversation_history = [] def think(self, user_text): """思考:使用GPT生成回复""" # 将用户输入加入历史 self.conversation_history.append({"role": "user", "content": user_text}) try: # 调用GPT API response = openai.ChatCompletion.create( model="gpt-3.5-turbo", # 或 "gpt-4" messages=[ {"role": "system", "content": "你是一个友好的语音助手,回答要简洁自然,适合用语音表达。"} ] + self.conversation_history[-6:], # 只保留最近6条记录 max_tokens=150, temperature=0.7 ) # 获取回复 assistant_reply = response.choices[0].message.content # 将助手回复加入历史 self.conversation_history.append({"role": "assistant", "content": assistant_reply}) return assistant_reply except Exception as e: print(f"GPT调用失败:{e}") return "抱歉,我现在无法处理你的请求。" def reset_conversation(self): """重置对话历史""" self.conversation_history = [] print("对话历史已重置") 

这样,你的语音助手就真正“智能”起来了。它可以回答各种问题,进行多轮对话,而且回复内容自然流畅。

4.4 创建Web界面(可选)

如果你想让更多人方便地使用这个系统,可以创建一个简单的Web界面。这里用Gradio库来实现:

import gradio as gr def create_web_interface(): """创建Web界面""" # 初始化聊天系统(这里用简单版本,实际可以用智能版本) chat_system = SimpleVoiceChat() def process_audio(audio_file): """处理上传的音频文件""" if audio_file is None: return "请上传音频文件", None # 进行对话 user_text = chat_system.listen(audio_file) if not user_text: return "没有识别到语音", None # 生成回复(这里简单处理,实际可以调用think方法) response = f"我听到你说:{user_text}" # 生成语音回复 with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp: temp_path = tmp.name # 合成语音 input_text = f"中文|友好的助手|{response}" inputs = chat_system.tts_tokenizer(input_text, return_tensors="pt") if torch.cuda.is_available(): inputs = {k: v.cuda() for k, v in inputs.items()} with torch.no_grad(): speech = chat_system.tts_model.generate(**inputs) speech = speech.cpu().numpy() if len(speech.shape) > 1: speech = speech[0] sf.write(temp_path, speech, 24000) return response, temp_path # 创建界面 interface = gr.Interface( fn=process_audio, inputs=gr.Audio(type="filepath", label="上传你的语音"), outputs=[ gr.Textbox(label="识别结果"), gr.Audio(label="语音回复", type="filepath") ], title="语音对话系统", description="上传语音文件,系统会识别并回复" ) return interface # 启动Web界面 # interface = create_web_interface() # interface.launch(share=True) # share=True会生成一个公共链接 

运行这段代码后,会启动一个本地Web服务器。打开浏览器访问显示的地址,就能看到一个简单的界面,可以上传音频文件,系统会自动识别并回复。

5. 优化技巧与常见问题

到这里,一个基本的双向语音对话系统已经搭建完成了。但在实际使用中,你可能会遇到一些问题。下面是一些优化技巧和常见问题的解决方法。

5.1 性能优化建议

如果你的系统运行缓慢,可以尝试以下优化方法:

1. 模型量化 量化可以显著减少模型大小和内存占用,加快推理速度:

# 使用8位量化加载模型 from transformers import BitsAndBytesConfig quantization_config = BitsAndBytesConfig( load_in_8bit=True, # 8位量化 llm_int8_threshold=6.0 ) model = AutoModelForTextToSpeech.from_pretrained( "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign", quantization_config=quantization_config, device_map="auto", trust_remote_code=True ) 

2. 使用更小的模型 如果不需要最高质量,可以使用更小的模型变体:

# Whisper模型大小选择 model_sizes = { "最快": "tiny", "平衡": "base", "准确": "small", "高质量": "medium", "最佳质量": "large" } # 根据需求选择 selected_size = model_sizes["平衡"] 

3. 批处理 如果需要处理多个音频,使用批处理可以提高效率:

def batch_speech_to_text(audio_paths): """批量语音识别""" audios = [] for path in audio_paths: audio, sr = librosa.load(path, sr=16000) audios.append(audio) # 批处理 input_features = processor( audios, sampling_rate=16000, return_tensors="pt", padding=True ).input_features # 批量生成 predicted_ids = model.generate(input_features) transcriptions = processor.batch_decode(predicted_ids, skip_special_tokens=True) return transcriptions 

5.2 常见问题与解决

问题1:内存不足症状:程序崩溃,提示CUDA out of memory或内存错误。 解决

  • 使用更小的模型
  • 启用模型量化
  • 减少批处理大小
  • 使用CPU模式(速度会慢很多)

问题2:语音识别不准症状:Whisper识别结果错误很多。 解决

  • 确保音频质量良好,背景噪声小
  • 尝试更大的Whisper模型
  • 指定正确的语言参数
  • 对音频进行预处理(降噪、归一化)

问题3:语音合成不自然症状:Qwen3-TTS生成的声音机械、不连贯。 解决

  • 检查输入文本格式是否正确
  • 尝试不同的音色描述
  • 调整文本的标点和停顿
  • 确保使用最新版本的模型

问题4:延迟太高症状:从说话到听到回复等待时间太长。 解决

  • 使用Qwen3-TTS的流式生成模式
  • 在本地部署而不是通过API调用
  • 优化代码,减少不必要的计算
  • 使用GPU加速

5.3 实际应用建议

根据不同的使用场景,这里有一些配置建议:

场景1:个人助手

  • Whisper模型:basesmall
  • Qwen3-TTS:默认配置
  • 回复风格:简洁、友好
  • 最佳语言:根据使用环境选择

场景2:客服系统

  • Whisper模型:smallmedium
  • Qwen3-TTS:使用专业、清晰的音色
  • 回复风格:正式、准确
  • 建议功能:多语言支持、情绪检测

场景3:教育应用

  • Whisper模型:medium(需要高准确率)
  • Qwen3-TTS:清晰、有表现力的音色
  • 回复风格:耐心、详细
  • 建议功能:发音评估、学习进度跟踪

6. 总结与下一步

通过这篇教程,我们完成了一个从零开始搭建双向语音对话系统的完整旅程。让我们回顾一下关键步骤:

  1. 环境准备:安装了必要的Python库和依赖
  2. Qwen3-TTS部署:学会了如何加载和使用这个强大的文本转语音模型
  3. Whisper ASR部署:实现了准确的语音识别功能
  4. 系统集成:将两个模型组合成完整的对话系统
  5. 功能增强:通过接入大语言模型让对话更智能
  6. 界面创建:构建了Web界面方便使用

你现在拥有的不仅仅是一个能听会说的程序,而是一个可以扩展的平台。基于这个基础,你可以:

  • 添加更多功能:比如语音唤醒、多轮对话管理、情感分析等
  • 优化用户体验:减少延迟、提高识别准确率、增加个性化设置
  • 部署到实际应用:集成到网站、移动应用或智能设备中
  • 探索新模型:随着AI技术的发展,不断尝试更新的语音模型

语音交互是人工智能最自然的接口之一。随着技术的进步,这样的系统会变得越来越普及。你今天学到的技能,正是构建未来智能应用的重要基础。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 ZEEKLOG星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Read more

web APIS Day1

web APIS Day1

有关变量的声明 变量的声明有几种方式,例如用let,const。在以前的版本还用var来声明 var的特点:1、允许重复声明  2、存在变量提升,即变量可以再声明前使用 缺点:1、var 声明的变量会被提升到函数或全局作用域的顶部,导致变量在声明前就可以访问,但值为 undefined。这种行为容易引发逻辑错误             2、var 的作用域仅限于函数或全局,而非块级(如 if、for 等)。这会导致变量在块外仍可访问,可能引发意外覆盖 let的特点:1、不允许重复声明  2、不存在变量提升,必须先声明后使用 const的特点:1、必须初始化赋值  2、块级作用域  3。适合用于声明不可变的常量或引用类型 在此推荐使用const来声明变量,可以避免意外修改,或者使用let,var不推荐使用 DOM树和DOM对象 获取DOM元素 在CSS中我们一般使用document.querySelector(

WebGoat-JWT最新版过关教程/帮你学习gwt逻辑越权漏洞原理(第六关和第十一关)

WebGoat-JWT最新版过关教程/帮你学习gwt逻辑越权漏洞原理(第六关和第十一关)

前言:可以下载一个灵境靶场,不需要复杂的安装环境,进入靶场看, 网址:https://github.com/414aaj/LingJing/releases/tag/0.4.7 1. JWT 签名核心机制 JWT(JSON Web Token)由 Header.Payload.Signature 三部分组成,签名是保障令牌完整性与真实性的核心: * 作用:防止客户端篡改令牌内容,确保令牌在传输与存储过程中未被恶意修改 * 常用算法 * 对称加密:HMAC-SHA256(HS256) * 非对称加密:RSASSA-PKCS1-v1_5、ECDSA、RSASSA-PSS * 关键原则:令牌在交付客户端前必须签名,服务端接收后必须先验证签名再执行其他操作在完成搜索jwt密钥爆破脚本,尝试通关webgoat密钥伪造关卡,我们可以先试着了解一下,cookie,token,session通俗的说session,就是用户输入的账号号密码,在服务器,

WebAgent详解+实战:用开源AI智能体搞定产品与竞品市场调研

WebAgent详解+实战:用开源AI智能体搞定产品与竞品市场调研

在市场调研场景中,产品及竞品分析往往需要投入大量人力,手动浏览网页、提取信息、整理数据,不仅效率低下,还容易出现信息遗漏、误差等问题。WebAgent作为通义实验室开源的端到端自主网页智能体,凭借强大的中文语义理解、多步骤推理和结构化输出能力,可完全本地部署且永久免费,能高效替代人工完成网页信息采集、竞品数据提取、产品信息汇总等调研工作。本文将从WebAgent核心介绍、部署要点入手,聚焦产品与竞争对手调研场景,一步步实现实战示例,让无论是开发者还是市场从业者,都能快速上手,用AI提升调研效率,摆脱重复劳动。 一、初识WebAgent:阿里开源的网页智能体“神器” 1.1 什么是WebAgent? WebAgent是阿里巴巴通义实验室开源的自主网页智能体框架,核心定位是“模拟人类浏览网页的完整流程”,能理解自然语言指令、规划浏览路径、执行网页操作(点击、翻页、搜索等)、提取关键信息并结构化输出,无需人工干预即可完成复杂的网页相关任务。 与国外的AgentQL相比,WebAgent最大的优势的是完全开源免费、支持本地部署、中文语义优化,无需调用云端API,数据可完全保存在内网,

一键拯救大模型的前端审美能力 - 使用Frontend-Design Skill提升AI设计水平

# 一键拯救大模型的前端审美能力 ## 前言 目前,在不额外给风格规范/设计系统/示例参考的情况下,拥有前端审美能力的编程模型只有4款: - Gemini 3 Pro - Gemini 3 Flash   - Claude Opus 4.5 - Claude Sonnet 4.5 当我们看到GPT-5.2-Codex等明明其他方面都很厉害,但是唯独前端审美不行的模型时,常常感叹"哀其不幸、怒其不争"。那么,是否有快速提升他们前端审美能力的方法呢? 答案是:**使用 Anthropic 官方提供的 frontend-design skill** ## 什么是 Frontend-Design Skill? Frontend-Design Skill 是 Anthropic 官方提供的一款技能包,可以为所有主流编程大模型(