Qwen3-ASR-1.7B流式推理教程:基于vLLM的实时语音转写

手把手教你用vLLM引擎实现低延迟的实时语音识别

1. 引言

实时语音转写正在改变我们的工作方式——从在线会议转录到语音助手交互,再到直播字幕生成。传统的语音识别方案往往需要等待整个音频文件上传完成后才能开始处理,这在实时场景下显然不够用。

Qwen3-ASR-1.7B作为支持52种语言和方言的多语言语音识别模型,不仅识别准确率高,还原生支持流式推理。结合vLLM推理引擎,我们可以构建出低延迟、高并发的实时语音转写系统。

今天我就带你一步步实现基于vLLM的Qwen3-ASR流式推理,让你也能搭建属于自己的实时语音识别服务。

2. 环境准备与快速部署

2.1 系统要求与依赖安装

首先确保你的环境满足以下要求:

  • Python 3.8+
  • CUDA 11.7+(GPU内存建议8GB以上)
  • Linux或WSL2环境(vLLM对Windows支持有限)
# 创建虚拟环境
python -m venv qwen-asr-env
source qwen-asr-env/bin/activate

# 安装核心依赖
pip install torch torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install modelscope qwen-asr[vllm]

2.2 模型下载与配置

Qwen3-ASR模型可以通过ModelScope快速下载:

# 下载1.7B模型
modelscope download Qwen/Qwen3-ASR-1.7B

# 或者下载0.6B轻量版(适合资源受限环境)
modelscope download Qwen/Qwen3-ASR-0.6B

设置环境变量指向模型缓存路径:

echo 'export MODELSCOPE_CACHE=/path/to/your/model/cache' >> ~/.bashrc
source ~/.bashrc

3. 流式推理核心概念

3.1 什么是流式语音识别

流式识别与传统批处理的最大区别在于处理方式:流式识别是"来一点处理一点",就像流水线一样连续不断。这种方式特别适合实时场景,比如语音对话、直播字幕等。

传统方式需要等待整个音频文件,而流式处理可以在说话的同时就开始转写,大大降低了延迟。

3.2 vLLM在流式推理中的优势

vLLM作为高性能推理引擎,在流式场景下有几个明显优势:

  • 内存管理高效:使用PagedAttention技术,显著减少GPU内存占用
  • 推理速度快:优化了注意力机制计算,提升吞吐量
  • 并发支持好:天然支持多路流式推理,适合多用户场景

4. 实现流式语音转写

4.1 初始化流式推理引擎

首先让我们初始化基于vLLM的流式推理引擎:

from qwen_asr import Qwen3ASRModel
import torch

# 初始化流式推理模型
asr_model = Qwen3ASRModel.LLM(
    model="Qwen/Qwen3-ASR-1.7B",  # 或者使用本地路径
    gpu_memory_utilization=0.8,   # GPU内存使用率
    max_new_tokens=32,            # 流式推理时设置较小的值
    dtype=torch.bfloat16          # 使用bfloat16节省内存
)

4.2 音频预处理与分块策略

流式处理的关键是如何切分音频数据。以下是一个实用的音频预处理示例:

import numpy as np
import soundfile as sf
from typing import Tuple

def prepare_audio_chunks(audio_path: str, chunk_size_ms: int = 1000) -> list:
    """
    将音频文件切分成指定大小的块
    chunk_size_ms: 每个块的毫秒数,推荐500-2000ms
    """
    # 读取音频文件
    wav, sample_rate = sf.read(audio_path, dtype="float32")
    
    # 确保单声道
    if len(wav.shape) > 1:
        wav = wav.mean(axis=1)
    
    # 重采样到16kHz(模型要求)
    if sample_rate != 16000:
        wav = resample_audio(wav, sample_rate, 16000)
        sample_rate = 16000
    
    # 计算每个块的样本数
    samples_per_chunk = int(chunk_size_ms * sample_rate / 1000)
    
    # 切分音频
    chunks = []
    for i in range(0, len(wav), samples_per_chunk):
        chunk = wav[i:i + samples_per_chunk]
        if len(chunk) > 0:
            chunks.append(chunk)
    
    return chunks, sample_rate

def resample_audio(wav: np.ndarray, orig_sr: int, target_sr: int) -> np.ndarray:
    """简单的音频重采样函数"""
    duration = len(wav) / orig_sr
    target_length = int(duration * target_sr)
    
    # 线性插值重采样
    x_old = np.linspace(0, duration, len(wav), endpoint=False)
    x_new = np.linspace(0, duration, target_length, endpoint=False)
    
    return np.interp(x_new, x_old, wav).astype(np.float32)

4.3 完整的流式推理示例

现在让我们把这些组合起来,实现完整的流式推理流程:

def run_streaming_transcription(audio_path: str, chunk_size_ms: int = 1000):
    """运行完整的流式转录流程"""
    
    # 准备音频块
    audio_chunks, sample_rate = prepare_audio_chunks(audio_path, chunk_size_ms)
    
    # 初始化流式状态
    streaming_state = asr_model.init_streaming_state(
        unfixed_chunk_num=2,      # 未固定块数量
        unfixed_token_num=5,       # 未固定token数量
        chunk_size_sec=2.0,        # 块大小(秒)
    )
    
    print("开始流式转录...")
    for i, chunk in enumerate(audio_chunks):
        # 进行流式推理
        asr_model.streaming_transcribe(chunk, streaming_state)
        
        # 打印当前结果
        print(f"[块 {i+1:03d}] 识别文本: {streaming_state.text}")
        print(f"          检测语言: {streaming_state.language}")
    
    # 结束流式处理
    asr_model.finish_streaming_transcribe(streaming_state)
    
    print(f"\n最终结果:")
    print(f"完整文本: {streaming_state.text}")
    print(f"最终语言: {streaming_state.language}")

# 使用示例
if __name__ == "__main__":
    run_streaming_transcription("你的音频文件.wav", chunk_size_ms=500)

5. 性能优化技巧

5.1 延迟优化策略

流式推理的延迟主要来自以下几个方面,我们可以针对性地进行优化:

# 优化配置示例
optimized_config = {
    "chunk_size_ms": 500,          # 较小的块大小降低延迟但增加开销
    "max_new_tokens": 16,          # 减少每次生成的token数
    "gpu_memory_utilization": 0.7, # 适当降低内存使用率可能提升速度
    "batch_size": 4,               # 根据GPU能力调整批处理大小
}

5.2 内存管理建议

vLLM虽然内存管理已经很高效,但我们还可以进一步优化:

  • 使用量化版本:如果可用,使用4bit或8bit量化模型
  • 调整内存利用率:根据实际使用情况调整gpu_memory_utilization
  • 及时清理状态:长时间运行后重启服务释放碎片内存

6. 实际应用示例

6.1 实时会议转录

下面是一个简单的实时会议转录示例:

import pyaudio
import numpy as np

class RealTimeTranscriber:
    def __init__(self, chunk_duration_ms=1000):
        self.chunk_duration_ms = chunk_duration_ms
        self.sample_rate = 16000
        self.chunk_size = int(self.sample_rate * chunk_duration_ms / 1000)
        
        # 初始化音频输入
        self.audio = pyaudio.PyAudio()
        self.stream = self.audio.open(
            format=pyaudio.paFloat32,
            channels=1,
            rate=self.sample_rate,
            input=True,
            frames_per_buffer=self.chunk_size
        )
        
        # 初始化ASR模型
        self.asr_model = Qwen3ASRModel.LLM(
            model="Qwen/Qwen3-ASR-0.6B",  # 实时场景用轻量版
            gpu_memory_utilization=0.6,
            max_new_tokens=24
        )
        self.state = self.asr_model.init_streaming_state()
    
    def start_transcription(self):
        print("开始实时转录...(按Ctrl+C停止)")
        try:
            while True:
                # 读取音频数据
                audio_data = np.frombuffer(
                    self.stream.read(self.chunk_size, exception_on_overflow=False),
                    dtype=np.float32
                )
                
                # 流式推理
                self.asr_model.streaming_transcribe(audio_data, self.state)
                
                # 显示最新结果
                print(f"\r当前文本: {self.state.text[-50:]}", end="", flush=True)
                
        except KeyboardInterrupt:
            print("\n停止转录")
            self.asr_model.finish_streaming_transcribe(self.state)
            print(f"最终文本: {self.state.text}")
    
    def cleanup(self):
        self.stream.stop_stream()
        self.stream.close()
        self.audio.terminate()

# 使用示例
transcriber = RealTimeTranscriber()
transcriber.start_transcription()
transcriber.cleanup()

6.2 处理常见问题

在实际使用中可能会遇到的一些问题及解决方法:

音频质量不佳

  • 添加噪声抑制预处理
  • 增加音频增益 normalization

识别准确率下降

  • 调整块大小,太小的块可能缺乏上下文
  • 检查采样率是否为16kHz

内存不足

  • 使用0.6B模型版本
  • 降低gpu_memory_utilization

7. 总结

通过本教程,你应该已经掌握了使用vLLM引擎实现Qwen3-ASR流式推理的核心方法。从环境搭建到实时推理,从性能优化到实际应用,我们覆盖了构建流式语音识别系统的关键环节。

流式推理的真正价值在于其低延迟特性,这让实时语音应用成为可能。无论是会议转录、语音助手还是直播字幕,现在你都有能力基于Qwen3-ASR构建出实用的解决方案。

在实际项目中,记得根据具体需求调整参数——对延迟敏感的应用使用更小的块大小,对准确性要求高的场景可以适当增加上下文窗口。多测试、多调整,找到最适合你场景的配置。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐