使用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
相关产品推荐
相关产品推荐

