feat: implement heuristic punctuation buffering for translations when context is enabled

This commit is contained in:
Adolfo Reyna
2026-02-28 19:36:47 -05:00
parent ce4809a2b7
commit 8b88df8b17
+39 -13
View File
@@ -150,6 +150,8 @@ def main():
speech_started = False
last_stream_time = time.time()
rolling_context = ""
translation_buffer_orig = ""
translation_buffer_en = ""
try:
with sd.InputStream(samplerate=SAMPLERATE, channels=CHANNELS, callback=callback, blocksize=BLOCK_SIZE, device=device_index):
@@ -196,13 +198,6 @@ def main():
if original_text:
print(f"\n[{detected_lang.upper()}]: {original_text}")
# Prepare payload
payload = {"original": original_text}
# Include detected language if requested or if it's the bridge
if (detected_lang in active_target_langs) or (detected_lang == "en" and args.en):
payload[detected_lang] = original_text
# 2. Bridge to English if not already English
if detected_lang != "en":
@@ -211,21 +206,52 @@ def main():
bridge_kwargs["language"] = args.lang
bridge_result = mlx_whisper.transcribe(current_audio, **bridge_kwargs)
english_text = bridge_result['text'].strip()
if args.en:
payload["en"] = english_text
print(f"[EN]: {english_text}")
else:
english_text = original_text
if args.en:
payload["en"] = english_text
# Update rolling context for next segment
if args.context:
# keep the last ~200 characters of the source language text
rolling_context = (rolling_context + " " + original_text)[-200:].strip()
# Heuristic Punctuation Buffering for better translation
if args.context:
translation_buffer_orig = (translation_buffer_orig + " " + original_text).strip()
translation_buffer_en = (translation_buffer_en + " " + english_text).strip()
if not translation_buffer_en.endswith(('.', '?', '!', '', '', '')) and len(translation_buffer_en) < 200:
if args.en:
print(f"[EN (partial)]: {english_text}")
audio_buffer = []
speech_started = False
last_stream_time = time.time()
continue # Wait for more audio before translating
final_orig = translation_buffer_orig
final_en = translation_buffer_en
translation_buffer_orig = ""
translation_buffer_en = ""
else:
final_orig = original_text
final_en = english_text
# Prepare payload
payload = {"original": final_orig}
# Include detected language if requested or if it's the bridge
if (detected_lang in active_target_langs) or (detected_lang == "en" and args.en):
payload[detected_lang] = final_orig
if args.en:
payload["en"] = final_en
if args.context:
print(f"[EN (buffered)]: {final_en}")
else:
print(f"[EN]: {final_en}")
# 3. Translate from English to other languages
if english_text and translation_engines:
if final_en and translation_engines:
# Limit input length
clean_en = english_text[:247] + "..." if len(english_text) > 250 else english_text