ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TEN Framework TTS Guarder 集成测试指南:从 API Key 配置到字幕对齐验证

TEN Framework TTS Guarder 集成测试指南:从 API Key 配置到字幕对齐验证 人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载TTS Guarder 是 TEN Framework AI Agents 仓库中面向 TTS文本转语音扩展的一体化集成测试套件位于 ai_agents/agents/integration_tests/tts_guarder 目录。它以 pytest TEN Runtime 测试框架为底座通过向真实 TTS 扩展注入tts_text_input数据并校验tts_audio_start、tts_audio_end、tts_text_result等输出事件验证语音合成扩展的正确性。阅读本文后你将掌握 TTS Guarder 的环境配置、命令行运行方式、Taskfile 任务封装以及字幕对齐Subtitle Alignment这类高级校验的启用与原理。TTS Guarder 定位与套件结构TTS Guarder 与同目录下的 ASR Guarder 共同构成 AI Agents 的双向语音链路验证体系ASR Guarder 校验语音识别TTS Guarder 校验语音合成。二者共享同一套动态注入被测扩展 独立测试用例的设计模式。从仓库目录结构看TTS Guarder 套件由以下部分组成路径作用tests/全部 pytest 测试用例含 conftest.py 与测试数据tests/conftest.pypytest 插件与全局 fixture负责启动 FakeApp、解析命令行选项manifest-tmpl.json应用 manifest 模板运行前动态替换{{extension_name}}scripts/install_deps_and_build.sh依赖安装与构建脚本property.json应用属性当前为空对象其中manifest-tmpl.json是套件可针对任意 TTS 扩展复用的关键它以{{extension_name}}作为占位符声明依赖ten_packages/extension/{{extension_name}}在运行时被替换为真实的扩展名详见下文 Taskfile 解析从而让同一套测试用例直接套用在 ElevenLabs、Cartesia、字节跳动Bytedance等不同厂商的 TTS 扩展上。第一步配置 TTS 厂商 API Key运行测试前必须先为被测的 TTS 厂商服务配置 API Key。TTS Guarder 支持两种配置方式方式一环境变量export# TTS Vendor Services API Key export VENDOR_TTS_API_KEYyour_api_key_here # 例如 ElevenLabs export ELEVENLABS_TTS_API_KEYyour_elevenlabs_api_key方式二项目根目录的.env文件# .env file ELEVENLABS_TTS_API_KEYyour_elevenlabs_api_key需要说明的是VENDOR_TTS_API_KEY是通用占位变量具体被测扩展实际读取的 Key 名称由该扩展自身的配置决定。例如 ElevenLabs 扩展对应ELEVENLABS_TTS_API_KEY。.env文件方式与 ai_agents/Taskfile.yml 中的dotenv: [.env]声明相衔接——Taskfile 在执行tts-guarder-test等任务时会自动加载.env中的变量因此直接task tts-guarder-test EXTENSIONxxx即可读取配置无需手动 export。第二步准备测试文本README 明确指出需要为不同测试场景准备多段文本prepare mutiple text for testing different scenario。这一要求在测试代码中有多处印证tests/test_data/short.txt短文本测试数据供test_short_text类用例读取test_basic_audio_setting.py 中直接内置了hello world, hello agora, hello shanghai, nice to meet you!作为采样率对比测试的输入文本test_subtitle_alignment.py 中则使用一段英文长句验证字幕与音频的时序对齐。文本通过tts_text_input数据Data对象发送携带text、request_id、text_input_end以及含session_id/turn_id的metadata字段。建议至少准备短文本、长文本、空文本/非法文本、带特殊字符的文本以覆盖测试用例集中不同场景。第三步运行测试命令行直接运行# 运行单个测试用例 bash tests/bin/start tests/test_elevenlabs_tts_basic.py::test_short_text --extension_nameelevenlbas_tts_python其中tests/bin/start是测试套件的统一启动入口由安装脚本生成/下载tests/test_elevenlabs_tts_basic.py::test_short_text指定要执行的测试文件与用例节点--extension_nameelevenlbas_tts_python指定被测 TTS 扩展。通过 Taskfile 运行整套测试更推荐的方式是通过 ai_agents/Taskfile.yml 中定义的tts-guarder-test任务# 默认扩展bytedance_tts_duplex task tts-guarder-test # 指定被测扩展 task tts-guarder-test EXTENSIONcartesia_tts该任务的完整执行流程可从 ai_agents/Taskfile.yml 源码确认为用sed将manifest-tmpl.json中的{{extension_name}}替换为实际扩展名生成manifest.json执行./scripts/install_deps_and_build.sh linux x64该脚本会调用tman -y install安装 manifest 声明的全部依赖并遍历ten_packages/extension与ten_packages/system目录逐个安装各扩展的requirements.txt见 install_deps_and_build.sh运行./tests/bin/start --extension_name EXTENSION --config_dir 扩展配置目录并透传{{ .CLI_ARGS }}中的附加参数。任务还通过TEN_ENABLE_BACKTRACE_DUMP: true开启运行时回溯转储便于测试失败时定位 C 核心层的崩溃现场。关键 pytest 命令行选项套件在 tests/conftest.py 中通过pytest_addoption注册了以下选项选项是否必填默认值说明--extension_name是无被测 TTS 扩展名如elevenlabs_tts_python、cartesia_tts--config_dir是无扩展配置目录的绝对路径通常指向agents/ten_packages/extension/扩展名/tests/configs--enable_sample_rate否True是否启用采样率对比校验True/False--enable_subtitle_alignment否False是否启用字幕对齐测试True/False测试用例矩阵套件的 tests/ 目录按功能维度组织了完整的 TTS 场景覆盖测试文件验证目标test_basic_audio_setting.py基础音频设置不同配置下采样率是否按预期生效音频时长是否与 PCM 数据一致容差 50mstest_connection_status.pyWebSocket 型 TTS 扩展的连接状态事件支持 bytedance/minimax/rime 等见源码SUPPORTED_WEBSOCKET_TTS_EXTENSIONStest_append_input.py/test_append_input_stress.py/test_append_input_without_text_input_end.py追加式文本输入、压力场景、未发送结束标记的追加输入test_interleaved_requests.py交错/并发请求处理test_interrupt.py合成中断处理test_corner_input.py/test_empty_text_request.py/test_invalid_text_handling.py边界与非法输入空文本、非法文本、角落输入test_invalid_required_params.py/test_miss_required_params.py缺失/非法必填参数的报错行为test_flush.py冲刷flush语义test_dump.py/test_dump_each_request_id.py音频 dump 与按 request_id 维度 dumptest_metrics.py指标输出test_subtitle_alignment.py字幕词级时间戳与音频帧对齐默认关闭见下文以 test_basic_audio_setting.py 为例它依次读取两份配置文件property_basic_audio_setting1.json与property_basic_audio_setting2.json运行两次合成若两份配置期望不同的采样率如 16K 与 32K则断言两次测试拿到的audio_frame.get_sample_rate()不同从而验证扩展的采样率配置确实生效。字幕对齐测试Subtitle Alignment Test默认禁用与启用方式字幕对齐测试在 TTS Guarder 中默认禁用原因在于它依赖 TTS 厂商返回词级时间戳word-level timing并非所有厂商都支持。README 给出的用法如下# 默认运行跳过字幕对齐测试 task tts-guarder-test EXTENSIONcartesia_tts # 显式启用字幕对齐测试 task tts-guarder-test EXTENSIONcartesia_tts -- --enable_subtitle_alignmentTrue目前test_subtitle_alignment.py仅针对cartesia_tts运行。这一限制在源码中有两处强校验见 test_subtitle_alignment.py若--enable_subtitle_alignment未开启测试直接pytest.skip若被测扩展不在SUPPORTED_TTS_EXTENSIONS {cartesia_tts}集合内同样跳过若配置目录下不存在property_subtitle_alignment.json配置文件也会跳过Subtitle alignment is optional for providers without text timing。六条对齐验证规则SubtitleAlignmentTester 在收到tts_audio_end后延时 0.5 秒等待词级结果收齐然后依次执行六个校验器规则校验内容源码函数1首条文本的start_ms不得早于首个音频帧时间戳_validate_first_timestamp2文本start_ms必须严格递增_validate_text_timestamps_ascending3音频帧时间戳严格递增且下一帧 ≈ 上一帧时间戳 上一帧时长容差 ±10ms_validate_audio_frames_ascending4文本总时长与音频总时长差值不超过阈值DURATION_MISMATCH_THRESHOLD_MS 1000ms_validate_duration_match5turn_seq_id递增、request_id全程一致_validate_turn_sequence6最后一条结果的turn_status必须为 1正常结束或 2被打断_validate_turn_status校验失败时通过ten_env.stop_test(TenError.create(...))终止测试并抛出错误全部通过则打印✅ All subtitle alignment validations passed并正常结束。音频帧时长由帧内样本数换算duration_ms samples * 1000 // sample_rate见 test_subtitle_alignment.py。这六条规则共同保证了一个对语音交互产品至关重要的性质字幕出现时机与听到的语音严格对齐——字幕不能先于声音、不能后于声音超过 1 秒、且各词序与音频帧序一致。测试运行机制FakeApp 与测试器理解 TTS Guarder 的运行机制有助于排查失败用例。tests/conftest.py 中的 session 级 autouse fixture 会启动一个独立的FakeApp线程FakeApp 在on_init中释放事件锁使 fixture 得以继续执行在on_configure中通过init_property_from_json注入控制台日志 handler随后app.run(False)启动运行时teardown 阶段关闭 app 并 join 线程。测试用例本身继承AsyncExtensionTester通过set_test_mode_single(extension_name, json.dumps(config))将扩展与配置绑定然后on_start中构造Data.create(tts_text_input)并设置text、request_id、text_input_end、metadata后send_dataon_data中按tts_audio_start/tts_audio_end/tts_text_result/error等消息名分派处理on_audio_frame中检查采样率、累积音频字节并核对时间戳。这套发送输入 → 收集输出 → 规则校验的模型与真实 AI Agent 运行时中 TTS 扩展的接入方式一致因此 TTS Guarder 的测试结果可以直接反映扩展在真实场景中的行为。小结与排查建议综合 README 与仓库源码TTS Guarder 的完整使用路径可归纳为配置 API Keyexport 或.env准备覆盖多场景的测试文本选择运行方式bash tests/bin/start ... --extension_nameext或task tts-guarder-test EXTENSIONext按需追加--enable_sample_rate/--enable_subtitle_alignment等选项针对cartesia_tts等支持词级时间戳的扩展可启用字幕对齐测试验证时序。常见问题定位线索若用例被跳过优先检查--enable_subtitle_alignment是否开启、扩展名是否在SUPPORTED_TTS_EXTENSIONS集合内、config_dir下是否存在对应property_*.json配置文件若用例失败可借助TEN_ENABLE_BACKTRACE_DUMPtrueTaskfile 默认开启的崩溃转储与测试日志中的❌错误信息定位具体校验规则。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐Czkawka免费开源的一体化磁盘清理工具一个扫描找重复文件、相似图片Czkawka免费开源的一体化磁盘清理工具一个扫描找重复文件、相似图片 下载完素材拷进硬盘系统提示空间不足但翻半天找不到该删什么Czkawka 是一个人工智能AI Agent多模态语音AI 应用TEN Framework 集成 EZAI 繁中 TTS 扩展ezai_tw_tts_python 配置与实现全解析TEN Framework 集成 EZAI 繁中 TTS 扩展ezai_tw_tts_python 配置与实现全解析 本文档以 ezai_tw_tts_pyt人工智能AI Agent多模态语音AI 应用AIRI 集成 CometAPI 语音合成TTS从 API Key 配置到实时语音回复的完整指南AIRI 集成 CometAPI 语音合成TTS从 API Key 配置到实时语音回复的完整指南 CometAPI 通过 OpenAI 兼容接口为 AIRAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染上一篇Celery 节点命名机制全解析celery.utils.nodenames 模块源码级指南下一篇20个STM32实战例程从零到机器人嵌入式开发终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表