aboutsummaryrefslogtreecommitdiff
path: root/tests/test_tts.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_tts.py')
-rw-r--r--tests/test_tts.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/test_tts.py b/tests/test_tts.py
index e2fe921..0b6da02 100644
--- a/tests/test_tts.py
+++ b/tests/test_tts.py
@@ -3,8 +3,10 @@
import io
import json
import tempfile
+import time
import unittest
import wave
+from contextlib import redirect_stdout
from pathlib import Path
from unittest.mock import MagicMock, patch
@@ -1016,6 +1018,69 @@ class AudioCppTTSClientRequestTests(unittest.TestCase):
self.assertEqual(remaining, ["chunk_0001.wav"])
+class AudioCppHeartbeatTests(unittest.TestCase):
+ """The heartbeat label drops 'Chunk' when the server does its own
+ long-form chunking (chunk_text=False, the default)."""
+
+ def setUp(self):
+ self._tmp = tempfile.TemporaryDirectory()
+ self._chunks = patch.object(tts, "CHUNKS_FOLDER", Path(self._tmp.name))
+ self._chunks.start()
+
+ def tearDown(self):
+ self._chunks.stop()
+ self._tmp.cleanup()
+
+ @staticmethod
+ def _client(chunk_text):
+ client = AudioCppTTSClient.__new__(AudioCppTTSClient)
+ client.api_url = "http://127.0.0.1:8080"
+ client.model_id = config.AUDIOCPP_MODEL_ID
+ client.preset_mode = False
+ client.voice = "Vivian"
+ client.language = "English"
+ client._seed = -1
+ client.chunk_text = chunk_text
+ client.family = "qwen3_tts"
+ client.profile = tts.AUDIOCPP_DEFAULT_FAMILY_PROFILE
+ return client
+
+ @staticmethod
+ def _wav_bytes():
+ buffer = io.BytesIO()
+ with wave.open(buffer, "wb") as wav_file:
+ wav_file.setnchannels(1)
+ wav_file.setsampwidth(2)
+ wav_file.setframerate(tts.SAMPLE_RATE)
+ wav_file.writeframes(b"\x01\x00" * 10)
+ return buffer.getvalue()
+
+ def _run(self, chunk_text):
+ client = self._client(chunk_text)
+
+ def slow_request(*_args, **_kwargs):
+ time.sleep(0.12)
+ return self._wav_bytes()
+
+ buf = io.StringIO()
+ with patch.object(config, "HEARTBEAT_INTERVAL_SECONDS", 0.03), \
+ patch.object(client, "_request_wav_with_retry",
+ side_effect=slow_request), \
+ redirect_stdout(buf):
+ result = client.generate_chunk("Hello.", 1)
+ self.assertTrue(result)
+ return buf.getvalue()
+
+ def test_server_side_chunking_heartbeat_has_no_chunk_word(self):
+ out = self._run(chunk_text=False)
+ self.assertIn("Request still generating", out)
+ self.assertNotIn("Chunk", out)
+
+ def test_client_side_chunking_heartbeat_keeps_chunk_word(self):
+ out = self._run(chunk_text=True)
+ self.assertIn("Chunk 1 still generating", out)
+
+
class AudioCppTTSClientTruncationTests(unittest.TestCase):
"""Audio far shorter than its text implies fails the request."""