Как я могу принудительно выровнять звук по соответствующему тексту, чтобы получить временные метки?Python

Программы на Python
Ответить
Anonymous
 Как я могу принудительно выровнять звук по соответствующему тексту, чтобы получить временные метки?

Сообщение Anonymous »

У меня есть файлы аудиозаписей и текстовые расшифровки. Оба написаны на идиш.
Я пытаюсь получить временные метки для аудио/текста. Например:

Код: Выделить всё

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.
Здесь мы можем увидеть, что было сказано на секунде X аудио, что затем можно использовать в приложении караоке для перехода к любой секунде аудио и просмотра соответствующего текста.
После моего исследования я узнал, что эта проблема называется «Принудительное выравнивание». Существуют инструменты, которые помогают решить эту проблему, например, 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»