You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Huggingface西班牙语语音识别模型时内核崩溃求助

问题分析

内核崩溃的核心原因大概率是内存泄漏/内存过载,结合你的场景,主要诱因包括:模型本身参数规模大、音频采样率与模型要求不匹配(44kHz转16kHz的实时重采样占用额外内存)、循环推理时未及时释放资源,导致内存持续累积直至内核崩溃。

解决方案

1. 提前统一音频采样率

模型推荐16kHz采样率,实时转码会额外消耗内存,建议批量将所有MP3转成16kHz单声道音频:

  • 用ffmpeg批量处理(效率最高):
    # 批量转换脚本(Linux/macOS)
    for file in ../data/raw/audio_files/*.mp3; do
        ffmpeg -i "$file" -ar 16000 -ac 1 "${file%.mp3}_16k.wav"
    done
    
  • 若用Python脚本处理:
    import librosa
    import soundfile as sf
    import os
    
    root_dir = os.path.join("..", "data", "raw", "audio_files")
    output_dir = os.path.join("..", "data", "processed", "audio_16k")
    os.makedirs(output_dir, exist_ok=True)
    
    for file in os.listdir(root_dir):
        if file.endswith(".mp3"):
            file_path = os.path.join(root_dir, file)
            audio, _ = librosa.load(file_path, sr=16000, mono=True)
            output_path = os.path.join(output_dir, f"{os.path.splitext(file)[0]}.wav")
            sf.write(output_path, audio, 16000)
    

2. 优化循环推理的内存管理

在循环中强制释放未使用的资源,避免内存泄漏:

from huggingsound import SpeechRecognitionModel
import gc
import torch
import os

model = SpeechRecognitionModel("jonatasgrosman/wav2vec2-large-xlsr-53-spanish")

root_dir = os.path.join("..", "data", "processed", "audio_16k")
file_paths = [os.path.join(root_dir, f) for f in os.listdir(root_dir) if f.endswith(".wav")]

transcriptions = []
for file_path in file_paths:
    transcript = model.transcribe([file_path])
    transcriptions.append(transcript)
    # 强制清理内存
    gc.collect()
    if torch.cuda.is_available():
        torch.cuda.empty_cache()

3. 分批次处理并实时保存结果

避免一次性保存所有结果到内存,分批次处理并写入磁盘,即使中途崩溃也不会丢失全部数据:

import json

batch_size = 10
save_dir = "./transcripts_batches"
os.makedirs(save_dir, exist_ok=True)

for i in range(0, len(file_paths), batch_size):
    batch_files = file_paths[i:i+batch_size]
    batch_transcripts = model.transcribe(batch_files)
    # 保存批次结果
    with open(f"{save_dir}/batch_{i//batch_size}.json", "w", encoding="utf-8") as f:
        json.dump(batch_transcripts, f, ensure_ascii=False)
    # 清理内存
    gc.collect()
    if torch.cuda.is_available():
        torch.cuda.empty_cache()

4. 升级huggingsound到最新版本

旧版本可能存在内存泄漏bug,运行以下命令升级:

pip install --upgrade huggingsound

5. 改用transformers直接调用(更精细控制内存)

如果huggingsound的封装导致内存无法有效释放,直接用transformers库实现推理:

from transformers import pipeline
import librosa
import gc
import torch

asr_pipeline = pipeline(
    "automatic-speech-recognition",
    model="jonatasgrosman/wav2vec2-large-xlsr-53-spanish",
    device=0 if torch.cuda.is_available() else -1
)

transcriptions = []
for file_path in file_paths:
    audio, _ = librosa.load(file_path, sr=16000)
    result = asr_pipeline(audio)
    transcriptions.append({"file": file_path, "text": result["text"]})
    # 手动删除变量释放内存
    del audio, result
    gc.collect()
    if torch.cuda.is_available():
        torch.cuda.empty_cache()

6. 启用模型量化(资源有限时)

若GPU显存不足,启用模型量化降低内存占用:

from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
import librosa
import torch

processor = Wav2Vec2Processor.from_pretrained("jonatasgrosman/wav2vec2-large-xlsr-53-spanish")
# 启用INT8量化
model = Wav2Vec2ForCTC.from_pretrained(
    "jonatasgrosman/wav2vec2-large-xlsr-53-spanish",
    load_in_8bit=True,
    device_map="auto"
)

for file_path in file_paths:
    audio, _ = librosa.load(file_path, sr=16000)
    inputs = processor(audio, sampling_rate=16000, return_tensors="pt").to("cuda")
    with torch.no_grad():
        logits = model(**inputs).logits
    predicted_ids = torch.argmax(logits, dim=-1)
    transcript = processor.decode(predicted_ids[0])
    transcriptions.append({"file": file_path, "text": transcript})
    del audio, inputs, logits, predicted_ids
    gc.collect()
    torch.cuda.empty_cache()

内容的提问来源于stack exchange,提问作者Alberto Agudo Dominguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:39:28