feat: implement accumulative LLM paragraph engine and harden 4-process pipeline
This commit is contained in:
+41
-26
@@ -1,26 +1,16 @@
|
||||
import sys
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
# Comprehensive workaround for missing _lzma in some Python builds
|
||||
try:
|
||||
import lzma
|
||||
except ImportError:
|
||||
mock_lzma = MagicMock()
|
||||
mock_lzma.FORMAT_XZ = 1
|
||||
mock_lzma.FORMAT_ALONE = 2
|
||||
mock_lzma.FORMAT_RAW = 3
|
||||
mock_lzma.CHECK_NONE = 0
|
||||
mock_lzma.CHECK_CRC32 = 1
|
||||
mock_lzma.CHECK_CRC64 = 4
|
||||
mock_lzma.CHECK_SHA256 = 10
|
||||
sys.modules["_lzma"] = MagicMock()
|
||||
sys.modules["lzma"] = mock_lzma
|
||||
|
||||
import multiprocessing
|
||||
import argparse
|
||||
import json
|
||||
import os
|
||||
from engine_transcribe import run_transcription
|
||||
import sys
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load environment variables from .env if present
|
||||
load_dotenv()
|
||||
|
||||
# Light imports (heavy ones moved inside run functions)
|
||||
from engine_transcribe import run_transcription, list_audio_devices
|
||||
from engine_llm import run_llm_processor
|
||||
from engine_translate import run_translation
|
||||
from engine_distribute import run_distribution
|
||||
|
||||
@@ -40,6 +30,7 @@ def main():
|
||||
parser = argparse.ArgumentParser(description="Multi-process Transcription and Translation.")
|
||||
|
||||
# Transcribe Args
|
||||
parser.add_argument("-l", "--list-devices", action="store_true", help="Show available audio devices and exit")
|
||||
parser.add_argument("--model", type=str, default=defaults.get("model", "mlx-community/whisper-base-mlx"))
|
||||
parser.add_argument("--device", type=int, default=defaults.get("device"))
|
||||
parser.add_argument("--lang", type=str, default=defaults.get("lang"))
|
||||
@@ -55,15 +46,17 @@ def main():
|
||||
parser.add_argument("--logprob-threshold", type=float, default=defaults.get("logprob_threshold", -0.8))
|
||||
parser.add_argument("--compression-threshold", type=float, default=defaults.get("compression_threshold", 2.2))
|
||||
|
||||
# LLM Args
|
||||
parser.add_argument("--post-correct", action="store_true", default=defaults.get("post_correct", False))
|
||||
parser.add_argument("--post-correct-llm", action="store_true", default=defaults.get("post_correct_llm", False))
|
||||
parser.add_argument("--post-correct-model", type=str, default=defaults.get("post_correct_model", "qwen:2b"))
|
||||
parser.add_argument("--llm-paragraph", action="store_true", default=defaults.get("llm_paragraph", False))
|
||||
|
||||
# Translate Args
|
||||
parser.add_argument("-es", action="store_true", default=defaults.get("es", 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("-en", action="store_true", default=defaults.get("en", False))
|
||||
parser.add_argument("--post-correct", action="store_true", default=defaults.get("post_correct", False))
|
||||
parser.add_argument("--post-correct-llm", action="store_true", default=defaults.get("post_correct_llm", False))
|
||||
parser.add_argument("--post-correct-model", type=str, default=defaults.get("post_correct_model", "qwen:2b"))
|
||||
parser.add_argument("--llm-paragraph", action="store_true", default=defaults.get("llm_paragraph", False))
|
||||
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-num-beams", type=int, default=defaults.get("mt_num_beams", 4))
|
||||
@@ -73,27 +66,49 @@ def main():
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Handle device listing
|
||||
if args.list_devices:
|
||||
list_audio_devices()
|
||||
return
|
||||
|
||||
# Handle interactive device selection
|
||||
if args.device is None:
|
||||
list_audio_devices()
|
||||
try:
|
||||
val = input("\nSelect input device index (or press Enter for default): ").strip()
|
||||
if val:
|
||||
args.device = int(val)
|
||||
except EOFError:
|
||||
pass # Non-interactive environment
|
||||
except ValueError:
|
||||
print("[Main] Invalid index, using default.")
|
||||
|
||||
# Queues
|
||||
q_trans_to_tl = multiprocessing.Queue()
|
||||
q_trans_to_llm = multiprocessing.Queue()
|
||||
q_llm_to_tl = multiprocessing.Queue()
|
||||
q_tl_to_dist = multiprocessing.Queue()
|
||||
|
||||
# Processes
|
||||
p_transcribe = multiprocessing.Process(target=run_transcription, args=(q_trans_to_tl, args))
|
||||
p_translate = multiprocessing.Process(target=run_translation, args=(q_trans_to_tl, q_tl_to_dist, args))
|
||||
p_transcribe = multiprocessing.Process(target=run_transcription, args=(q_trans_to_llm, args))
|
||||
p_llm = multiprocessing.Process(target=run_llm_processor, args=(q_trans_to_llm, q_llm_to_tl, args))
|
||||
p_translate = multiprocessing.Process(target=run_translation, args=(q_llm_to_tl, q_tl_to_dist, args))
|
||||
p_distribute = multiprocessing.Process(target=run_distribution, args=(q_tl_to_dist, args))
|
||||
|
||||
print("[Main] Starting processes...")
|
||||
p_transcribe.start()
|
||||
p_llm.start()
|
||||
p_translate.start()
|
||||
p_distribute.start()
|
||||
|
||||
try:
|
||||
p_transcribe.join()
|
||||
p_llm.join()
|
||||
p_translate.join()
|
||||
p_distribute.join()
|
||||
except KeyboardInterrupt:
|
||||
print("\n[Main] Stopping processes...")
|
||||
p_transcribe.terminate()
|
||||
p_llm.terminate()
|
||||
p_translate.terminate()
|
||||
p_distribute.terminate()
|
||||
sys.exit(0)
|
||||
|
||||
Reference in New Issue
Block a user