Some checks failed
Forge CI / smoke-and-build (pull_request) Failing after 1m0s
Cherry-picked from gary-the-ai/hermes-web-console-gui (commits8ec0656,0d0d27d). - speed parameter on text_to_speech tool (0.25-4.0, optional) - Edge TTS: multiplier to SSML rate string (+20%, -30%) - OpenAI TTS: native speed parameter - MiniMax: _speed_override from tool param - Auto-clamped to valid range - 6 new tests
53 lines
2.2 KiB
Python
53 lines
2.2 KiB
Python
"""Tests for TTS speed support (#321)."""
|
|
import json
|
|
import pytest
|
|
from unittest.mock import MagicMock, patch, AsyncMock
|
|
|
|
|
|
class TestTTSSchemaHasSpeed:
|
|
def test_schema_includes_speed(self):
|
|
from tools.tts_tool import TTS_SCHEMA
|
|
assert "speed" in TTS_SCHEMA["parameters"]["properties"]
|
|
assert TTS_SCHEMA["parameters"]["properties"]["speed"]["type"] == "number"
|
|
|
|
def test_speed_not_required(self):
|
|
from tools.tts_tool import TTS_SCHEMA
|
|
assert "speed" not in TTS_SCHEMA["parameters"].get("required", [])
|
|
|
|
|
|
class TestTextToSpeechToolSignature:
|
|
def test_accepts_speed(self):
|
|
from tools.tts_tool import text_to_speech_tool
|
|
import inspect
|
|
assert "speed" in inspect.signature(text_to_speech_tool).parameters
|
|
|
|
|
|
class TestSpeedClamping:
|
|
@patch("tools.tts_tool._load_tts_config", return_value={})
|
|
@patch("tools.tts_tool._get_provider", return_value="edge")
|
|
@patch("tools.tts_tool._import_edge_tts")
|
|
def test_clamped_low(self, mock_edge, mock_prov, mock_cfg):
|
|
from tools.tts_tool import text_to_speech_tool
|
|
with patch("tools.tts_tool.asyncio.run"):
|
|
with patch("tools.tts_tool.os.path.exists", return_value=True):
|
|
with patch("tools.tts_tool.os.path.getsize", return_value=1000):
|
|
assert "success" in json.loads(text_to_speech_tool("test", speed=0.01))
|
|
|
|
@patch("tools.tts_tool._load_tts_config", return_value={})
|
|
@patch("tools.tts_tool._get_provider", return_value="edge")
|
|
@patch("tools.tts_tool._import_edge_tts")
|
|
def test_clamped_high(self, mock_edge, mock_prov, mock_cfg):
|
|
from tools.tts_tool import text_to_speech_tool
|
|
with patch("tools.tts_tool.asyncio.run"):
|
|
with patch("tools.tts_tool.os.path.exists", return_value=True):
|
|
with patch("tools.tts_tool.os.path.getsize", return_value=1000):
|
|
assert "success" in json.loads(text_to_speech_tool("test", speed=100.0))
|
|
|
|
|
|
class TestEdgeTTSRateConversion:
|
|
def test_rates(self):
|
|
for speed, expected in [(1.0, "+0%"), (1.5, "+50%"), (0.5, "-50%"), (2.0, "+100%"), (0.25, "-75%")]:
|
|
pct = int((speed - 1.0) * 100)
|
|
rate = f"+{pct}%" if pct >= 0 else f"{pct}%"
|
|
assert rate == expected
|