Checkpoint current transcription pipeline state

This commit is contained in:
Adolfo Reyna
2026-03-16 21:11:51 -04:00
parent 50f58dbc22
commit ffeb996d7e
5 changed files with 68 additions and 31 deletions
+1
View File
@@ -19,6 +19,7 @@
"post_correct_llm": false, "post_correct_llm": false,
"post_correct_model": "qwen:2b", "post_correct_model": "qwen:2b",
"llm_paragraph": false, "llm_paragraph": false,
"only_translate_llm": false,
"temperature_fallback": [0.0, 0.2, 0.4, 0.6, 0.8, 1.0], "temperature_fallback": [0.0, 0.2, 0.4, 0.6, 0.8, 1.0],
"logprob_threshold": -0.8, "logprob_threshold": -0.8,
"compression_threshold": 2.2, "compression_threshold": 2.2,
+30 -12
View File
@@ -57,18 +57,36 @@ def run_distribution(in_queue, args):
log_debug(lang_msg) log_debug(lang_msg)
if args.ingest: if args.ingest:
delay, max_delay, success = 1, 15, False # Flat JSON Schema: Keep only what's needed for the server
while not success: ingest_payload = {
try: "original": payload.get("original"),
response = requests.post(INGEST_URL, json=payload, timeout=5) "speaker": payload.get("speaker"),
if response.status_code == 200: success = True "ts": payload.get("ts")
else: print(f"[Distribute Error] {response.status_code}. Retrying...") }
except Exception as e: has_any_translation = False
print(f"[Distribute Error] {e}. Retrying...") for lang in ["es", "fr", "ar", "en"]:
if payload.get(lang):
if not success: ingest_payload[lang] = payload[lang]
time.sleep(delay) has_any_translation = True
delay = min(delay * 2, max_delay)
# If only-translate-llm is on, ONLY send when we have a translation (paragraph-level)
should_send = True
if getattr(args, "only_translate_llm", False) and not has_any_translation:
should_send = False
if should_send:
delay, max_delay, success = 1, 15, False
while not success:
try:
response = requests.post(INGEST_URL, json=ingest_payload, timeout=5)
if response.status_code == 200: success = True
else: print(f"[Distribute Error] {response.status_code}. Retrying...")
except Exception as e:
print(f"[Distribute Error] {e}. Retrying...")
if not success:
time.sleep(delay)
delay = min(delay * 2, max_delay)
except Exception as e: except Exception as e:
print(f"[Distribute] Error: {e}") print(f"[Distribute] Error: {e}")
+22 -16
View File
@@ -77,23 +77,29 @@ def run_translation(in_queue, out_queue, args):
"speaker": item.get("speaker"), "speaker": item.get("speaker"),
"ts": item.get("ts", time.time()) "ts": item.get("ts", time.time())
} }
if args.en: payload["en"] = corrected_text or raw_text
if args.only_translate_llm:
text_to_translate = paragraph_text
if args.en and paragraph_text:
payload["en"] = paragraph_text
else:
text_to_translate = paragraph_text or corrected_text or raw_text
if args.en:
payload["en"] = corrected_text or raw_text
text_to_translate = paragraph_text or corrected_text or raw_text if text_to_translate and translation_engines:
if text_to_translate: for lang_key, (model, tokenizer) in translation_engines.items():
if translation_engines: chunks = split_text_for_translation(text_to_translate, args.mt_max_chars)
for lang_key, (model, tokenizer) in translation_engines.items(): translated_parts = []
chunks = split_text_for_translation(text_to_translate, args.mt_max_chars) for chunk in chunks:
translated_parts = [] inputs = tokenizer(chunk, return_tensors="pt", padding=True).to(device)
for chunk in chunks: with torch.no_grad():
inputs = tokenizer(chunk, return_tensors="pt", padding=True).to(device) translated_tokens = model.generate(**inputs, max_new_tokens=args.mt_max_new_tokens, num_beams=args.mt_num_beams)
with torch.no_grad(): translated_parts.append(tokenizer.decode(translated_tokens[0], skip_special_tokens=True).strip())
translated_tokens = model.generate(**inputs, max_new_tokens=args.mt_max_new_tokens, num_beams=args.mt_num_beams) payload[lang_key] = " ".join(translated_parts)
translated_parts.append(tokenizer.decode(translated_tokens[0], skip_special_tokens=True).strip())
payload[lang_key] = " ".join(translated_parts) # ALWAYS put in queue, even if no translations were done
out_queue.put(payload)
# ALWAYS put in queue, even if no translations were done
out_queue.put(payload)
except Exception as e: print(f"[Translate] Error: {e}") except Exception as e: print(f"[Translate] Error: {e}")
if __name__ == "__main__": if __name__ == "__main__":
+8
View File
@@ -57,6 +57,7 @@ def main():
parser.add_argument("-fr", action="store_true", default=defaults.get("fr", False)) parser.add_argument("-fr", action="store_true", default=defaults.get("fr", False))
parser.add_argument("-ar", action="store_true", default=defaults.get("ar", False)) parser.add_argument("-ar", action="store_true", default=defaults.get("ar", False))
parser.add_argument("-en", action="store_true", default=defaults.get("en", False)) parser.add_argument("-en", action="store_true", default=defaults.get("en", False))
parser.add_argument("--only-translate-llm", action="store_true", default=defaults.get("only_translate_llm", False), help="Only translate when the LLM produces a refined paragraph.")
parser.add_argument("--mt-max-chars", type=int, default=defaults.get("mt_max_chars", 250)) parser.add_argument("--mt-max-chars", type=int, default=defaults.get("mt_max_chars", 250))
parser.add_argument("--mt-max-new-tokens", type=int, default=defaults.get("mt_max_new_tokens", 150)) parser.add_argument("--mt-max-new-tokens", type=int, default=defaults.get("mt_max_new_tokens", 150))
parser.add_argument("--mt-num-beams", type=int, default=defaults.get("mt_num_beams", 4)) parser.add_argument("--mt-num-beams", type=int, default=defaults.get("mt_num_beams", 4))
@@ -66,6 +67,13 @@ def main():
args = parser.parse_args() args = parser.parse_args()
# Auto-enable required flags
if args.post_correct_llm and not args.post_correct:
args.post_correct = True
if args.only_translate_llm and not args.llm_paragraph:
print("[Main] Enabling --llm-paragraph because --only-translate-llm was requested.")
args.llm_paragraph = True
# Handle device listing # Handle device listing
if args.list_devices: if args.list_devices:
list_audio_devices() list_audio_devices()
+7 -3
View File
@@ -610,6 +610,7 @@ def main():
parser.add_argument("--mt-max-chars", type=int, default=250, help="Max chars per translation chunk before sentence-aware splitting (default: 250)") parser.add_argument("--mt-max-chars", type=int, default=250, help="Max chars per translation chunk before sentence-aware splitting (default: 250)")
parser.add_argument("--mt-max-new-tokens", type=int, default=150, help="Max new tokens per translation chunk (default: 150)") parser.add_argument("--mt-max-new-tokens", type=int, default=150, help="Max new tokens per translation chunk (default: 150)")
parser.add_argument("--mt-num-beams", type=int, default=4, help="Beam size for Marian translation generation (default: 4)") parser.add_argument("--mt-num-beams", type=int, default=4, help="Beam size for Marian translation generation (default: 4)")
parser.add_argument("--only-translate-llm", action="store_true", help="Only translate into target languages when a refined LLM paragraph is available.")
parser.add_argument("--mt-no-repeat-ngram-size", type=int, default=3, help="No-repeat n-gram size for Marian generation (default: 3)") parser.add_argument("--mt-no-repeat-ngram-size", type=int, default=3, help="No-repeat n-gram size for Marian generation (default: 3)")
parser.add_argument("--mt-length-penalty", type=float, default=1.0, help="Length penalty for Marian generation (default: 1.0)") parser.add_argument("--mt-length-penalty", type=float, default=1.0, help="Length penalty for Marian generation (default: 1.0)")
parser.add_argument("--mt-repetition-penalty", type=float, default=1.05, help="Repetition penalty for Marian generation (default: 1.05)") parser.add_argument("--mt-repetition-penalty", type=float, default=1.05, help="Repetition penalty for Marian generation (default: 1.05)")
@@ -648,6 +649,10 @@ def main():
args.post_correct = True args.post_correct = True
print("[SYSTEM]: Enabling --post-correct because --post-correct-llm was requested.") print("[SYSTEM]: Enabling --post-correct because --post-correct-llm was requested.")
log_session("[SYSTEM]: Enabling --post-correct because --post-correct-llm was requested.") log_session("[SYSTEM]: Enabling --post-correct because --post-correct-llm was requested.")
if args.only_translate_llm and not args.llm_paragraph:
args.llm_paragraph = True
print("[SYSTEM]: Enabling --llm-paragraph because --only-translate-llm was requested.")
log_session("[SYSTEM]: Enabling --llm-paragraph because --only-translate-llm was requested.")
file_glossary_pairs = load_glossary_file(args.glossary_file) file_glossary_pairs = load_glossary_file(args.glossary_file)
merged_glossary_pairs = file_glossary_pairs + args.glossary_pair merged_glossary_pairs = file_glossary_pairs + args.glossary_pair
if file_glossary_pairs: if file_glossary_pairs:
@@ -1064,9 +1069,8 @@ def main():
rolling_context = (rolling_context + " " + original_text)[-200:].strip() rolling_context = (rolling_context + " " + original_text)[-200:].strip()
# 3. Translate from English to other languages # 3. Translate from English to other languages
if not args.llm_paragraph and english_for_translation and translation_engines: if not args.llm_paragraph and not args.only_translate_llm and english_for_translation and translation_engines:
english_chunks = split_text_for_translation(english_for_translation, max_chars=args.mt_max_chars) english_chunks = split_text_for_translation(english_for_translation, max_chars=args.mt_max_chars)
for lang_key, (model, tokenizer) in translation_engines.items(): for lang_key, (model, tokenizer) in translation_engines.items():
# Skip if we already filled this (e.g. detected lang was 'es') # Skip if we already filled this (e.g. detected lang was 'es')
if lang_key in payload: if lang_key in payload: