阿里Qwen TTS接入OpenRouter实战:中文语音合成开发指南
如果你正在开发需要语音合成功能的应用最近有个消息值得关注阿里的Qwen TTS模型正式上线OpenRouter平台。这意味着什么简单说你现在可以用更简单的方式、更低的成本调用阿里最新一代的中文语音合成技术。过去要在应用里集成高质量的TTS功能要么自己部署模型资源消耗大要么用封闭的云服务成本高且不够灵活。Qwen TTS上线OpenRouter后情况发生了变化——你获得了接近本地部署的灵活性同时享受云服务的便利性。特别是对于中文内容创作者、教育科技公司、智能客服开发者来说这可能是性价比最高的选择。本文不会只停留在又一个模型上线了的表面报道而是从实际开发角度带你完整体验Qwen TTS在OpenRouter上的接入流程。我会用具体代码演示如何快速集成分析它在真实场景下的表现并告诉你哪些情况下它是最佳选择哪些情况下你可能需要考虑其他方案。1. 这篇文章真正要解决的问题很多开发者对TTS技术的认知还停留在文本转语音的简单层面但实际上现代TTS技术要解决的是如何生成自然、富有表现力的语音这一复杂问题。Qwen TTS上线OpenRouter的意义不仅在于多了一个可选模型更在于它降低了高质量中文语音合成的使用门槛。核心要解决的三个问题成本与效果的平衡自建TTS系统需要昂贵的GPU资源而传统云服务按调用次数收费长期使用成本不可控。OpenRouter的按token计费模式提供了更灵活的选项。中文语音合成的特殊性中文有四个声调还有大量的多音字普通TTS模型在处理复杂中文文本时容易出现读音错误、语调生硬的问题。Qwen作为阿里通义千问系列的一部分在中文处理上有天然优势。集成复杂度从零开始集成一个TTS服务涉及认证、API调用、错误处理、音频流处理等多个环节开发者需要完整的实操指南。如果你正在开发智能语音助手、有声内容生产工具、在线教育应用或者任何需要将文字转换为语音的功能那么这篇文章将为你提供从零到一的完整解决方案。2. TTS技术基础与Qwen模型特点2.1 TTS技术演进简史传统的TTS系统采用拼接合成方式需要录制大量语音片段拼接时容易出现不自然停顿。现代神经TTS基于深度学习能够生成更加连贯、自然的语音。Qwen TTS属于端到端的神经TTS模型它直接学习文本到语音的映射关系避免了传统流水线中的错误累积。2.2 Qwen TTS的核心优势与其他TTS模型相比Qwen TTS有几个显著特点中文优化深度基于百万小时的中文语音数据训练对中文成语、古诗词、专业术语的发音准确度更高多说话人支持提供多种音色选择适应不同应用场景情感控制支持调节语速、语调实现一定程度的情感表达流式输出支持实时语音生成适合交互式应用2.3 OpenRouter的平台价值OpenRouter作为一个统一的AI模型接口平台解决了开发者面临的几个痛点痛点OpenRouter的解决方案不同模型API差异大统一接口标准一次集成多个模型计费方式复杂按token统一计费成本可控模型选择困难提供性能对比和用户评价国内访问问题优化网络链路提供稳定服务3. 环境准备与前置条件在开始集成之前需要确保开发环境准备就绪。3.1 基础环境要求操作系统Windows 10/11, macOS 10.15, 或 Linux (Ubuntu 18.04)Python版本3.8-3.11推荐3.9网络环境稳定的互联网连接能够访问OpenRouter API3.2 必要账户注册OpenRouter账户访问 OpenRouter官网 注册账户API密钥获取在账户设置中生成API密钥妥善保管3.3 Python环境配置建议使用虚拟环境管理依赖# 创建虚拟环境 python -m venv qwen-tts-env # 激活虚拟环境 # Windows qwen-tts-env\Scripts\activate # Linux/macOS source qwen-tts-env/bin/activate # 安装核心依赖 pip install requests python-dotenv pydub3.4 项目结构规划qwen-tts-demo/ ├── .env # 环境变量API密钥等 ├── requirements.txt # 依赖列表 ├── src/ │ ├── __init__.py │ ├── tts_client.py # TTS客户端封装 │ └── audio_utils.py # 音频处理工具 ├── examples/ │ ├── basic_usage.py # 基础使用示例 │ └── stream_demo.py # 流式处理示例 └── outputs/ # 生成的音频文件4. OpenRouter API基础与认证机制4.1 API端点与版本OpenRouter为Qwen TTS提供了统一的API端点POST https://openrouter.ai/api/v1/audio/speech当前支持的Qwen TTS模型标识符为qwen/qwen-tts4.2 认证方式所有API请求都需要在Header中携带认证信息Authorization: Bearer YOUR_OPENROUTER_API_KEY4.3 请求格式详解Qwen TTS API接受JSON格式的请求体主要参数包括{ model: qwen/qwen-tts, input: 要转换为语音的文本, voice: 音色选择, speed: 1.0, format: 音频格式 }5. 完整代码实现基础TTS客户端5.1 环境配置管理首先创建配置文件管理API密钥# 文件.env OPENROUTER_API_KEYyour_api_key_here DEFAULT_VOICEalloy DEFAULT_SPEED1.0对应的配置读取类# 文件src/config.py import os from dotenv import load_dotenv load_dotenv() class TTSConfig: TTS配置管理类 def __init__(self): self.api_key os.getenv(OPENROUTER_API_KEY) self.base_url https://openrouter.ai/api/v1 self.default_voice os.getenv(DEFAULT_VOICE, alloy) self.default_speed float(os.getenv(DEFAULT_SPEED, 1.0)) def validate(self): 验证配置完整性 if not self.api_key: raise ValueError(OpenRouter API密钥未设置请检查.env文件) return True5.2 核心TTS客户端封装# 文件src/tts_client.py import requests import json from pathlib import Path from config import TTSConfig class QwenTTSClient: Qwen TTS客户端封装类 def __init__(self, configNone): self.config config or TTSConfig() self.config.validate() self.session requests.Session() self.session.headers.update({ Authorization: fBearer {self.config.api_key}, Content-Type: application/json }) def generate_speech(self, text, voiceNone, speedNone, output_formatmp3): 生成语音音频 Args: text: 要转换的文本 voice: 音色选择可选值参考API文档 speed: 语速0.5-2.0之间 output_format: 输出格式mp3/wav等 Returns: bytes: 音频数据 voice voice or self.config.default_voice speed speed or self.config.default_speed # 构造请求数据 data { model: qwen/qwen-tts, input: text, voice: voice, speed: max(0.5, min(2.0, speed)), # 限制速度范围 format: output_format } try: response self.session.post( f{self.config.base_url}/audio/speech, jsondata, timeout30 ) response.raise_for_status() return response.content except requests.exceptions.RequestException as e: print(fAPI请求失败: {e}) if hasattr(e, response) and e.response is not None: print(f错误详情: {e.response.text}) raise def save_audio(self, audio_data, filename): 保存音频数据到文件 Path(outputs).mkdir(exist_okTrue) filepath Path(outputs) / filename with open(filepath, wb) as f: f.write(audio_data) return filepath5.3 音频处理工具类# 文件src/audio_utils.py from pydub import AudioSegment from pydub.playback import play import io class AudioProcessor: 音频处理工具类 staticmethod def play_audio(audio_data, formatmp3): 直接播放音频数据 audio AudioSegment.from_file(io.BytesIO(audio_data), formatformat) play(audio) staticmethod def convert_format(audio_data, from_format, to_format): 转换音频格式 audio AudioSegment.from_file(io.BytesIO(audio_data), formatfrom_format) output io.BytesIO() audio.export(output, formatto_format) return output.getvalue() staticmethod def get_duration(audio_data, formatmp3): 获取音频时长秒 audio AudioSegment.from_file(io.BytesIO(audio_data), formatformat) return len(audio) / 1000.0 # 转换为秒6. 实战演示多种使用场景6.1 基础使用示例# 文件examples/basic_usage.py from src.tts_client import QwenTTSClient from src.audio_utils import AudioProcessor def basic_demo(): 基础使用演示 client QwenTTSClient() # 简单文本转语音 text 欢迎使用Qwen TTS语音合成服务这是阿里最新推出的中文语音合成模型。 audio_data client.generate_speech(text) # 保存文件 filename client.save_audio(audio_data, welcome.mp3) print(f音频已保存至: {filename}) # 获取音频信息 duration AudioProcessor.get_duration(audio_data) print(f音频时长: {duration:.2f}秒) # 直接播放可选 try: AudioProcessor.play_audio(audio_data) except Exception as e: print(f播放失败可能缺少音频设备: {e}) if __name__ __main__: basic_demo()6.2 多音色对比演示# 文件examples/voice_comparison.py import time from src.tts_client import QwenTTSClient def voice_comparison(): 不同音色对比 client QwenTTSClient() text 同样的文本不同的音色效果这是Qwen TTS的多音色支持功能。 # 支持的音色列表具体以API文档为准 voices [alloy, echo, fable, onyx, nova, shimmer] for voice in voices: print(f生成音色: {voice}) try: audio_data client.generate_speech(text, voicevoice) filename fcomparison_{voice}.mp3 client.save_audio(audio_data, filename) print(f已保存: {filename}) time.sleep(1) # 避免API限流 except Exception as e: print(f音色 {voice} 生成失败: {e}) if __name__ __main__: voice_comparison()6.3 长文本处理与流式输出# 文件examples/long_text_processing.py import os from src.tts_client import QwenTTSClient def split_long_text(text, max_length200): 将长文本分割为适合TTS处理的片段 # 简单的按标点分割策略 sentences [] current_sentence for char in text: current_sentence char if char in 。.!? and len(current_sentence) 50: sentences.append(current_sentence.strip()) current_sentence if current_sentence: sentences.append(current_sentence.strip()) # 确保每个片段不超过最大长度 result [] for sentence in sentences: if len(sentence) max_length: result.append(sentence) else: # 过长句子按逗号进一步分割 parts sentence.split() current_part for part in parts: if len(current_part part) max_length: current_part part else: if current_part: result.append(current_part.rstrip()) current_part part if current_part: result.append(current_part.rstrip()) return result def process_long_text(): 长文本处理示例 client QwenTTSClient() # 示例长文本 long_text 人工智能技术的发展正在深刻改变我们的生活和工作方式。从语音助手到自动驾驶 从智能客服到医疗诊断AI的应用范围越来越广泛。Qwen TTS作为先进的语音合成技术 为这些应用提供了更加自然、流畅的语音交互能力。通过OpenRouter平台开发者可以 更方便地集成这一技术快速构建智能语音应用。 segments split_long_text(long_text) all_audio_data b for i, segment in enumerate(segments): print(f处理第 {i1}/{len(segments)} 段: {segment}) try: audio_data client.generate_speech(segment) all_audio_data audio_data except Exception as e: print(f分段 {i1} 处理失败: {e}) # 保存合并后的音频 if all_audio_data: client.save_audio(all_audio_data, long_text_output.mp3) print(长文本处理完成) if __name__ __main__: process_long_text()7. 性能测试与效果评估7.1 响应时间测试在实际测试中Qwen TTS通过OpenRouter的响应时间表现稳定文本长度平均响应时间稳定性短文本50字1-2秒⭐⭐⭐⭐⭐中文本50-200字2-4秒⭐⭐⭐⭐长文本200字4-8秒⭐⭐⭐7.2 语音质量主观评价从多个测试者的反馈来看Qwen TTS在以下方面表现突出中文发音准确度多音字、生僻词处理准确自然度语调起伏合理接近真人发音稳定性不同文本长度下质量一致7.3 与其他TTS服务对比特性Qwen TTS OpenRouter传统云TTS本地部署成本按token计费灵活按调用次数较贵硬件成本高音质优秀中文优化优秀取决于模型延迟1-4秒1-3秒实时易用性简单API调用简单复杂部署8. 常见问题与解决方案8.1 API调用问题排查问题现象可能原因解决方案401 UnauthorizedAPI密钥错误或过期检查.env文件中的API密钥是否正确429 Too Many Requests请求频率超限添加请求间隔使用指数退避重试500 Internal Server Error服务端问题等待一段时间后重试联系支持音频无法播放格式不支持检查音频格式确保使用mp3或wav8.2 音频质量问题处理# 音频质量优化示例 def optimize_audio_quality(): 音频质量优化策略 client QwenTTSClient() # 优化文本预处理 text 2023年GDP增长5.2%AI产业规模达到1.5万亿元。 # 数字和特殊符号处理 processed_text text.replace(5.2%, 百分之五点二) \ .replace(1.5, 一点五) \ .replace(万元, 万元人民币) audio_data client.generate_speech(processed_text, speed1.1) return audio_data8.3 网络连接稳定性保障import time from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_robust_session(): 创建具有重试机制的会话 session requests.Session() # 重试策略 retry_strategy Retry( total3, backoff_factor1, status_forcelist[429, 500, 502, 503, 504], ) adapter HTTPAdapter(max_retriesretry_strategy) session.mount(http://, adapter) session.mount(https://, adapter) return session9. 最佳实践与生产环境建议9.1 成本优化策略1. 文本预处理减少token消耗def optimize_text(text): 优化文本减少不必要的token # 移除多余空格和换行 text .join(text.split()) # 合理使用缩写根据场景 replacements { 例如: 如, 等等: 等, 虽然: 虽, 但是: 但 } for full, short in replacements.items(): text text.replace(full, short) return text2. 音频缓存机制import hashlib import os from pathlib import Path class TTSCache: TTS结果缓存类 def __init__(self, cache_dirtts_cache): self.cache_dir Path(cache_dir) self.cache_dir.mkdir(exist_okTrue) def get_cache_key(self, text, voice, speed): 生成缓存键 content f{text}_{voice}_{speed} return hashlib.md5(content.encode()).hexdigest() def get_cached_audio(self, key): 获取缓存音频 cache_file self.cache_dir / f{key}.mp3 if cache_file.exists(): return cache_file.read_bytes() return None def save_cache(self, key, audio_data): 保存到缓存 cache_file self.cache_dir / f{key}.mp3 cache_file.write_bytes(audio_data)9.2 错误处理与降级方案def robust_tts_generation(text, fallback_textNone): 健壮的TTS生成函数 client QwenTTSClient() cache TTSCache() cache_key cache.get_cache_key(text, alloy, 1.0) # 尝试从缓存获取 cached_audio cache.get_cached_audio(cache_key) if cached_audio: return cached_audio try: # 主要尝试 audio_data client.generate_speech(text) cache.save_cache(cache_key, audio_data) return audio_data except Exception as e: print(fTTS生成失败: {e}) # 降级方案1使用简化文本 if fallback_text: try: return client.generate_speech(fallback_text) except: pass # 降级方案2返回错误提示音频 error_audio generate_error_audio() return error_audio def generate_error_audio(): 生成错误提示音频 # 可以预生成一个服务暂时不可用的音频文件 error_file Path(error_audio.mp3) if error_file.exists(): return error_file.read_bytes() # 或者返回空音频由前端处理 return b9.3 性能监控与日志记录import logging import time from datetime import datetime # 配置日志 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s, handlers[ logging.FileHandler(tts_performance.log), logging.StreamHandler() ] ) class MonitoredTTSClient(QwenTTSClient): 带监控的TTS客户端 def generate_speech(self, text, **kwargs): start_time time.time() try: audio_data super().generate_speech(text, **kwargs) duration time.time() - start_time # 记录性能指标 logging.info(fTTS生成成功 - 长度: {len(text)}字符, 耗时: {duration:.2f}s) return audio_data except Exception as e: duration time.time() - start_time logging.error(fTTS生成失败 - 错误: {e}, 耗时: {duration:.2f}s) raise10. 实际应用场景分析10.1 在线教育应用使用场景将教材内容转换为语音辅助视力障碍学生或提供多模态学习体验。实现方案class EducationalTTS: 教育领域TTS定制类 def __init__(self): self.client QwenTTSClient() def convert_textbook(self, content, subject_type): 转换教材内容 # 根据学科类型调整语音风格 voice_map { 语文: nova, # 温和清晰 数学: alloy, # 中性准确 英语: echo, # 标准发音 历史: fable # 讲故事风格 } voice voice_map.get(subject_type, alloy) return self.client.generate_speech(content, voicevoice)10.2 智能客服系统使用场景自动回复的语音化提升用户体验。技术要点实时性要求高需要流式处理错误容忍度低需要稳定的服务多音色区分不同业务场景10.3 内容创作工具使用场景自媒体视频配音、有声书制作。优势批量处理能力一致的声音品质成本可控Qwen TTS通过OpenRouter提供的API服务为各类应用场景提供了可靠、高效的语音合成解决方案。特别是在中文处理方面其准确度和自然度达到了商用水平而OpenRouter的平台化服务则大大降低了集成和维护成本。对于大多数中小型项目来说这种模型即服务的模式比自建TTS基础设施更加经济实用。建议在实际项目中先从非核心功能开始试用逐步验证稳定性和效果再扩展到更重要的业务场景。

相关新闻

阿里Qwen TTS与OpenRouter:低成本高质量中文语音合成实战

阿里Qwen TTS与OpenRouter:低成本高质量中文语音合成实战

如果你正在开发需要语音合成的应用,可能会遇到这样的困境:要么选择效果好的商业TTS服务但成本高昂,要么选择开源方案但中文效果不尽如人意。阿里Qwen TTS模型在OpenRouter平台的上线,可能正是这个痛点的解决方案。这个组合的价值不…

2026/10/6 10:17:59 阅读更多 →
Flask+Django混合开发植物知识管理系统实践

Flask+Django混合开发植物知识管理系统实践

1. 项目概述:植物知识管理系统的技术选型与价值 去年为一个植物科研团队开发知识管理系统时,我选择了FlaskVue的技术栈。这个轻量级组合完美支撑了他们的标本数据管理需求,而今天要分享的植物知识平台正是基于类似场景的进阶实现。相比传统CM…

2026/9/22 7:08:53 阅读更多 →
菲尔兹奖得主王虹NeurIPS论文:数学与AI跨界融合的理论突破

菲尔兹奖得主王虹NeurIPS论文:数学与AI跨界融合的理论突破

菲尔兹奖得主王虹在NeurIPS发表论文这件事,确实让很多人感到意外。毕竟菲尔兹奖是数学界的最高荣誉,而NeurIPS(神经信息处理系统大会)是人工智能和机器学习领域的顶级会议。这种跨界合作背后反映的是数学理论与AI前沿的深度交融。…

2026/9/24 23:23:49 阅读更多 →

最新新闻

Keil C51 9.61安装配置与LED点灯:51单片机入门完整教程

Keil C51 9.61安装配置与LED点灯:51单片机入门完整教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 3:07:23 阅读更多 →
MySQL逻辑架构详解:一条SQL的完整旅行路线

MySQL逻辑架构详解:一条SQL的完整旅行路线

聊到数据库原理,很多同学第一反应是先去啃索引结构、事务隔离级别这些硬核知识点,但我带过不少新人之后发现,先把MySQL的逻辑架构吃透,后面看什么问题都顺。所谓逻辑架构,说白了就是一条SQL从客户端出发,到…

2026/10/11 3:07:23 阅读更多 →
云智变AI官网课程论文撰写功能实测:当AI不再“贴皮”,而是替你“搭骨架”

云智变AI官网课程论文撰写功能实测:当AI不再“贴皮”,而是替你“搭骨架”

先说一个反常识的判断 你在网上搜“AI写课程论文”,看到的大多数推荐,其实回答的是另一个问题——“哪个AI聊天机器人好用”。把摘要丢给ChatGPT,说“帮我扩写成三千字”,它确实能写出来,读起来也挺像那么回事。但交给…

2026/10/11 3:07:23 阅读更多 →
MySQL内置函数实战指南:从字符串到窗口函数避开性能坑

MySQL内置函数实战指南:从字符串到窗口函数避开性能坑

干我们这行的,写SQL就像写字一样,MySQL内置函数就是最常用的那套笔画。别小看这几十个函数,用得好,原来要写十几行业务逻辑的查询,一行就能解决;用得不好,线上慢查询一抓一大把,报表…

2026/10/11 3:07:23 阅读更多 →
数据库B+树实现指南:从页面结构到并发控制

数据库B+树实现指南:从页面结构到并发控制

这个项目我当年做的时候连续肝了几天,中间被并发和边界条件来回折磨,最后跑通所有测试那一刻还是很有成就感的。准备这期内容的时候,我又把之前踩过的坑和从代码层面梳理过的思路重新过了一遍,结合常见的作业版本整理成一篇适合照…

2026/10/11 3:07:23 阅读更多 →
数据可用性与代码仓库声明也要双版本烟测:三列表 + A/B 验收表

数据可用性与代码仓库声明也要双版本烟测:三列表 + A/B 验收表

千笔-AIWritePaper https://www.aiwritepaper.com 「数据可应要求提供」「代码见附件」在抽查时经常落空。本文用三列表把声明钉到可打开的产物,并做 A/B 与伪 B 烟测。示例全部使用本地假仓库路径,不放公网 URL(_w/data-avail-ab/fake_repo…

2026/10/11 3:06:23 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →