humaticai-speech-server / tests /test_cli_defaults.py
s2s-deploy
Speech-to-speech realtime demo for HF Spaces GPU (parakeet + qwen3, port 7860)
79ec2b5
Raw
History Blame Contribute Delete
7.09 kB
import sys
from dataclasses import fields
from speech_to_speech.arguments_classes.chat_tts_arguments import ChatTTSHandlerArguments
from speech_to_speech.arguments_classes.facebookmms_tts_arguments import FacebookMMSTTSHandlerArguments
from speech_to_speech.arguments_classes.faster_whisper_stt_arguments import FasterWhisperSTTHandlerArguments
from speech_to_speech.arguments_classes.kokoro_tts_arguments import KokoroTTSHandlerArguments
from speech_to_speech.arguments_classes.language_model_arguments import LanguageModelHandlerArguments
from speech_to_speech.arguments_classes.mlx_audio_whisper_arguments import MLXAudioWhisperSTTHandlerArguments
from speech_to_speech.arguments_classes.module_arguments import ModuleArguments
from speech_to_speech.arguments_classes.paraformer_stt_arguments import ParaformerSTTHandlerArguments
from speech_to_speech.arguments_classes.parakeet_tdt_arguments import ParakeetTDTSTTHandlerArguments
from speech_to_speech.arguments_classes.pocket_tts_arguments import PocketTTSHandlerArguments
from speech_to_speech.arguments_classes.qwen3_tts_arguments import Qwen3TTSHandlerArguments
from speech_to_speech.arguments_classes.responses_api_language_model_arguments import (
ResponsesApiLanguageModelHandlerArguments,
)
from speech_to_speech.arguments_classes.socket_receiver_arguments import SocketReceiverArguments
from speech_to_speech.arguments_classes.socket_sender_arguments import SocketSenderArguments
from speech_to_speech.arguments_classes.vad_arguments import VADHandlerArguments
from speech_to_speech.arguments_classes.websocket_streamer_arguments import WebSocketStreamerArguments
from speech_to_speech.arguments_classes.whisper_stt_arguments import WhisperSTTHandlerArguments
from speech_to_speech.s2s_pipeline import ParsedArguments, parse_arguments
def test_release_defaults_match_responses_api_parakeet_qwen3_realtime_profile():
module_args = ModuleArguments()
vad_args = VADHandlerArguments()
responses_api_args = ResponsesApiLanguageModelHandlerArguments()
qwen3_args = Qwen3TTSHandlerArguments()
assert module_args.mode == "realtime"
assert module_args.stt == "parakeet-tdt"
assert module_args.llm_backend == "responses-api"
assert module_args.tts == "qwen3"
assert module_args.log_level == "info"
assert module_args.enable_live_transcription is True
assert module_args.live_transcription_update_interval == 0.5
assert vad_args.thresh == 0.6
assert vad_args.min_silence_ms == 64
assert vad_args.min_speech_ms == 384
assert vad_args.min_speech_continuation_ms == 192
assert vad_args.realtime_processing_pause == 0.5
assert responses_api_args.model_name == "gpt-5.4-mini"
assert responses_api_args.chat_size == 30
assert responses_api_args.responses_api_stream is True
assert qwen3_args.qwen3_tts_model_name == "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice"
assert qwen3_args.qwen3_tts_speaker == "Aiden"
assert qwen3_args.qwen3_tts_language == "auto"
assert qwen3_args.qwen3_tts_backend == "ggml"
assert qwen3_args.qwen3_tts_non_streaming_mode is True
assert qwen3_args.qwen3_tts_ref_audio is None
assert qwen3_args.qwen3_tts_mlx_quantization == "6bit"
# -- ParsedArguments dataclass tests ------------------------------------------
EXPECTED_FIELD_TYPES = {
"module_kwargs": ModuleArguments,
"socket_receiver_kwargs": SocketReceiverArguments,
"socket_sender_kwargs": SocketSenderArguments,
"websocket_streamer_kwargs": WebSocketStreamerArguments,
"vad_handler_kwargs": VADHandlerArguments,
"whisper_stt_handler_kwargs": WhisperSTTHandlerArguments,
"paraformer_stt_handler_kwargs": ParaformerSTTHandlerArguments,
"faster_whisper_stt_handler_kwargs": FasterWhisperSTTHandlerArguments,
"mlx_audio_whisper_stt_handler_kwargs": MLXAudioWhisperSTTHandlerArguments,
"parakeet_tdt_stt_handler_kwargs": ParakeetTDTSTTHandlerArguments,
"language_model_handler_kwargs": LanguageModelHandlerArguments,
"responses_api_language_model_handler_kwargs": ResponsesApiLanguageModelHandlerArguments,
"chat_tts_handler_kwargs": ChatTTSHandlerArguments,
"facebook_mms_tts_handler_kwargs": FacebookMMSTTSHandlerArguments,
"pocket_tts_handler_kwargs": PocketTTSHandlerArguments,
"kokoro_tts_handler_kwargs": KokoroTTSHandlerArguments,
"qwen3_tts_handler_kwargs": Qwen3TTSHandlerArguments,
}
def test_parsed_arguments_has_all_expected_fields():
actual_fields = {f.name: f.type for f in fields(ParsedArguments)}
assert set(actual_fields) == set(EXPECTED_FIELD_TYPES)
def test_parsed_arguments_field_types_match():
for f in fields(ParsedArguments):
assert f.type is EXPECTED_FIELD_TYPES[f.name], (
f"Field {f.name!r}: expected {EXPECTED_FIELD_TYPES[f.name].__name__}, got {f.type}"
)
def test_parse_arguments_default_backend_returns_openai_api():
original_argv = sys.argv[:]
try:
sys.argv = ["speech-to-speech"]
args = parse_arguments()
finally:
sys.argv = original_argv
assert isinstance(args, ParsedArguments)
assert isinstance(args.module_kwargs, ModuleArguments)
assert isinstance(args.responses_api_language_model_handler_kwargs, ResponsesApiLanguageModelHandlerArguments)
assert isinstance(args.language_model_handler_kwargs, LanguageModelHandlerArguments)
assert args.responses_api_language_model_handler_kwargs.model_name == "gpt-5.4-mini"
assert args.module_kwargs.llm_backend == "responses-api"
def test_parse_arguments_accepts_qwen3_tts_backend_override():
original_argv = sys.argv[:]
try:
sys.argv = ["speech-to-speech", "--qwen3_tts_backend", "torch"]
args = parse_arguments()
finally:
sys.argv = original_argv
assert args.qwen3_tts_handler_kwargs.qwen3_tts_backend == "torch"
def test_parse_arguments_transformers_backend():
original_argv = sys.argv[:]
try:
sys.argv = ["speech-to-speech", "--llm_backend", "transformers"]
args = parse_arguments()
finally:
sys.argv = original_argv
assert isinstance(args, ParsedArguments)
assert isinstance(args.language_model_handler_kwargs, LanguageModelHandlerArguments)
assert isinstance(args.responses_api_language_model_handler_kwargs, ResponsesApiLanguageModelHandlerArguments)
assert args.language_model_handler_kwargs.model_name == "Qwen/Qwen3-4B-Instruct-2507"
# unused slot gets a default instance
assert args.responses_api_language_model_handler_kwargs.model_name == "gpt-5.4-mini"
def test_parse_arguments_all_fields_populated():
original_argv = sys.argv[:]
try:
sys.argv = ["speech-to-speech"]
args = parse_arguments()
finally:
sys.argv = original_argv
for f in fields(ParsedArguments):
value = getattr(args, f.name)
assert value is not None, f"Field {f.name!r} is None"
assert isinstance(value, EXPECTED_FIELD_TYPES[f.name]), (
f"Field {f.name!r}: expected {EXPECTED_FIELD_TYPES[f.name].__name__}, got {type(value).__name__}"
)