楚雄彝族自治州网站建设_网站建设公司_内容更新_seo优化
2026/1/9 13:45:57 网站建设 项目流程

<!doctype html>网页如何调用TTS?Flask接口示例代码全解析

📌 引言:让网页“开口说话”——中文多情感TTS的落地实践

在智能客服、有声阅读、语音助手等场景中,文本转语音(Text-to-Speech, TTS)技术正变得越来越重要。尤其是支持多情感表达的中文语音合成,能显著提升用户体验的真实感与亲和力。ModelScope 平台推出的Sambert-Hifigan 中文多情感语音合成模型,凭借其高质量的端到端合成能力,成为当前极具竞争力的开源方案之一。

然而,模型本身只是起点。如何将其集成到实际应用中,特别是通过一个简洁的 Web 页面实现“输入文字 → 合成语音 → 播放下载”的完整闭环,是工程落地的关键挑战。本文将深入解析:如何基于 Flask 构建一个稳定可用的 TTS 服务接口,并通过 HTML 页面调用它完成语音合成。我们不仅提供完整的前后端代码实现,还重点解决常见依赖冲突问题,确保项目开箱即用。


🧩 核心技术栈与架构设计

本系统采用典型的前后端分离架构,整体结构如下:

[用户浏览器] ↓ (HTTP请求) [Flask Web Server] ←→ [Sambert-Hifigan 模型推理引擎] ↓ [生成 .wav 音频文件] ↓ [返回音频URL供播放/下载]

✅ 关键组件说明

| 组件 | 作用 | |------|------| |ModelScope Sambert-Hifigan| 主体TTS模型,支持中文多情感合成,输出高保真语音 | |Flask| 轻量级Python Web框架,用于暴露API和渲染WebUI | |Jinja2| Flask默认模板引擎,动态生成HTML页面 | |Werkzeug| 处理文件存储、请求解析等底层逻辑 | |前端HTML+JS| 实现用户交互界面与音频播放控制 |

💡 设计目标
- 支持长文本输入
- 实时合成并返回音频
- 提供在线播放与.wav文件下载功能
- 兼容CPU环境,避免GPU依赖


🔧 环境准备与依赖修复(关键步骤)

由于 ModelScope 生态对numpyscipydatasets版本敏感,直接安装常导致运行时错误。以下是经过验证的稳定依赖组合

pip install modelscope==1.13.0 pip install flask==2.3.3 pip install numpy==1.23.5 pip install scipy==1.11.4 pip install datasets==2.13.0 pip install soundfile

⚠️ 特别注意: -scipy < 1.13是必须的,否则会报AttributeError: module 'scipy' has no attribute 'misc'
-numpy==1.23.5可避免与onnxruntime的兼容性问题
- 若使用更高版本 Python(如3.11),建议创建独立虚拟环境以隔离依赖

安装完成后,可通过以下命令测试模型是否可加载:

from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks tts_pipeline = pipeline(task=Tasks.text_to_speech, model='damo/speech_sambert-hifigan_tts_zh-cn_pretrain_16k') print("✅ 模型加载成功")

🖥️ 前端HTML页面设计(支持语音播放与下载)

我们使用原生 HTML + JavaScript 构建轻量级 WebUI,无需额外前端框架即可实现完整交互。

templates/index.html

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <title>中文多情感TTS合成器</title> <style> body { font-family: "Microsoft YaHei", sans-serif; padding: 40px; background: #f7f9fc; } h1 { color: #333; text-align: center; } textarea { width: 100%; height: 120px; padding: 12px; border: 1px solid #ccc; border-radius: 8px; font-size: 16px; margin-bottom: 20px; } button { background: #007bff; color: white; padding: 12px 24px; border: none; border-radius: 6px; cursor: pointer; font-size: 16px; } button:hover { background: #0056b3; } audio { width: 100%; margin-top: 20px; } .download { margin-top: 10px; display: block; text-align: center; } </style> </head> <body> <h1>🎙️ 中文多情感语音合成</h1> <form id="ttsForm"> <textarea name="text" placeholder="请输入要合成的中文文本...(支持长文本)"></textarea><br /> <button type="submit">开始合成语音</button> </form> <div id="result"></div> <script> document.getElementById('ttsForm').onsubmit = async (e) => { e.preventDefault(); const formData = new FormData(e.target); const response = await fetch('/synthesize', { method: 'POST', body: JSON.stringify({ text: formData.get('text') }), headers: { 'Content-Type': 'application/json' } }); if (response.ok) { const data = await response.json(); const resultDiv = document.getElementById('result'); resultDiv.innerHTML = ` <audio src="${data.audio_url}" controls></audio> <a class="download" href="${data.audio_url}" download="tts_output.wav">📥 下载音频文件</a> `; } else { alert('合成失败:' + await response.text()); } }; </script> </body> </html>

📌 功能亮点: - 使用<audio>标签实现浏览器内实时播放 -fetch发送 JSON 请求至 Flask 接口 - 支持一键下载.wav文件 - 响应式布局适配移动端


🐍 Flask后端服务实现(完整可运行代码)

app.py

import os import uuid from flask import Flask, request, jsonify, send_from_directory, render_template from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 初始化Flask应用 app = Flask(__name__) app.config['UPLOAD_FOLDER'] = 'static/audio' os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # 加载Sambert-Hifigan模型管道 try: tts_pipeline = pipeline( task=Tasks.text_to_speech, model='damo/speech_sambert-hifigan_tts_zh-cn_pretrain_16k' ) print("✅ Model loaded successfully.") except Exception as e: print(f"❌ Failed to load model: {e}") tts_pipeline = None @app.route('/') def index(): """渲染主页HTML""" return render_template('index.html') @app.route('/synthesize', methods=['POST']) def synthesize(): """接收文本并生成语音""" if not tts_pipeline: return "模型未加载,请检查依赖", 500 data = request.get_json() text = data.get('text', '').strip() if not text: return "请输入有效文本", 400 # 生成唯一文件名 filename = f"{uuid.uuid4().hex}.wav" filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) try: # 执行语音合成 output = tts_pipeline(input=text, voice='zhiyan_emo') # 保存音频文件 import soundfile as sf sf.write(filepath, output['output_wav'], 16000) # 返回音频URL audio_url = f"/static/audio/{filename}" return jsonify({ 'status': 'success', 'audio_url': audio_url, 'filename': filename }) except Exception as e: app.logger.error(f"TTS error: {str(e)}") return f"合成出错: {str(e)}", 500 @app.route('/static/audio/<filename>') def serve_audio(filename): """提供音频文件访问""" return send_from_directory(app.config['UPLOAD_FOLDER'], filename) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)

🔍 代码核心逻辑详解

1.模型初始化与异常处理

tts_pipeline = pipeline( task=Tasks.text_to_speech, model='damo/speech_sambert-hifigan_tts_zh-cn_pretrain_16k' )
  • 使用modelscope.pipelines.pipeline快速构建推理流水线
  • voice='zhiyan_emo'表示启用多情感模式(知音女声)
  • 包裹在 try-except 中防止启动失败影响Web服务

2.语音合成与文件写入

output = tts_pipeline(input=text, voice='zhiyan_emo') sf.write(filepath, output['output_wav'], 16000)
  • output['output_wav']是 NumPy 数组格式的波形数据
  • 使用soundfile.write()保存为标准.wav文件
  • 采样率固定为 16kHz,符合模型输出规范

3.安全路径管理与静态资源服务

  • 所有音频存于/static/audio/目录
  • 使用send_from_directory安全返回文件,防止路径穿越攻击
  • uuid.uuid4()保证文件名唯一,避免覆盖

⚙️ 运行方式与部署建议

本地运行步骤:

# 1. 创建目录结构 mkdir -p templates static/audio # 2. 将HTML保存为 templates/index.html # 3. 将Python脚本保存为 app.py # 4. 安装依赖(见前文) pip install -r requirements.txt # 5. 启动服务 python app.py

访问http://localhost:5000即可使用。


Docker化建议(生产环境)

FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]

配合 Nginx 反向代理可进一步提升并发性能。


🛠️ 常见问题与解决方案

| 问题 | 原因 | 解决方案 | |------|------|----------| |ModuleNotFoundError: No module named 'modelscope'| 未安装或版本不匹配 | 使用指定版本重新安装 | |scipy.misc not found| scipy版本过高 | 降级至scipy==1.11.4| | 音频无法播放 | MIME类型错误 | 确保返回正确的 Content-Type (audio/wav) | | 长文本合成卡顿 | 内存不足 | 分段合成或增加交换空间 | | 接口超时 | CPU性能不足 | 启用异步队列 + 缓存机制优化 |


🎯 总结:打造稳定高效的中文TTS服务

本文完整展示了如何将ModelScope Sambert-Hifigan 多情感中文TTS模型集成进一个基于 Flask 的 Web 应用中,实现了从“文本输入”到“语音播放”的全流程闭环。核心价值体现在:

✅ 已修复所有依赖冲突:特别解决了numpyscipydatasets的版本兼容难题,确保环境稳定
✅ 提供完整可运行代码:包含前后端全部实现,支持直接部署
✅ 双模服务能力:既可通过浏览器交互使用,也可作为标准 API 被其他系统调用
✅ 轻量化设计:无需GPU即可运行,适合边缘设备或低成本服务器

该方案已在多个语音播报、AI陪练项目中成功落地,具备良好的工程实用性和扩展潜力。未来可结合 WebSocket 实现流式合成,或引入缓存机制提升高频请求下的响应速度。

如果你正在寻找一个开箱即用、稳定可靠、支持多情感表达的中文TTS解决方案,那么这套基于 Flask + ModelScope 的实现,无疑是一个值得尝试的优质选择。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询