# whisper-server
**Repository Path**: openminds/whisper-server
## Basic Information
- **Project Name**: whisper-server
- **Description**: 基于 OpenAI Whisper 的语音转文字服务,提供与 OpenAI API 兼容的接口。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-14
- **Last Updated**: 2026-07-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: whisper, FastAPI
## README
# Whisper Speech-to-Text Server
基于 OpenAI Whisper 的语音转文字服务,提供与 OpenAI API 兼容的接口。
## 特性
- ✅ 支持多种语音格式(通过 FFmpeg 转换)
- ✅ 支持多种输出格式(JSON、文本、SRT、VTT)
- ✅ 支持语音翻译(其他语言 → 英语)
- ✅ OpenAI API 兼容接口
- ✅ 支持多种 Whisper 模型(tiny / base / small / medium / large)
- ✅ 健康检查端点
- ✅ 模型预加载机制
## 系统架构
```mermaid
flowchart TB
subgraph Client["客户端"]
A[HTTP 请求]
end
subgraph FastAPI["FastAPI Server (Port 9000)"]
B1["/health
健康检查"]
B2["/v1/models
列出可用模型"]
B3["/v1/audio/transcriptions
语音转文字"]
B4["/v1/audio/translations
语音翻译"]
end
subgraph Processing["处理层"]
C1["FFmpeg
音频格式转换"]
C2["音频预处理
采样率 16kHz"]
end
subgraph Model["Whisper 模型"]
D[("tiny / base / small / medium / large")]
end
subgraph Output["输出格式"]
E1["JSON"]
E2["Text"]
E3["SRT"]
E4["VTT"]
E5["Verbose JSON"]
end
A --> B1
A --> B2
A --> B3
A --> B4
B3 --> C1
B4 --> C1
C1 --> C2
C2 --> D
D --> E1
D --> E2
D --> E3
D --> E4
D --> E5
```
## 安装
### 前置依赖
- Python >= 3.10
- [uv](https://github.com/astral-sh/uv) - Python 包管理器
- [FFmpeg](https://ffmpeg.org/) - 用于音频格式转换
### 使用 uv 安装
```bash
# 克隆项目
git clone
cd my-whisper
# 创建虚拟环境并安装依赖(自动启用脚本命令)
uv sync
```
## 运行
### 启动服务
```bash
# 方式一:使用脚本命令(推荐)
uv run whisper-server
# 方式二:直接运行 Python 文件
uv run python whisper_server.py
# 方式三:使用 uvicorn
uv run uvicorn whisper_server:app --host 0.0.0.0 --port 9000
```
服务启动后访问: http://localhost:9000
**注意**:服务启动时会自动预加载默认模型(`small`),首次加载可能需要几秒钟。
### 模型选择
默认使用 `small` 模型。可以通过以下方式选择模型:
**方式一:修改代码默认模型**
编辑 `whisper_server.py` 中的 `_model_name` 变量:
```python
_model_name = "medium" # tiny, base, small, medium, large
```
**方式二:请求时指定模型**
调用 API 时通过 `model` 参数动态指定模型:
```bash
curl -X POST http://localhost:9000/v1/audio/transcriptions \
-F "file=@test.wav" \
-F "model=medium"
```
> **说明**:当 `model` 参数为 `whisper-1`(默认值)时,使用服务器当前加载的模型;其他值会直接传递给 Whisper 加载对应的模型。
## API 接口
| 端点 | 方法 | 描述 |
|------|------|------|
| `/health` | GET | 健康检查 |
| `/v1/models` | GET | 列出可用模型 |
| `/v1/audio/transcriptions` | POST | 语音转文字 |
| `/v1/audio/translations` | POST | 语音翻译(→ 英语) |
### 健康检查
```bash
curl http://localhost:9000/health
```
**响应状态**:
| 状态码 | 响应 | 说明 |
|--------|------|------|
| 200 | `{"status": "ok"}` | 服务正常 |
| 503 | `{"status": "loading model"}` | 模型加载中 |
| 503 | `{"status": "not ready"}` | 服务未就绪 |
### 列出模型
```bash
curl http://localhost:9000/v1/models
```
响应示例:
```json
{
"data": [
{"id": "tiny", "object": "model", "owned_by": "openai", "permission": []},
{"id": "base", "object": "model", "owned_by": "openai", "permission": []},
{"id": "small", "object": "model", "owned_by": "openai", "permission": []},
{"id": "medium", "object": "model", "owned_by": "openai", "permission": []},
{"id": "large", "object": "model", "owned_by": "openai", "permission": []}
],
"object": "list"
}
```
### 语音转文字
```bash
curl -X POST http://localhost:9000/v1/audio/transcriptions \
-F "file=@test.wav" \
-F "model=whisper-1" \
-F "language=zh" \
-F "response_format=json"
```
**参数说明**:
| 参数 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `file` | File | 必填 | 音频文件 |
| `model` | String | whisper-1 | 模型名称(`whisper-1` 使用默认模型,其他值直接传递给 Whisper) |
| `language` | String | None | 语言代码(如 zh, en, ja),自动检测时设为 None |
| `prompt` | String | None | 提示文本,用于引导模型识别 |
| `response_format` | String | json | 输出格式(json, text, srt, vtt, verbose_json) |
| `temperature` | Float | 0.0 | 温度参数,控制输出随机性 |
| `translate` | Boolean | false | 是否翻译为英语 |
**响应示例(JSON)**:
```json
{"text": "你好,这是一段测试语音。"}
```
**响应示例(SRT)**:
```
1
00:00:00,000 --> 00:00:02,500
你好,这是一段测试语音。
```
**响应示例(Verbose JSON)**:
```json
{
"text": "你好,这是一段测试语音。",
"segments": [
{
"id": 0,
"start": 0.0,
"end": 2.5,
"text": "你好,这是一段测试语音。",
"tokens": [50364, 2527, 2500, 42, 1746, 2523, 372, 445, 6965, 2500],
"temperature": 0.0,
"avg_logprob": -0.3,
"compression_ratio": 1.2,
"no_speech_prob": 0.01
}
],
"language": "zh"
}
```
### 语音翻译
将其他语言翻译成英语。
```bash
curl -X POST http://localhost:9000/v1/audio/translations \
-F "file=@test.wav" \
-F "model=whisper-1"
```
**参数说明**:
| 参数 | 类型 | 默认值 | 描述 |
|------|------|--------|------|
| `file` | File | 必填 | 音频文件 |
| `model` | String | whisper-1 | 模型名称 |
| `prompt` | String | None | 提示文本 |
| `response_format` | String | json | 输出格式 |
| `temperature` | Float | 0.0 | 温度参数 |
> **注意**:翻译接口不支持 `language` 参数,语言会自动检测。
## 支持的语言
| 语言代码 | 语言 |
|----------|------|
| zh | 中文 |
| en | 英语 |
| ja | 日语 |
| ko | 韩语 |
| fr | 法语 |
| de | 德语 |
| es | 西班牙语 |
| ru | 俄语 |
更多语言请参考 [Whisper 官方文档](https://github.com/openai/whisper)。
## 支持的输出格式
| 格式 | 描述 |
|------|------|
| json | 返回包含文本的 JSON 对象 |
| text | 返回纯文本 |
| srt | 返回 SRT 字幕格式 |
| vtt | 返回 WebVTT 字幕格式 |
| verbose_json | 返回包含详细信息的 JSON(文本、分段、语言) |
## 测试
项目包含 `test.wav` 测试文件,可用于验证服务:
```bash
curl -X POST http://localhost:9000/v1/audio/transcriptions \
-F "file=@test.wav" \
-F "response_format=text"
```
## 项目结构
```
my-whisper/
├── whisper_server.py # 主服务文件
├── pyproject.toml # 项目配置(含构建系统与脚本定义)
├── uv.lock # 依赖锁文件
├── test.wav # 测试音频
└── .venv/ # 虚拟环境
```
## 项目配置
`pyproject.toml` 关键配置说明:
```toml
[project]
name = "whisper-server"
version = "1.0.0"
dependencies = [
"fastapi>=0.110.0",
"uvicorn>=0.24.0",
"openai-whisper>=20231117",
"torch>=2.1.0",
"python-multipart>=0.0.32",
]
[[tool.uv.index]]
url = "https://uv.agentsmirror.com/pypi/simple"
default = true
[tool.uv]
package = true # 启用包模式以支持 entry points
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project.scripts]
whisper-server = "whisper_server:main" # 命令行入口
```
## 与 hwdsl2/whisper-server 的兼容性
本服务提供与 `hwdsl2/whisper-server:latest` Docker 镜像兼容的 API 接口,支持相同的端点和参数格式。
## 许可证
MIT License