Skip to content

Commit 7dc8b62

Browse files
committed
test: add tts audio end interval check and change openai tts sample_rate
1 parent 5872e97 commit 7dc8b62

12 files changed

Lines changed: 144 additions & 6 deletions

ai_agents/agents/integration_tests/tts_guarder/tests/test_append_input.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
356356

357357
# Get request_total_audio_duration_ms
358358
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
359+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
359360

360361
# Calculate PCM duration based on current request audio bytes
361362
# Use current_request_audio_bytes which is already updated by audio frames
@@ -376,6 +377,22 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
376377
ten_env.log_info(
377378
f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms"
378379
)
380+
381+
if received_event_interval_ms > 0:
382+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
383+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
384+
self._stop_test_with_error(
385+
ten_env,
386+
f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms",
387+
)
388+
return
389+
ten_env.log_info(
390+
f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms"
391+
)
392+
else:
393+
ten_env.log_info(
394+
f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms"
395+
)
379396

380397
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")
381398
else:
@@ -505,4 +522,3 @@ def test_append_input(extension_name: str, config_dir: str) -> None:
505522
assert (
506523
error is None
507524
), f"Test failed: {error.error_message() if error else 'Unknown error'}"
508-

ai_agents/agents/integration_tests/tts_guarder/tests/test_append_input_stress.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import random
2323
import uuid
2424
import string
25+
import asyncio
2526

2627
TTS_DUMP_CONFIG_FILE = "property_dump.json"
2728
AUDIO_DURATION_TOLERANCE_MS = 50
@@ -137,7 +138,7 @@ async def on_start(self, ten_env: AsyncTenEnvTester) -> None:
137138
ten_env.log_info(f"Sending request {request_idx + 1}/{self.expected_group_count}: {text} (request_id: {request_id})")
138139

139140
# Each request has only one text, so text_input_end is always True
140-
time.sleep(5)
141+
await asyncio.sleep(5)
141142
await self._send_tts_text_input(
142143
ten_env, text, request_id, metadata, text_input_end=True
143144
)
@@ -351,6 +352,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
351352

352353
# Get request_total_audio_duration_ms
353354
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
355+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
354356

355357
# Calculate PCM duration based on current request audio bytes
356358
# Use current_request_audio_bytes which is already updated by audio frames
@@ -371,6 +373,22 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
371373
ten_env.log_info(
372374
f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms"
373375
)
376+
377+
if received_event_interval_ms > 0:
378+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
379+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
380+
self._stop_test_with_error(
381+
ten_env,
382+
f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms",
383+
)
384+
return
385+
ten_env.log_info(
386+
f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms"
387+
)
388+
else:
389+
ten_env.log_info(
390+
f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms"
391+
)
374392

375393
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")
376394
else:
@@ -554,4 +572,3 @@ def test_append_input_stress(
554572
assert (
555573
error is None
556574
), f"Test failed: {error.error_message() if error else 'Unknown error'}"
557-

ai_agents/agents/integration_tests/tts_guarder/tests/test_append_input_without_text_input_end.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,9 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
426426
received_audio_duration_ms, _ = data.get_property_int(
427427
"request_total_audio_duration_ms"
428428
)
429+
received_event_interval_ms, _ = data.get_property_int(
430+
"request_event_interval_ms"
431+
)
429432

430433
# Calculate PCM duration based on current request audio bytes
431434
# Use current_request_audio_bytes which is already updated by audio frames
@@ -451,6 +454,22 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
451454
f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms"
452455
)
453456

457+
if received_event_interval_ms > 0:
458+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
459+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
460+
self._stop_test_with_error(
461+
ten_env,
462+
f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms",
463+
)
464+
return
465+
ten_env.log_info(
466+
f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms"
467+
)
468+
else:
469+
ten_env.log_info(
470+
f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms"
471+
)
472+
454473
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")
455474
else:
456475
ten_env.log_warn("tts_audio_start not received before tts_audio_end")

ai_agents/agents/integration_tests/tts_guarder/tests/test_append_interrupt.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
501501

502502
# Get request_total_audio_duration_ms
503503
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
504+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
504505

505506
# Calculate PCM duration based on current request audio bytes
506507
# Use current_request_audio_bytes which is already updated by audio frames
@@ -521,6 +522,22 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
521522
ten_env.log_info(
522523
f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms"
523524
)
525+
526+
if received_event_interval_ms > 0:
527+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
528+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
529+
self._stop_test_with_error(
530+
ten_env,
531+
f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms",
532+
)
533+
return
534+
ten_env.log_info(
535+
f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms"
536+
)
537+
else:
538+
ten_env.log_info(
539+
f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms"
540+
)
524541

525542
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")
526543
else:
@@ -797,4 +814,3 @@ def test_append_interrupt(extension_name: str, config_dir: str) -> None:
797814
assert (
798815
error is None
799816
), f"Test failed: {error.error_message() if error else 'Unknown error'}"
800-

ai_agents/agents/integration_tests/tts_guarder/tests/test_basic_audio_setting.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
251251

252252
# Get request_total_audio_duration_ms (actual audio duration)
253253
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
254+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
254255

255256
# Validate audio duration: request_total_audio_duration_ms should be consistent with the length calculated from the PCM file
256257
pcm_audio_duration_ms = self._calculate_pcm_audio_duration_ms()
@@ -262,6 +263,15 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
262263
ten_env.log_info(f"✅ [{self.test_name}] Audio duration validation passed. PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms, Diff: {audio_duration_diff}ms")
263264
else:
264265
ten_env.log_info(f"[{self.test_name}] Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms")
266+
267+
if received_event_interval_ms > 0:
268+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
269+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
270+
self._stop_test_with_error(ten_env, f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
271+
return
272+
ten_env.log_info(f"✅ [{self.test_name}] Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
273+
else:
274+
ten_env.log_info(f"[{self.test_name}] Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms")
265275

266276
# Record actual elapsed time (for debugging)
267277
ten_env.log_info(f"[{self.test_name}] Actual event duration: {actual_duration_ms:.2f}ms")

ai_agents/agents/integration_tests/tts_guarder/tests/test_corner_input.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
234234

235235
# Get request_total_audio_duration_ms (actual audio duration)
236236
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
237+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
237238

238239
# Validate audio duration: request_total_audio_duration_ms should be consistent with the length calculated from the PCM file
239240
pcm_audio_duration_ms = self._calculate_pcm_audio_duration_ms()
@@ -245,6 +246,15 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
245246
ten_env.log_info(f"✅ Audio duration validation passed. PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms, Diff: {audio_duration_diff}ms")
246247
else:
247248
ten_env.log_info(f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms")
249+
250+
if received_event_interval_ms > 0:
251+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
252+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
253+
self._stop_test_with_error(ten_env, f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
254+
return
255+
ten_env.log_info(f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
256+
else:
257+
ten_env.log_info(f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms")
248258

249259
# Record actual elapsed time (for debugging)
250260
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")

ai_agents/agents/integration_tests/tts_guarder/tests/test_dump.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
235235

236236
# Get request_total_audio_duration_ms (actual audio duration)
237237
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
238+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
238239

239240
# Validate audio duration: request_total_audio_duration_ms should be consistent with the length calculated from the PCM file
240241
pcm_audio_duration_ms = self._calculate_pcm_audio_duration_ms()
@@ -246,6 +247,15 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
246247
ten_env.log_info(f"✅ Audio duration validation passed. PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms, Diff: {audio_duration_diff}ms")
247248
else:
248249
ten_env.log_info(f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms")
250+
251+
if received_event_interval_ms > 0:
252+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
253+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
254+
self._stop_test_with_error(ten_env, f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
255+
return
256+
ten_env.log_info(f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
257+
else:
258+
ten_env.log_info(f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms")
249259

250260
# Record actual elapsed time (for debugging)
251261
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")

ai_agents/agents/integration_tests/tts_guarder/tests/test_dump_each_request_id.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
236236

237237
# Get request_total_audio_duration_ms (actual audio duration)
238238
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
239+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
239240

240241
# Validate audio duration: request_total_audio_duration_ms should be consistent with the length calculated from the PCM file
241242
pcm_audio_duration_ms = self._calculate_pcm_audio_duration_ms()
@@ -247,6 +248,15 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
247248
ten_env.log_info(f"✅ Audio duration validation passed. PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms, Diff: {audio_duration_diff}ms")
248249
else:
249250
ten_env.log_info(f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms")
251+
252+
if received_event_interval_ms > 0:
253+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
254+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
255+
self._stop_test_with_error(ten_env, f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
256+
return
257+
ten_env.log_info(f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms")
258+
else:
259+
ten_env.log_info(f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms")
250260

251261
# Record actual elapsed time (for debugging)
252262
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")

ai_agents/agents/integration_tests/tts_guarder/tests/test_interleaved_requests.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
437437

438438
# Get request_total_audio_duration_ms
439439
received_audio_duration_ms, _ = data.get_property_int("request_total_audio_duration_ms")
440+
received_event_interval_ms, _ = data.get_property_int("request_event_interval_ms")
440441

441442
# Calculate PCM duration based on current request audio bytes
442443
# Use current_request_audio_bytes which is already updated by audio frames
@@ -457,6 +458,22 @@ async def on_data(self, ten_env: AsyncTenEnvTester, data: Data) -> None:
457458
ten_env.log_info(
458459
f"Skipping audio duration validation - PCM: {pcm_audio_duration_ms}ms, Reported: {received_audio_duration_ms}ms"
459460
)
461+
462+
if received_event_interval_ms > 0:
463+
event_interval_diff = abs(received_event_interval_ms - actual_duration_ms)
464+
if event_interval_diff > AUDIO_DURATION_TOLERANCE_MS:
465+
self._stop_test_with_error(
466+
ten_env,
467+
f"Event interval mismatch. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms",
468+
)
469+
return
470+
ten_env.log_info(
471+
f"✅ Event interval validation passed. Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms, Diff: {event_interval_diff:.2f}ms"
472+
)
473+
else:
474+
ten_env.log_info(
475+
f"Skipping event interval validation - Actual: {actual_duration_ms:.2f}ms, Reported: {received_event_interval_ms}ms"
476+
)
460477

461478
ten_env.log_info(f"Actual event duration: {actual_duration_ms:.2f}ms")
462479
else:
@@ -596,4 +613,3 @@ def test_interleaved_requests(extension_name: str, config_dir: str) -> None:
596613
error is None
597614
), f"Test failed: {error.error_message() if error else 'Unknown error'}"
598615

599-

0 commit comments

Comments
 (0)