sr-client 是一个基于 Rust 开发的高性能语音识别客户端工具,用于与 sr-server 后端服务进行交互。支持单个音频文件转文字、批量音频文件转文字、实时流式音频转文字以及 Shell 自动补全脚本生成功能。
- 高性能: 使用 Rust 编写,内存安全且执行效率高
- 跨平台支持: 完美支持 Linux、Windows、macOS 等操作系统
- 异步优化: 采用异步文件操作,避免阻塞运行时,提升处理效率
- 并发处理: 批量处理支持多文件并发上传,提高处理速度
- 流式识别: 支持实时音频数据流传输和实时转录
- 多种模式: 提供单文件、批量处理、流式和自动补全四种工作模式
- WebSocket 支持: 使用 WebSocket 协议实现实时语音识别
- Shell 自动补全: 支持生成多种 Shell 环境的命令自动补全脚本
- 灵活配置: 支持配置文件和命令行参数
- 用户友好: 集成彩色输出和实时进度条显示,进度条样式美观(未完成时为橙色,完成后为绿色),提升用户体验
- 代码规范: 代码风格符合 Rust 行业标准,使用 cargo fmt 和 clippy 优化
- 模块化架构: 代码已重构为多个模块,提高可维护性和可读性
- 完善的错误处理: 使用
thiserror实现自定义错误类型
- Rust 1.70+ 环境
- 与 sr-server 后端服务正常通信的网络环境
# 克隆项目
git clone <repository-url>
# 进入项目目录
cd sr-client
# 构建项目
cargo build --release
# 或直接运行
cargo run -- [参数]# 生成 bash 自动补全脚本
cargo run -- generate-completions --shell bash
# 生成 zsh 自动补全脚本
cargo run -- generate-completions --shell zsh# 实时转录音频文件
cargo run -- --server-url http://localhost:8000 stream ./assets/asr_example_en.wav# 转录单个音频文件
cargo run -- --server-url http://localhost:8000 single input.wav output.txt# 批量处理多个音频文件
cargo run -- --server-url http://localhost:8000 batch --inputs input1.wav input2.wav --outputs output1.txt output2.txtsr-client [OPTIONS] [COMMAND]全局选项:
--server-url <SERVER_URL>: 设置服务器地址(默认: http://localhost:8000)--create-config: 创建默认配置文件-h, --help: 显示帮助信息-V, --version: 显示版本信息
generate-completions:
- 生成 Shell 自动补全脚本
- 用法:
sr-client generate-completions --shell <SHELL_TYPE> - 支持的 Shell: bash, zsh, fish, powershell, elvish
single:
- 处理单个音频文件转录
- 用法:
sr-client single <INPUT_FILE> <OUTPUT_FILE> [OPTIONS]
batch:
- 批量处理多个音频文件
- 用法:
sr-client batch --inputs <INPUTS>... --outputs <OUTPUTS>... [OPTIONS]
stream:
- 实时流式音频转录
- 用法:
sr-client stream <SOURCE> [OPTIONS]
--language <LANGUAGE>: 指定音频语言(例如 zh, en, ja),None 表示自动检测--task <TASK>: 任务类型:转录(transcribe)或翻译(translate),默认为转录--temperature <TEMPERATURE>: 采样温度,控制生成结果的随机性,默认为 0.0
--inputs <INPUTS>...: 输入音频文件列表,至少需要一个文件--outputs <OUTPUTS>...: 对应的输出文本文件列表,数量必须与输入文件数量一致--language <LANGUAGE>: 指定音频语言(例如 zh, en, ja),None 表示自动检测--task <TASK>: 任务类型:转录(transcribe)或翻译(translate),默认为转录--temperature <TEMPERATURE>: 采样温度,控制生成结果的随机性,默认为 0.0
--language <LANGUAGE>: 指定音频语言(例如 zh, en, ja),None 表示自动检测--task <TASK>: 任务类型:转录(transcribe)或翻译(translate),默认为转录
使用以下命令创建默认配置文件:
sr-client --create-config配置文件位于:
- Linux:
~/.config/sr-client/config.toml - macOS:
~/Library/Application Support/sr-client/config.toml - Windows:
%APPDATA%\sr-client\config.toml
配置文件内容示例:
server_url = "http://localhost:8000"
default_language = null
default_task = "transcribe"
default_temperature = 0.0- WAV
- MP3
- FLAC
- M4A
- AAC
- OPUS
| 功能 | 传输方式 | 结果获取 | 适用场景 | 用户体验 |
|---|---|---|---|---|
| single | 一次性上传完整音频文件 | 通过任务ID查询进度并获取结果 | 单个完整音频文件处理 | 彩色输出,实时进度条显示(橙色/绿色) |
| batch | 批量上传多个文件 | 通过任务ID查询进度并获取结果 | 批量处理多个音频文件 | 彩色输出,进度条显示处理进度和ETA |
| stream | 流式分块上传音频数据 | 实时获取部分转录结果 | 实时语音识别、长音频流处理 | 彩色输出,实时显示转录结果 |
| generate-completions | 本地生成脚本 | 直接输出到标准输出 | 命令行工具使用 | 彩色输出,生成各种Shell的补全脚本 |
项目经过以下用户界面优化:
-
彩色输出:
- 使用
coloredcrate 实现彩色终端输出 - 错误信息用红色显示
- 成功信息用绿色显示
- 进度信息用黄色/蓝色显示
- 使用
-
进度指示:
- 单文件处理:显示实时进度条(橙色未完成,绿色完成)
- 批量处理:显示带进度条的处理状态,包括已完成/总数和预计完成时间
- 流式处理:显示音频数据传输进度
- 进度条样式更优美,纤细连续
-
优化的信息显示:
- 移除表情符号,使用纯文本提供清晰的状态信息
- 过程中的状态更新
- 集成服务器端进度查询API,显示真实的转录进度
-
错误处理:
- 清晰的错误信息显示
- 过程中的状态更新
[dependencies]
clap = { version = "4.0", features = ["derive"] } # 命令行参数解析
clap_complete = "4.0" # Shell自动补全脚本生成
reqwest = { version = "0.11", features = ["json", "multipart"] } # HTTP客户端
tokio = { version = "1.0", features = ["full"] } # 异步运行时
serde = { version = "1.0", features = ["derive"] } # 序列化/反序列化
serde_json = "1.0" # JSON处理
thiserror = "1.0" # 自定义错误类型
toml = "0.8" # TOML配置文件处理
tokio-tungstenite = "0.20" # WebSocket支持
futures-util = { version = "0.3", default-features = false, features = ["std"] } # 异步流处理
dirs = "5.0" # 获取标准目录路径
colored = "2.0" # 美化输出颜色
indicatif = "0.17" # 进度条显示项目架构:
src/main.rs: 程序入口点src/lib.rs: 模块声明src/api/mod.rs: API请求和响应处理src/cli/mod.rs: 命令行界面逻辑src/config/mod.rs: 配置管理src/errors/mod.rs: 自定义错误类型src/utils/mod.rs: 工具函数(如流式处理)
主要特性:
- 跨平台兼容性: 使用
dirscrate 处理配置文件路径,确保在不同操作系统上行为一致 - 异步设计: 使用
tokio运行时处理所有网络请求和文件操作 - 错误处理: 使用
thiserror实现全面的错误处理机制 - 模块化设计: 代码按功能分解为多个模块,提高可维护性
运行测试:
cargo test构建项目:
cargo buildMIT License