This repository provides access to the main user tooling of ReazonSpeech project.
如果你的设备未安装python3.10,请照此教程安装
如果你在国内,请自行搜索“pip 使用国内镜像源”相关教程
git clone https://github.com/wjz2001/ReazonSpeech
cd ReazonSpeech1.创建虚拟环境
python -m venv venv2.激活虚拟环境
-
Windows (CMD/PowerShell):
.\venv\Scripts\activate -
macOS / Linux (Bash/Zsh):
source venv/bin/activate
- 在根目录下新建 models 文件夹
- 下载模型 model_quantized.onnx
- 下载模型 reazonspeech-nemo-v2.nemo
- 把以上两个模型放入 models 文件夹
- 在已激活虚拟环境的终端中,运行
python install_for_nemoasr.py
-
本模型可仅在 CPU 上运行,如果有 GPU 且支持 cuda 的话会更快
- 如果要在有 cuda 的 GPU 上运行,建议在运行前检查是否安装了对应 cuda 版本的 torch,一般情况下安装脚本会自动处理好
-
确保设备上有能全局使用的ffmpeg,否则无法转换音频/视频为可语音识别的文件
- Windows:
- 从 FFmpeg gyan下载 解压后得到
ffmpeg.exe; - 将下载的
ffmpeg.exe 和 ffprobe.exe文件直接放置在本项目根目录 (与asr.py文件在同一级),程序会自动检测并使用它
- macOS(使用 Homebrew):
brew install ffmpeg
- Linux(Debian/Ubuntu):
sudo apt update && sudo apt install ffmpeg
reazonspeech 文件路径 --zcr --auto_zcr --refine-tail -segment2srt| 参数 | 作用 | 默认值 |
|---|---|---|
--debug |
处理结束后保存语音块,并自动打开语音块保存目录,显示更多日志 | 无 |
--batch-size |
数字越大批量推理的速度越快,不填则自动根据显存估算(只使用 CPU 则默认为 1) | 1 |
--no-remove-punc |
禁止自动剔除句末标点,保留原始识别结果 | 无 |
| 参数 | 作用 | 默认值 |
|---|---|---|
--audio-filter |
添加ffmpeg音频滤镜参数 | highpass=f=60,lowpass=f=8000 |
--limiter-filter |
添加ffmpeg音频滤镜参数,并自动在滤镜链末尾附加 alimiter 限制器 | 无 |
-
--audio-filter和--limiter-filter不能共存 -
即不写
--audio-filter也不写--limiter-filter为不启用任何滤镜,推荐在录音干净时使用
-
写
--audio-filter但不带参数启用默认滤镜:
highpass=f=60,lowpass=f=8000-
highpass=f=60:去掉 60Hz 超低频
-
lowpass=f=8000:压除 8 kHz 以上的高频噪声,同时保留较多辅音高频
-
-
写
--audio-filter "[滤镜链参数]"或写--limiter-filter "[滤镜链参数]"把滤镜链参数原样传给
ffmpeg -af例如:--audio-filter "highpass=f=60,lowpass=f=8000"--limiter-filter "highpass=f=60,lowpass=f=8000"-
--limiter-filter会自动在滤镜链末尾附加alimiter=limit=0.98:level=disabled:attack=5:release=50:latency=1 -
参考:ffmpeg音频滤镜列表
-
| 参数 | 作用 | 默认值 |
|---|---|---|
--no-chunk |
禁止使用 VAD | 无 |
--vad_threshold |
VAD 判断为语音的置信度阈值(0.05-1) | 0.4 |
--vad_end_threshold |
VAD 判断为语音结束后静音的置信度阈值(0.05-1) | vad_threshold的值减去0.15 |
--min_speech_duration_ms |
移除短于此时长(毫秒)的语音块 | 100 |
--min_silence_duration_ms |
短于此时长(毫秒)的语音块不被视为间隔 | 200 |
--keep_silence |
在语音块前后扩展的时长(毫秒) | 300 |
| 参数 | 作用 | 默认值 |
|---|---|---|
--refine-tail |
使用段尾精修 | 无 |
--tail_percentile |
自适应阈值(0-100),值越大越容易将高概率语音区域判为静音 | 20 |
--tail_offset |
在自适应阈值的基础上增加的固定偏移量,值越大越容易将高概率区域语音区域判为静音 | 0.05 |
--tail_energy_percentile |
自适应能量阈值(0-100),通常取 20~40,低于此值则判定为静音 | 30 |
--tail_energy_offset |
在自适应能量阈值基础上增加的固定偏移量,一般为 0,值越大判定标准越宽松 | 0 |
--tail_lookahead_ms |
滞回检查向前看的时长(毫秒),用于确认静音的稳定性,不会马上又回到语音 | 80 |
--tail_safety_margin_ms |
在找到的切点后增加的安全边距(毫秒) | 30 |
--tail_min_keep_ms |
强制保留在段尾的最小时长(毫秒) | 30 |
--tail_zcr_high_ratio |
疑似静音窗口内高于 ZCR 阈值的帧超过此比例时(0.1-0.5),才会判定为清音 | 0.3 |
| 参数 | 作用 | 默认值 |
|---|---|---|
--zcr |
开启过零率检测,防止切断清辅音 | 无 |
--zcr_threshold |
手动设置 ZCR 阈值 | 0.15 |
--auto_zcr |
开启自适应 ZCR 阈值计算,zcr_threshold作为兜底 | 无 |
| 参数 | 作用 | 默认值 |
|---|---|---|
--decoding-strategy |
RNN-T 解码策略,可选 alsd 或 maes |
alsd |
--beam |
设置集束搜索宽度,范围为 4 到 256 之间的整数,更大的值可能更准确但更慢 | 4(maes开启时为 8) |
--maes-num-steps |
必须先开启 MAES,设置 MAES 每个时间步的自适应扩展步数,3、4 精度略有提升,但代价是至少 1.5 倍的识别时间 |
2 |
--maes-expansion-beta |
必须先开启 MAES,设置 MAES 的额外候选数,会和 --beam 一起发挥作用,更大可能更准但更慢 |
2 |
--maes-expansion-gamma |
必须先开启 MAES,设置 MAES 的剪枝阈值,值越小速度越快但精度会下降,值越大精度越高但会消耗更多时间 |
2.30 |
--softmax-temperature |
设置 logits 温度,<1 分布更尖锐,可能对识别模糊发音有帮助;>1 分布更平滑,一般不推荐 |
1.00 |
-
清晰发音/无噪音
- 建议:ALSD + beam=8,此时可提供最高的精确度
-
模糊发音/日常对话
- 建议:MAES + beam=8,质量与 ALSD 相当,但速度快 2 倍
-
歌曲/带伴奏背景
- 建议:MAES + beam=8,不易被伴奏尤其是长段伴奏干扰,并能识别出更多字
-
多说话人/嘈杂背景
- 建议:ALSD + beam=24,可以最大程度防止漏字,极限为 beam=32
-
--maes-num-steps、--maes-expansion-beta、--maes-expansion-gamma、--softmax-temperature一般不必使用,用了也可能没有效果
| 参数 | 作用 |
|---|---|
无 |
直接把完整的识别文本打印至控制台 |
-text |
仅输出完整的识别文本并保存为 .txt 文件 |
-segment |
输出带时间戳的文本片段(Segment)并保存为 .segments.txt 文件 |
-segment2srt |
输出带时间戳的文本片段 (Segment)并转换为 .srt 字幕文件 |
-segment2vtt |
输出带时间戳的文本片段(Segment)并转换为 .vtt 字幕文件 |
-segment2tsv |
输出带时间戳的文本片段(Segment)并转换为由制表符分隔的 .tsv 文件 |
-subword |
输出带时间戳的所有子词 (Subword) 并保存为 .subwords.txt 文件 |
-subword2srt |
输出带时间戳的所有子词 (Subword) 并转换为 .subwords.srt 字幕文件 |
-subword2json |
输出带时间戳的所有子词(Subword)并转换为 .subwords.json 文件 |
-kass |
生成逐字计时的卡拉OK式 .ass 字幕文件 |
- 在终端直接运行命令:
reazonspeech-
启动成功后,服务默认监听端口 8888(如被占用会自动寻找空闲端口)
-
API 地址:
http://127.0.0.1:8888/v1/audio/transcriptions
1.1 启动服务时也可以附加配置参数,这些配置会作为全局默认值应用到每次请求:
reazonspeech --beam 5 --no-chunk- 启动参数只允许使用
--开头的配置参数,不允许使用-text、-segment2srt等输出参数
| 参数名 | 必填 | 说明 |
|---|---|---|
| file | 是 | 上传音频文件或视频文件 |
| model | 否 | 本 API 服务仅支持 ReazonSpeech 模型,所以此参数可写可不写 |
| language | 否 | 本 API 服务仅支持日语,不支持其他语言,所以此参数可写可不写 |
| response_format | 否 | 输出格式(必须二选一): 1. OpenAI 标准格式: text(默认),json,srt,verbose_json,vtt,只能单选2. ReazonSpeech 原始输出参数:如 -text -segment2srt,必须保留开头短横线,多个参数用空格分隔 |
| prompt | 否 | 请求级配置参数,格式与命令行一致,只允许使用 -- 开头的配置参数,不允许使用 -text、-segment2srt 等输出参数 |
| timestamp_granularities | 否 | 仅当 response_format 为 verbose_json 时有效:可选值: segment(段级时间戳),word(单词级时间戳) |
| 其余参数均无效 |
-
接口的
prompt配置参数优先级高,reazonspeechprompt.txt里的配置参数优先级中,启动服务时传入的配置参数优先级低。- 判断优先级的规则是一个参数一个参数地判断,而不是整体判断,优先级高的参数会覆盖优先级低的参数
-
如果你的应用不支持输入或自定义 prompt 提示词,那么你可以在根目录下找到文件
reazonspeechprompt.txt,在其中填写配置参数,格式与接口参数prompt相同,示例如下:- 该情况下视为接口的
prompt配置参数值为无,优先级最低
- 该情况下视为接口的
--beam 5 --no-chunk
-
布尔配置参数可以用对应的
--no_参数名取消,均无默认值-
取消成功的前提是
--no_参数名的优先级高于对应的配置参数 -
如果在 CLI(命令行)模式中使用会立刻报错退出
-
| 参数 | 作用 |
|---|---|
--no_no-remove-punc |
允许删除标点符号 |
--no_audio-filter |
关闭音频滤波器 |
--no_limiter-filter |
关闭限幅滤波器 |
--no_no-chunk |
允许使用 VAD |
--no_refine-tail |
禁用段尾精修 |
--no_zcr |
禁用过零率检测 |
--no_auto_zcr |
禁用自适应 ZCR 阈值计算 |
- OpenAI 标准返回格式
curl -X POST "http://127.0.0.1:8888/v1/audio/transcriptions" \
-F "file=@test.wav" \
-F "prompt=--no-chunk --beam 5" \
-F "response_format=verbose_json" \
-F "timestamp_granularities[]=segment"- ReazonSpeech 原始输出参数,参数之间用空格分隔,不要加逗号
curl -X POST "http://127.0.0.1:8888/v1/audio/transcriptions" \
-F "file=@test.wav" \
-F "prompt=--audio-filter --beam 2" \
-F "response_format=-text -segment2srt"-
确保已安装:
pip install requests -
OpenAI 标准返回格式
import requests
import json
url = "http://127.0.0.1:8888/v1/audio/transcriptions"
file_path = "test.wav"
payload = {
"prompt": "--no-chunk --beam 5",
"response_format": "verbose_json",
"timestamp_granularities[]": ["segment"] # 可选: segment 或 word
}
with open(file_path, "rb") as f:
files = {"file": f}
response = requests.post(url, data=payload, files=files)
# 打印结果
print(response.status_code)
print(json.dumps(response.json(), indent=2, ensure_ascii=False))- ReazonSpeech 原始输出参数,参数之间用空格分隔,不要加逗号
import requests
url = "http://127.0.0.1:8888/v1/audio/transcriptions"
file_path = "test.wav"
payload = {
# 直接写命令行参数风格的字符串,空格分隔
"prompt": "--audio-filter --beam 2",
# 原始输出参数,空格分隔,必须带前面的横线
"response_format": "-text -segment2srt"
}
with open(file_path, "rb") as f:
files = {"file": f}
response = requests.post(url, data=payload, files=files)
# 打印结果
print(response.status_code)
# 返回的是 asr.py 的原始字典数据,不是 OpenAI 格式
data = response.json()
print("Text 内容:", data.get("text"))
print("SRT 内容:\n", data.get("segment2srt"))- Provides a set of tools to evaluate ReazonSpeech models and other speech recognition models.
- Implements a fast, accurate speech recognition based on FastConformer-RNNT.
- The total number of parameters is 619M. Requires Nvidia Nemo.
- Next-gen Kaldi model that is very fast and accurate.
- The total number of parameters is 159M. Requires sherpa-onnx.
- Also contains a bilingual (ja-en) model, which is highly accurate at language detection in bilingual settings of Japanese and English.
- For development: "ja-en-mls-5k" model trained on 5k hours of ReazonSpeech and MLS English data each
- Speech recognition with a Conformer-Transducer model.
- The total number of parameters is 120M. Requires ESPnet.
- Provides a set of tools to analyze Japanese "one-segment" TV stream.
- Use this package to create Japanese audio corpus.
Copyright 2022-2025 Reazon Holdings, inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.