Я пытаюсь получить временные метки для аудио/текста. Например:
Код: Выделить всё
1
00:02:16,612 --> 00:02:19,376
Senator, we're making
our final approach into Coruscant.
2
00:02:19,482 --> 00:02:21,609
Very good, Lieutenant.
После моего исследования я узнал, что эта проблема называется «Принудительное выравнивание». Существуют инструменты, которые помогают решить эту проблему, например, Montreal Force Aligner (mfa). Однако они не поддерживают язык идиш.
Лучшим средством выравнивания, которое я нашел, был ctc-forced-aligner. Однако у меня возникала проблема со смещением, а это означает, что в некоторых выровненных абзацах звук/текст немного отклонялся — звук немного опережал текст.
- Как исправить проблему смещения?
- Есть ли лучший способ справиться с принудительным выравниванием для идиша?
Код: Выделить всё
#!/usr/bin/env python3
import argparse
import json
import logging
import re
import sys
from pathlib import Path
import numpy as np
import torch
import librosa
from tqdm import tqdm
# --- 1. Imports for CTC Forced Aligner ---
try:
from ctc_forced_aligner import (
load_alignment_model,
generate_emissions,
preprocess_text,
get_alignments,
get_spans,
postprocess_results
)
except ImportError:
print("Error: ctc_forced_aligner not found. Run: pip install ctc-forced-aligner")
sys.exit(1)
logging.basicConfig(level=logging.INFO, format="%(asctime)s │ %(levelname)-7s │ %(message)s")
logger = logging.getLogger("yid_hybrid_final")
def norm_token(t: str) -> str:
if not t: return ""
t = re.sub(r"[\u0591-\u05C7]", "", t.strip().lower())
t = t.replace("״", '"').replace("׳", "'")
return re.sub(r"[^\w\u0590-\u05FF]+", "", t)
# --- 2. VAD Logic ---
def get_vad_segments(audio, sr):
"""Detects speech energy to act as a 'mask' for CTC peaks."""
model, utils = torch.hub.load(repo_or_dir='snakers4/silero-vad', model='silero_vad', trust_repo=True)
(get_speech_timestamps, _, _, _, _) = utils
wav = torch.from_numpy(audio).float()
speech_timestamps = get_speech_timestamps(wav, model, sampling_rate=sr, threshold=0.35)
return [(ts['start'] / sr, ts['end'] / sr) for ts in speech_timestamps]
def snap_to_vad(words, vad_segments):
"""Enforces that words must exist within VAD-detected speech blocks."""
refined = []
for w in words:
w_mid = (w["start"] + w["end"]) / 2
best_seg = next((s for s in vad_segments if s[0]
Подробнее здесь: [url]https://stackoverflow.com/questions/79875656/how-can-i-force-align-audio-with-its-corresponding-text-in-order-to-get-timestam[/url]
Мобильная версия