feat: implement heuristic punctuation buffering for translations when context is enabled
This commit is contained in:
+39
-13
@@ -150,6 +150,8 @@ def main():
|
|||||||
speech_started = False
|
speech_started = False
|
||||||
last_stream_time = time.time()
|
last_stream_time = time.time()
|
||||||
rolling_context = ""
|
rolling_context = ""
|
||||||
|
translation_buffer_orig = ""
|
||||||
|
translation_buffer_en = ""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
with sd.InputStream(samplerate=SAMPLERATE, channels=CHANNELS, callback=callback, blocksize=BLOCK_SIZE, device=device_index):
|
with sd.InputStream(samplerate=SAMPLERATE, channels=CHANNELS, callback=callback, blocksize=BLOCK_SIZE, device=device_index):
|
||||||
@@ -196,13 +198,6 @@ def main():
|
|||||||
|
|
||||||
if original_text:
|
if original_text:
|
||||||
print(f"\n[{detected_lang.upper()}]: {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
|
# 2. Bridge to English if not already English
|
||||||
if detected_lang != "en":
|
if detected_lang != "en":
|
||||||
@@ -211,21 +206,52 @@ def main():
|
|||||||
bridge_kwargs["language"] = args.lang
|
bridge_kwargs["language"] = args.lang
|
||||||
bridge_result = mlx_whisper.transcribe(current_audio, **bridge_kwargs)
|
bridge_result = mlx_whisper.transcribe(current_audio, **bridge_kwargs)
|
||||||
english_text = bridge_result['text'].strip()
|
english_text = bridge_result['text'].strip()
|
||||||
if args.en:
|
|
||||||
payload["en"] = english_text
|
|
||||||
print(f"[EN]: {english_text}")
|
|
||||||
else:
|
else:
|
||||||
english_text = original_text
|
english_text = original_text
|
||||||
if args.en:
|
|
||||||
payload["en"] = english_text
|
|
||||||
|
|
||||||
# Update rolling context for next segment
|
# Update rolling context for next segment
|
||||||
if args.context:
|
if args.context:
|
||||||
# keep the last ~200 characters of the source language text
|
# keep the last ~200 characters of the source language text
|
||||||
rolling_context = (rolling_context + " " + original_text)[-200:].strip()
|
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
|
# 3. Translate from English to other languages
|
||||||
if english_text and translation_engines:
|
if final_en and translation_engines:
|
||||||
# Limit input length
|
# Limit input length
|
||||||
clean_en = english_text[:247] + "..." if len(english_text) > 250 else english_text
|
clean_en = english_text[:247] + "..." if len(english_text) > 250 else english_text
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user