2026/1/25 4:07:33
网站建设
项目流程
网站底部版权信息字体颜色,wordpress怎么使用自己的模板,宁波网站排名公司,织梦网站网址变了如何搬家API响应格式是啥#xff1f;返回JSON含wav base64编码与元信息
#x1f4d6; 项目简介
本镜像基于 ModelScope 经典的 Sambert-HifiGan#xff08;中文多情感#xff09; 模型构建#xff0c;提供高质量、端到端的中文语音合成能力。模型支持多种情感语调#xff08;如…API响应格式是啥返回JSON含wav base64编码与元信息 项目简介本镜像基于 ModelScope 经典的Sambert-HifiGan中文多情感模型构建提供高质量、端到端的中文语音合成能力。模型支持多种情感语调如开心、悲伤、愤怒、平静等适用于智能客服、有声阅读、虚拟主播等多种场景。系统已集成Flask WebUI用户可通过浏览器直接输入文本在线合成语音并实时播放或下载音频文件。整个服务以轻量级容器化方式部署兼容性强开箱即用。 核心亮点 -多情感合成支持情绪控制提升语音自然度和表现力 -双模访问同时提供图形化 Web 界面与标准 HTTP API 接口 -环境稳定已修复datasets(2.13.0)、numpy(1.23.5)与scipy(1.13)的依赖冲突杜绝运行时错误 -CPU优化无需GPU即可流畅推理适合边缘设备与低成本部署 -Base64输出API 返回.wav音频的 Base64 编码便于前端解析与嵌入使用 使用说明WebUI 模式启动镜像后点击平台提供的HTTP 访问按钮打开 Web 界面。在网页中的文本框输入希望合成的中文内容支持长文本分段处理。选择所需的情感类型如“开心”、“严肃”等调节语速参数可选。点击“开始合成语音”按钮等待数秒后即可在页面上试听结果并支持将.wav文件一键下载至本地。 API 接口设计与响应格式详解除了可视化操作外该服务还暴露了标准化的 RESTful API 接口方便开发者将其集成到自有系统中。以下是核心接口的技术细节。✅ 请求地址POST /tts✅ 请求头HeadersContent-Type: application/json✅ 请求体Request Body| 参数名 | 类型 | 必填 | 描述 | |-----------|--------|------|------| | text | string | 是 | 要合成的中文文本建议不超过500字 | | emotion | string | 否 | 情感类型可选值happy,sad,angry,calm,neutral默认为neutral | | speed | float | 否 | 语速倍率范围 0.5~2.0默认为 1.0 |示例请求{ text: 今天天气真好我们一起去公园散步吧, emotion: happy, speed: 1.2 }✅ 响应格式Response Format成功响应时服务器返回一个 JSON 对象包含以下字段| 字段 | 类型 | 说明 | |--------------|--------|------| | code | int | 状态码0表示成功非零表示失败 | | message | string | 结果描述信息 | | data | object | 包含音频数据和元信息的对象仅当成功时存在 | | └─ audio_base64 | string |.wav音频文件的 Base64 编码字符串 | | └─ sample_rate | int | 音频采样率Hz通常为 24000 或 16000 | | └─ duration | float | 音频时长秒精确到小数点后两位 | | └─ format | string | 音频格式固定为WAV| | └─ emotion | string | 实际使用的合成情感模式 |成功响应示例Status: 200 OK{ code: 0, message: success, data: { audio_base64: UklGRiQAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAZGF0YUAAAAA..., sample_rate: 24000, duration: 3.42, format: WAV, emotion: happy } }失败响应示例{ code: 400, message: 文本不能为空 } 注意事项 -audio_base64是完整的.wav文件二进制流经 Base64 编码后的字符串可用于前端audio标签播放html audio controls srcdata:audio/wav;base64,UklGRiQAAABX... autoplay/audio- 若需保存为物理文件解码 Base64 后写入.wav扩展名即可。 - 建议对长文本进行分句处理避免单次请求超时。 Python 调用示例API 实践应用下面是一个完整的 Python 客户端调用示例展示如何通过requests发起 TTS 请求并将返回的 Base64 音频保存为本地.wav文件。import requests import base64 import json # 设置API地址根据实际部署IP和端口调整 API_URL http://localhost:5000/tts # 构造请求数据 payload { text: 你好我是由 Sambert-Hifigan 模型驱动的语音助手。, emotion: calm, speed: 1.0 } headers { Content-Type: application/json } # 发送POST请求 response requests.post(API_URL, datajson.dumps(payload), headersheaders) # 解析响应 if response.status_code 200: result response.json() if result[code] 0: # 提取Base64音频数据 audio_data result[data][audio_base64] sample_rate result[data][sample_rate] duration result[data][duration] print(f✅ 合成成功采样率: {sample_rate}Hz时长: {duration}s) # 解码并保存为WAV文件 wav_bytes base64.b64decode(audio_data) with open(output.wav, wb) as f: f.write(wav_bytes) print( 音频已保存为 output.wav) else: print(f❌ 合成失败: {result[message]}) else: print(f⚠️ 请求异常: {response.status_code}, {response.text}) 代码解析要点json.dumps(payload)确保中文字符正确序列化避免乱码。base64.b64decode()将 Base64 字符串还原为原始二进制.wav数据。文件写入模式wb必须以二进制方式写入音频文件。前端兼容性提示若用于 Web 应用可直接将audio_base64注入 HTML 的src属性实现即时播放。⚙️ Flask 后端实现关键逻辑原理剖析为了帮助开发者理解内部机制以下展示 Flask 服务中处理 TTS 请求的核心代码片段。from flask import Flask, request, jsonify import numpy as np import io import base64 from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks app Flask(__name__) # 初始化TTS流水线加载Sambert-Hifigan模型 inference_pipeline pipeline( taskTasks.text_to_speech, modeldamo/speech_sambert-hifigan_tts_zh-cn_pretrain_16k ) app.route(/tts, methods[POST]) def tts(): try: data request.get_json() text data.get(text, ).strip() emotion data.get(emotion, neutral) speed float(data.get(speed, 1.0)) if not text: return jsonify({code: 400, message: 文本不能为空}), 400 # 支持情感参数传递具体取决于模型是否支持 result inference_pipeline(inputtext, voiceemotion, speedspeed) # 获取音频波形numpy array和采样率 waveform result[output_wav] sr result.get(fs, 24000) # 转换为BytesIO对象并编码为WAV格式 wav_io io.BytesIO() from scipy.io import wavfile wavfile.write(wav_io, sr, (waveform * 32767).astype(np.int16)) wav_bytes wav_io.getvalue() # 编码为Base64 audio_base64 base64.b64encode(wav_bytes).decode(utf-8) # 计算音频时长 duration len(waveform) / sr return jsonify({ code: 0, message: success, data: { audio_base64: audio_base64, sample_rate: sr, duration: round(duration, 2), format: WAV, emotion: emotion } }) except Exception as e: return jsonify({ code: 500, message: f服务内部错误: {str(e)} }), 500 关键技术点说明模型加载使用modelscope.pipelines.pipeline加载预训练的speech_sambert-hifigan_tts_zh-cn_pretrain_16k模型自动管理前后处理流程。情感控制通过voiceemotion参数传入情感标签模型内部会激活对应的情感嵌入向量。音频编码封装使用scipy.io.wavfile.write将浮点型波形归一化为 16bit PCM 整数格式写入内存缓冲区BytesIO避免磁盘 I/O 开销最终转为 Base64 字符串供 JSON 传输。异常捕获全局 try-except 捕获模型推理、参数解析等环节的异常保证 API 稳定性。️ 常见问题与解决方案FAQ| 问题 | 原因分析 | 解决方案 | |------|---------|----------| | 返回的 Base64 无法播放 | 编码不完整或格式错误 | 确保使用b64encode().decode(utf-8)正确转换 | | 中文乱码 | JSON 序列化未设置 ensure_asciiFalse | 在jsonify或json.dumps中添加ensure_asciiFalse| | 启动报错ModuleNotFoundError| 依赖版本冲突 | 使用指定版本numpy1.23.5,scipy1.13,datasets2.13.0| | 音频播放有杂音 | 波形未归一化或溢出 | 将waveform映射到[-1, 1]并转为int16范围 | | 推理速度慢 | 默认使用 CPU 单线程 | 可尝试启用 ONNX 加速或批处理优化 | 总结与最佳实践建议本文深入解析了基于ModelScope Sambert-Hifigan模型构建的中文多情感语音合成系统的 API 设计与实现机制重点讲解了其JSON 响应结构中包含 WAV Base64 编码与元信息的工程实践方式。✅ 核心价值总结统一数据封装通过 JSON 返回audio_base64 metadata实现“数据描述”一体化传输极大简化前后端集成。跨平台兼容Base64 编码可在 Web、App、小程序等任意环境直接播放无需额外解码库。语义丰富元信息采样率、时长、情感有助于客户端做进一步处理如进度条显示、变速不变调等。️ 推荐最佳实践前端播放优化js const audioSrc data:audio/wav;base64,${base64Str}; const audio new Audio(audioSrc); audio.play();大文本分片合成对超过300字的文本按句子切分分别请求后再拼接波形数组。缓存机制引入对高频请求的固定语句如欢迎语做 Redis 缓存减少重复推理开销。日志监控接入记录每次请求的text,emotion,duration便于后期质量评估与调试。 下一步学习路径推荐ModelScope 官方文档了解更多语音合成模型与 Pipeline 用法Flask 官方教程深入掌握 Web API 开发技巧Base64 编解码原理理解其在多媒体传输中的作用《深度学习语音合成》书籍系统学习 Tacotron、FastSpeech、HiFi-GAN 等核心技术 温馨提示本项目已在 GitHub 开源模板基础上完成适配与稳定性加固可作为企业级 TTS 微服务模块快速集成。持续关注 ModelScope 社区更新未来或将支持更多语言与情感维度。