Skip to content

Cyl147369991/STT

Repository files navigation

🎤 多模型语音转文字 API 服务

基于 Whisper 和 SenseVoice 的多模型语音转文字 API 服务,支持实时语音录制和转录。

📁 文件说明

  • fastwhisper.py - Whisper 模型封装类
  • sensevoice.py - SenseVoice 模型封装类
  • whisper_api_service.py - FastAPI 服务端(主服务)
  • whisper_test.html - 测试页面(支持麦克风录音)
  • audio_upload_transcribe.html - 音频文件上传转录页面
  • README.md - 本说明文档

🚀 快速开始

1. 安装依赖

pip install -r ../requirements.txt

2. 确认模型路径

  • Whisper 模型E:/模型/whisper-medium2
  • SenseVoice 模型:自动从 modelscope 缓存目录加载

3. 启动服务

python whisper_api_service.py

或者使用 uvicorn:

python -m uvicorn whisper_api_service:app --host 0.0.0.0 --port 8000 --reload

4. 测试服务

  1. API文档:访问 http://localhost:8000/docs 查看交互式API文档
  2. 健康检查:访问 http://localhost:8000/health 检查服务状态
  3. 测试页面:在浏览器中打开 whisper_test.html 进行录音测试

🔧 完整 API 接口文档

基础信息

  • 服务地址http://localhost:8000
  • API版本2.0.0
  • 支持格式:WAV(推荐)、MP3、M4A等
  • 编码方式:Base64

🏠 根接口

GET /

获取API服务基本信息和可用端点列表。

响应示例

{
    "message": "多模型语音转文字 API 服务",
    "version": "2.0.0",
    "available_models": {
        "whisper": "基于 faster-whisper 的语音转录模型",
        "sensevoice": "基于 SenseVoice 的多语言语音转录模型"
    },
    "endpoints": {
        "transcribe": "/api/transcribe",
        "health": "/health",
        "models": "/api/models"
    }
}

🏥 健康检查

GET /health

检查服务运行状态和模型加载情况。

响应示例

{
    "status": "healthy",
    "models": {
        "whisper": true,
        "sensevoice": true
    },
    "available_models": ["whisper", "sensevoice"]
}

状态说明

  • healthy: 至少一个模型正常加载
  • unhealthy: 所有模型加载失败

🤖 模型列表

GET /api/models

获取当前可用的语音转录模型详细信息。

响应示例

{
    "success": true,
    "models": [
        {
            "name": "whisper",
            "display_name": "Faster Whisper",
            "description": "基于 CTranslate2 优化的 Whisper 模型,速度快,准确率高",
            "features": ["多语言支持", "词级时间戳", "标点符号"]
        },
        {
            "name": "sensevoice",
            "display_name": "SenseVoice",
            "description": "阿里巴巴开源的多语言语音转录模型,支持中英日韩等多种语言",
            "features": ["多语言支持", "语音活动检测", "情感识别", "事件检测"]
        }
    ],
    "total": 2
}

🎯 语音转录接口(核心接口)

POST /api/transcribe

将音频数据转换为文本。

请求参数

参数 类型 必填 默认值 说明
audio_data string - Base64编码的音频数据
format string "wav" 音频格式(wav/mp3/m4a)
model string "whisper" 使用的模型(whisper/sensevoice)

请求示例

{
    "audio_data": "UklGRiQAAABXQVZFZm10IBAAAAAB...",
    "format": "wav",
    "model": "whisper"
}

响应格式

成功响应 (200)

{
    "success": true,
    "text": "这是转录得到的文字内容",
    "message": "使用 whisper 模型转录成功",
    "model_used": "whisper"
}

错误响应

状态码 错误类型 响应示例
400 参数错误 {"detail": "不支持的模型类型,请选择 'whisper' 或 'sensevoice'"}
400 数据为空 {"detail": "音频数据不能为空"}
503 模型不可用 {"detail": "Whisper 模型未加载,请选择其他模型或稍后重试"}
500 转录失败 {"detail": "使用 whisper 模型转录失败: [具体错误信息]"}

💻 客户端调用示例

Python 示例

import requests
import base64

# 读取音频文件
with open("audio.wav", "rb") as f:
    audio_bytes = f.read()
    audio_base64 = base64.b64encode(audio_bytes).decode("utf-8")

# 发送转录请求
url = "http://localhost:8000/api/transcribe"
data = {
    "audio_data": audio_base64,
    "format": "wav",
    "model": "whisper"  # 或 "sensevoice"
}

response = requests.post(url, json=data)
result = response.json()

if result["success"]:
    print(f"转录结果: {result['text']}")
    print(f"使用模型: {result['model_used']}")
else:
    print(f"转录失败: {result['message']}")

JavaScript 示例

// 录音获取音频数据(WebRTC)
navigator.mediaDevices.getUserMedia({ audio: true })
    .then(stream => {
        const mediaRecorder = new MediaRecorder(stream);
        const audioChunks = [];
        
        mediaRecorder.ondataavailable = event => {
            audioChunks.push(event.data);
        };
        
        mediaRecorder.onstop = async () => {
            const audioBlob = new Blob(audioChunks);
            const arrayBuffer = await audioBlob.arrayBuffer();
            const base64Audio = btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)));
            
            // 发送转录请求
            const response = await fetch('http://localhost:8000/api/transcribe', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    audio_data: base64Audio,
                    format: 'wav',
                    model: 'whisper'
                })
            });
            
            const result = await response.json();
            if (result.success) {
                console.log('转录结果:', result.text);
            } else {
                console.error('转录失败:', result.message);
            }
        };
    });

cURL 示例

# 使用Base64编码的音频文件
curl -X POST "http://localhost:8000/api/transcribe" \
     -H "Content-Type: application/json" \
     -d '{
         "audio_data": "UklGRiQAAABXQVZFZm10IBAAAAAB...",
         "format": "wav",
         "model": "whisper"
     }'

📊 模型对比

特性 Whisper SenseVoice
速度 快(CTranslate2优化) 较快
准确率
语言支持 多语言 中英日韩等
特殊功能 词级时间戳 情感识别、事件检测
适用场景 通用语音转录 亚洲语言、多模态

🎯 功能特性

API 服务端

  • ✅ FastAPI 框架,性能优秀
  • ✅ 自动交互式 API 文档
  • ✅ CORS 跨域支持
  • ✅ 完善的错误处理和日志记录
  • ✅ 健康检查和模型状态监控
  • ✅ 多模型支持(Whisper + SenseVoice)
  • ✅ 支持 Base64 音频数据传输

语音处理能力

  • ✅ 支持中英文及多语言识别
  • ✅ 自动噪声抑制和回声消除
  • ✅ 词级时间戳(Whisper)
  • ✅ 情感识别和事件检测(SenseVoice)
  • ✅ 上下文连贯性保持
  • ✅ 自动标点符号添加

🔍 故障排除

常见问题

  1. 模型加载失败

    • 检查模型路径是否正确
    • 确认模型文件完整性
    • 检查GPU内存和磁盘空间
    • 查看启动日志中的详细错误信息
  2. API 连接失败

    • 确认服务已启动(默认端口8000)
    • 检查防火墙和网络设置
    • 验证请求URL格式正确
  3. 转录准确率问题

    • 确保音频质量良好(采样率16kHz以上)
    • 在安静环境下录音
    • 语速适中,发音清晰
    • 尝试不同的模型(whisper vs sensevoice)
  4. 性能优化建议

    • 使用GPU加速(推荐CUDA)
    • 调整CPU线程数(自动优化)
    • 选择合适的模型尺寸

📱 使用技巧

  1. 录音质量:在安静环境下录音效果更佳
  2. 语速控制:适中的语速有助于提高识别准确率
  3. 麦克风权限:首次使用需要授权麦克风权限
  4. 浏览器兼容:推荐使用 Chrome、Firefox 等现代浏览器
  5. 模型选择:根据语言和场景选择合适模型

⚙️ 高级配置

模型参数调优

fastwhisper.py 中可以调整以下参数:

segments, info = self.model.transcribe(
    audio_file_like,
    beam_size=5,                    # 搜索束大小:1-10,越大越准确但越慢
    best_of=5,                      # 候选数量:1-5,提高准确率
    temperature=0.0,                # 生成随机性:0.0为确定性输出
    condition_on_previous_text=True, # 保持上下文连贯性
    word_timestamps=True,           # 启用词级时间戳
    initial_prompt="请包含标点符号。", # 添加提示词指导模型
)

服务配置

whisper_api_service.py 中可以调整:

  • 端口设置:修改默认端口8000
  • CORS策略:限制允许的域名
  • 日志级别:调整详细程度
  • 超时设置:设置请求超时时间

性能优化

  1. 硬件要求

    • GPU:推荐使用NVIDIA GPU(CUDA支持)
    • 内存:至少8GB RAM
    • 磁盘:SSD推荐,模型加载更快
  2. 软件配置

    • CPU线程数自动优化
    • GPU内存管理
    • 模型缓存策略

📊 性能基准测试

模型 音频时长 处理时间 准确率 GPU内存占用
Whisper Medium 30s 1.2s 95% 2.1GB
SenseVoice 30s 0.9s 92% 1.8GB

测试环境:RTX 3080, 16GB RAM


🔒 安全注意事项

  1. 生产环境部署

    • 修改CORS策略,限制允许的域名
    • 添加API认证机制
    • 启用HTTPS
    • 设置请求频率限制
  2. 数据隐私

    • 音频数据仅在内存中处理,不保存到磁盘
    • 建议在安全网络环境中使用
    • 考虑敏感数据的加密传输

📝 更新日志

v2.0.0 (2024-03-xx)

  • ✅ 新增 SenseVoice 模型支持
  • ✅ 多模型架构重构
  • ✅ 完善的API文档
  • ✅ 健康检查和模型状态监控
  • ✅ 错误处理优化

v1.0.0 (2024-02-xx)

  • ✅ 基础 Whisper API 服务
  • ✅ Web 录音测试页面
  • ✅ Base64 音频数据传输

📄 许可证

本项目基于 Apache 2.0 许可证,请遵循相应的开源协议。

🤝 贡献指南

欢迎提交 Issue 和 Pull Request 来改进本项目:

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

❗ Issue

1. 多音字识别错误

现象

  • 例如:郭襄大为惊怒 → 识别为:果香大为惊怒

可能原因

  • 模型对音近字的区分能力有限
  • 缺少上下文语义理解

2. 标点符号断句不准确

现象
标点符号缺失或位置不准确,影响文本可读性

原文示例

郭襄大为惊怒,喝道:"天下还有不许人说话的规矩么?我识得这位大师,我自跟他说话,干你们何事?"那瘦长僧人白眼一翻,说道:"千年以来,少林寺向不许女流擅入。姑娘请下山去罢,免得自讨没趣。"

识别结果示例

果香大为惊怒喝道,天下还有不许人说话的规矩吗,我识得这位大师我自跟他说话干你们何事那寿长僧人白眼一翻说道千年以来少林寺相不许女流善入。姑娘请下山去吧,免得自讨没去...

About

语音转文字

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published