ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s

This commit is contained in:
2026-08-20 13:12:50 +00:00
commit b119135836
10275 changed files with 3284984 additions and 0 deletions
@@ -0,0 +1,47 @@
{
"schema_version": 1,
"experiment": "7-6",
"status": "incomplete",
"generated_at_utc": "2026-07-30T04:26:35.560333+00:00",
"run_dir": "chapter7/tts-quality-eval/validation/audio_fallback_probe_20260730",
"git_commit": "f119cf510f3746cd5d071d0bce0051617f02f163",
"command": "python demo.py --providers fishaudio --gemini --quick --output validation/audio_fallback_probe_20260730",
"provider_receipt_count": 2,
"status_reasons": [
"Fish Audio returned two non-empty MP3 artifacts. The Google Gemini credential was rejected and the exact OpenRouter two-input_audio fallback returned HTTP 401, so no direct-audio judge record completed."
],
"inputs": [
{
"path": "chapter7/tts-quality-eval/config.py",
"bytes": 8642,
"sha256": "891396771cd7beb32ab8e4b316f9a6f73683951e0327dcae6504d858ffd92ba1"
},
{
"path": "chapter7/tts-quality-eval/demo.py",
"bytes": 17225,
"sha256": "c2da1f44b3ac3ec9e9b6648ee535e57c8fa757a14a45028f1e125ed9cb8f1938"
},
{
"path": "chapter7/tts-quality-eval/pipeline.py",
"bytes": 27511,
"sha256": "db62ac8058561ae22b9a2dacd67aec42176f181a401e162009e1a3be7360ed54"
}
],
"artifacts": [
{
"path": "chapter7/tts-quality-eval/validation/audio_fallback_probe_20260730/fishaudio-s1-clone__num.mp3",
"bytes": 99055,
"sha256": "0bfb70e01370fe9f28ddbde6aebb9b23ec5cb5e312377edbdace44ad43a071a6"
},
{
"path": "chapter7/tts-quality-eval/validation/audio_fallback_probe_20260730/fishaudio-s1-clone__polyphone.mp3",
"bytes": 95293,
"sha256": "f90e5bc2f8f21f707697b5db949c1400b6fe899b3b64bd9e4e2c374bb79e0b77"
},
{
"path": "chapter7/tts-quality-eval/validation/audio_fallback_probe_20260730/results.json",
"bytes": 4469,
"sha256": "9e66a07e8817b8cfe261f65970d2dd46b4bd2fe118e9aa324feba849652d957f"
}
]
}
@@ -0,0 +1,105 @@
{
"schema_version": "2.0",
"experiment": "7-6",
"generated_at_utc": "2026-07-30T04:26:22.901148+00:00",
"command_scope": {
"providers": [
"fishaudio"
],
"configurations": [
{
"name": "fishaudio-s1-clone",
"provider": "fishaudio",
"model": "s1",
"voice": "6df3c1e14c9440e9ac978556536bf116",
"speed": 1.0
}
],
"corpus_ids": [
"num",
"polyphone"
],
"expected_records": 2,
"direct_audio_judge": true,
"optional_asr_enabled": false
},
"reference_audio": {
"path": "../../../../chapter9/controllable-tts/reference_audio/neutral_normal_formal.mp3",
"sha256": "2cf4c64bb8222399ab54c63cc41049c572ea5f1b819ffdcbc496014daae004c0"
},
"rubric_dimensions": [
"准确性",
"自然度",
"情感表达",
"音色一致性"
],
"completion": {
"successful_records": 0,
"direct_audio_four_dimension_records": 0,
"expected_records": 2,
"all_cells_complete": false,
"multi_provider": false,
"manuscript_core_complete": false
},
"records": [
{
"config": "fishaudio-s1-clone",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__num.mp3",
"audio_sha256": "0bfb70e01370fe9f28ddbde6aebb9b23ec5cb5e312377edbdace44ad43a071a6",
"audio_bytes": 99055,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__polyphone.mp3",
"audio_sha256": "f90e5bc2f8f21f707697b5db949c1400b6fe899b3b64bd9e4e2c374bb79e0b77",
"audio_bytes": 95293,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
}
],
"summary": [
{
"config": "fishaudio-s1-clone",
"n_ok": 0,
"n": 2
}
]
}
@@ -0,0 +1,89 @@
{
"schema_version": 1,
"experiment": "7-6",
"status": "complete",
"generated_at_utc": "2026-07-30T04:47:32.164712+00:00",
"run_dir": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730",
"git_commit": "f119cf510f3746cd5d071d0bce0051617f02f163",
"command": "GEMINI_API_KEY= OPENROUTER_API_KEY= python demo.py --providers openai,fishaudio --gemini --limit 4 --output validation/mistral_multimodal_20260730",
"status_reasons": [
"Eight of eight cells completed across two real synthesis providers and four challenge texts. Every cell supplied a content-hashed candidate MP3 and the same content-hashed real reference MP3 to Mistral voxtral-small-latest.",
"The judge returned all four manuscript rubric dimensions as integers in [1,5]. The structured completion gates recompute to manuscript_core_complete=true.",
"Synthesis audio was retained from the preceding real provider run rather than regenerated under the currently exhausted OpenAI account. synthesis_source_results.json independently records the same eight audio hashes and shows those cells had reached the earlier multimodal-judge stage."
],
"provider_receipt_count": 8,
"inputs": [
{
"path": "chapter7/tts-quality-eval/config.py",
"bytes": 8642,
"sha256": "891396771cd7beb32ab8e4b316f9a6f73683951e0327dcae6504d858ffd92ba1"
},
{
"path": "chapter7/tts-quality-eval/demo.py",
"bytes": 17662,
"sha256": "75260a454a3425b749cc294aad87cd4751ef8a9c6882aae1dd577f6a121e38b1"
},
{
"path": "chapter7/tts-quality-eval/pipeline.py",
"bytes": 32401,
"sha256": "0815da5ff74acd099a189a097a9a1e1aa02ade2e22ba230a2245b021374eb901"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/synthesis_source_results.json",
"bytes": 7525,
"sha256": "965ecf983521894175404106108d4c32ba8c9ff97a2ae5f740af679d04d204d8"
},
{
"path": "chapter9/controllable-tts/reference_audio/neutral_normal_formal.mp3",
"bytes": 73977,
"sha256": "2cf4c64bb8222399ab54c63cc41049c572ea5f1b819ffdcbc496014daae004c0"
}
],
"artifacts": [
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/tts1-alloy-1.0__num.mp3",
"bytes": 132960,
"sha256": "954eca94164d5af7d4a849def397e16a192d22a86168fab86f76ccd2443fb3ed"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/tts1-alloy-1.0__polyphone.mp3",
"bytes": 130560,
"sha256": "fa6e6ca29a3d17d33167c04c32b132d6aee2cb406d2acbf7bbeb13529af98abb"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/tts1-alloy-1.0__long.mp3",
"bytes": 273600,
"sha256": "c04786022e111c49f635eb361cb4cae3b786334291af86f7f36e69fff7909d1a"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/tts1-alloy-1.0__emotion.mp3",
"bytes": 116160,
"sha256": "86215ce027003e1b0a721545b594ef0325745738a46bbf927a7843da3a15b514"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/fishaudio-s1-clone__num.mp3",
"bytes": 101981,
"sha256": "6e9717e58f422db10b8e9538aa3812de456a1dde4bd9028fde928c2eaac42ad3"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/fishaudio-s1-clone__polyphone.mp3",
"bytes": 95293,
"sha256": "6bff6109ec7682f85680d8b60ea58dd48fbe5b3eeda59fb326d2288d250c85b5"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/fishaudio-s1-clone__long.mp3",
"bytes": 206052,
"sha256": "89542f05312bac767d5151f7552d0c75065cc7ecdf739dcc180b3c92a67b21c5"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/fishaudio-s1-clone__emotion.mp3",
"bytes": 104488,
"sha256": "81608431645b08be6bf7171dbb250f391b1ba7f5714d535c0e2ce323d7f6ca29"
},
{
"path": "chapter7/tts-quality-eval/validation/mistral_multimodal_20260730/results.json",
"bytes": 12890,
"sha256": "9d5ae20c9fb9852882732bdc73d7dc78714f7ad5e0025574f90b8584b2841b86"
}
]
}
@@ -0,0 +1,384 @@
{
"schema_version": "2.0",
"experiment": "7-6",
"generated_at_utc": "2026-07-30T04:47:32.164712+00:00",
"command_scope": {
"providers": [
"fishaudio",
"openai"
],
"configurations": [
{
"name": "tts1-alloy-1.0",
"provider": "openai",
"model": "tts-1",
"voice": "alloy",
"speed": 1.0
},
{
"name": "fishaudio-s1-clone",
"provider": "fishaudio",
"model": "s1",
"voice": "6df3c1e14c9440e9ac978556536bf116",
"speed": 1.0
}
],
"corpus_ids": [
"num",
"polyphone",
"long",
"emotion"
],
"expected_records": 8,
"direct_audio_judge": true,
"optional_asr_enabled": false
},
"reference_audio": {
"path": "../../../../chapter9/controllable-tts/reference_audio/neutral_normal_formal.mp3",
"sha256": "2cf4c64bb8222399ab54c63cc41049c572ea5f1b819ffdcbc496014daae004c0"
},
"rubric_dimensions": [
"准确性",
"自然度",
"情感表达",
"音色一致性"
],
"completion": {
"successful_records": 8,
"direct_audio_four_dimension_records": 8,
"expected_records": 8,
"all_cells_complete": true,
"multi_provider": true,
"manuscript_core_complete": true
},
"records": [
{
"config": "tts1-alloy-1.0",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "openai",
"ok": true,
"error": null,
"audio_path": "tts1-alloy-1.0__num.mp3",
"audio_sha256": "954eca94164d5af7d4a849def397e16a192d22a86168fab86f76ccd2443fb3ed",
"audio_bytes": 132960,
"duration": 6.648,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.061371841155235,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 3,
"音色一致性": 2
},
"reasons": {
"准确性": "合成语音准确无误地朗读了原文,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿,特别是在数字和百分点的表达上。",
"情感表达": "合成语音的语调和语速基本符合中性情感,但缺乏参考说话人语音中的自然感和情感表达。",
"音色一致性": "合成语音的音色与参考说话人语音存在明显差异,音色不一致。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "tts1-alloy-1.0",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "openai",
"ok": true,
"error": null,
"audio_path": "tts1-alloy-1.0__polyphone.mp3",
"audio_sha256": "fa6e6ca29a3d17d33167c04c32b132d6aee2cb406d2acbf7bbeb13529af98abb",
"audio_bytes": 130560,
"duration": 6.528,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.28921568627451,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "合成语音与原文完全一致,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿和重音。",
"情感表达": "语调和语速基本符合中性情感,但强调稍显不足。",
"音色一致性": "合成语音的音色与参考说话人有一定差异,但总体还算接近。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "tts1-alloy-1.0",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "openai",
"ok": true,
"error": null,
"audio_path": "tts1-alloy-1.0__long.mp3",
"audio_sha256": "c04786022e111c49f635eb361cb4cae3b786334291af86f7f36e69fff7909d1a",
"audio_bytes": 273600,
"duration": 13.68,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.45906432748538,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "合成语音与原文完全一致,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿和重音。",
"情感表达": "语调和语速基本符合中性情感,但强调不够明显。",
"音色一致性": "合成语音的音色与参考说话人有一些差异,但总体还算接近。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "tts1-alloy-1.0",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "openai",
"ok": true,
"error": null,
"audio_path": "tts1-alloy-1.0__emotion.mp3",
"audio_sha256": "86215ce027003e1b0a721545b594ef0325745738a46bbf927a7843da3a15b514",
"audio_bytes": 116160,
"duration": 5.808,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 5.3374655647382925,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "没有漏读、错读、添读、数字、专名和多音字。",
"自然度": "有一些机器感,但总体流畅度较好。",
"情感表达": "语调和语速表现出兴奋,但强调不够明显。",
"音色一致性": "音色与参考说话人有一些差异,但总体相似。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "fishaudio",
"ok": true,
"error": null,
"audio_path": "fishaudio-s1-clone__num.mp3",
"audio_sha256": "6e9717e58f422db10b8e9538aa3812de456a1dde4bd9028fde928c2eaac42ad3",
"audio_bytes": 101981,
"duration": 6.373813,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.236082859663439,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "合成语音准确无误地朗读了原文,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿和重音。",
"情感表达": "合成语音的语调和语速基本符合中性情感,但强调不够明显。",
"音色一致性": "合成语音的音色与参考说话人有一些差异,但总体还算相似。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "fishaudio",
"ok": true,
"error": null,
"audio_path": "fishaudio-s1-clone__polyphone.mp3",
"audio_sha256": "6bff6109ec7682f85680d8b60ea58dd48fbe5b3eeda59fb326d2288d250c85b5",
"audio_bytes": 95293,
"duration": 5.955813,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.701289311803443,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "合成语音与原文完全一致,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿和重音。",
"情感表达": "语调和语速基本符合中性情感,但强调稍显不足。",
"音色一致性": "合成语音的音色与参考说话人有一定差异,但总体还算接近。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "fishaudio",
"ok": true,
"error": null,
"audio_path": "fishaudio-s1-clone__long.mp3",
"audio_sha256": "89542f05312bac767d5151f7552d0c75065cc7ecdf739dcc180b3c92a67b21c5",
"audio_bytes": 206052,
"duration": 12.87825,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.7366684137984585,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "合成语音与原文完全一致,没有漏读、错读、添读、数字、专名和多音字的问题。",
"自然度": "合成语音流畅度较好,但有一些不自然的停顿和重音。",
"情感表达": "合成语音的语调和语速基本符合中性情感,但缺乏一些细微的情感变化。",
"音色一致性": "合成语音的音色与参考说话人有一些差异,但总体上还算相似。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "fishaudio",
"ok": true,
"error": null,
"audio_path": "fishaudio-s1-clone__emotion.mp3",
"audio_sha256": "81608431645b08be6bf7171dbb250f391b1ba7f5714d535c0e2ce323d7f6ca29",
"audio_bytes": 104488,
"duration": 6.5305,
"hypothesis": null,
"cer": null,
"asr_accuracy": null,
"speed": 4.746956588316362,
"scores": {
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
"reasons": {
"准确性": "没有漏读、错读、添读、数字、专名和多音字。",
"自然度": "有轻微的机器感,但总体流畅度较好。",
"情感表达": "语调和语速表现出兴奋,但强调稍显不足。",
"音色一致性": "音色与参考说话人有明显差异。"
},
"judge_model": "mistral/voxtral-small-latest",
"evidence_mode": "direct-audio-with-reference",
"judge_provider_attempts": [
{
"provider": "Mistral Voxtral API",
"model": "voxtral-small-latest",
"status": "ok",
"attempts": 1
}
]
}
],
"summary": [
{
"config": "fishaudio-s1-clone",
"n_ok": 4,
"n": 4,
"cer": null,
"asr_accuracy": null,
"准确性": 5,
"自然度": 4,
"情感表达": 4,
"音色一致性": 3
},
{
"config": "tts1-alloy-1.0",
"n_ok": 4,
"n": 4,
"cer": null,
"asr_accuracy": null,
"准确性": 5,
"自然度": 4,
"情感表达": 3.75,
"音色一致性": 2.75
}
]
}
@@ -0,0 +1,208 @@
{
"schema_version": "2.0",
"experiment": "7-6",
"generated_at_utc": "2026-07-30T04:17:40.702999+00:00",
"command_scope": {
"providers": [
"fishaudio",
"openai"
],
"configurations": [
{
"name": "tts1-alloy-1.0",
"provider": "openai",
"model": "tts-1",
"voice": "alloy",
"speed": 1.0
},
{
"name": "fishaudio-s1-clone",
"provider": "fishaudio",
"model": "s1",
"voice": "6df3c1e14c9440e9ac978556536bf116",
"speed": 1.0
}
],
"corpus_ids": [
"num",
"polyphone",
"long",
"emotion",
"sad",
"question"
],
"expected_records": 12,
"direct_audio_judge": true,
"optional_asr_enabled": false
},
"reference_audio": {
"path": "../../../chapter9/controllable-tts/reference_audio/neutral_normal_formal.mp3",
"sha256": "2cf4c64bb8222399ab54c63cc41049c572ea5f1b819ffdcbc496014daae004c0"
},
"rubric_dimensions": [
"准确性",
"自然度",
"情感表达",
"音色一致性"
],
"completion": {
"successful_records": 0,
"direct_audio_four_dimension_records": 0,
"expected_records": 12,
"all_cells_complete": false,
"multi_provider": true,
"manuscript_core_complete": false
},
"records": [
{
"config": "tts1-alloy-1.0",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "openai",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "tts1-alloy-1.0__num.mp3",
"audio_sha256": "954eca94164d5af7d4a849def397e16a192d22a86168fab86f76ccd2443fb3ed",
"audio_bytes": 132960,
"failed_stage": "multimodal_judge"
},
{
"config": "tts1-alloy-1.0",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "openai",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "tts1-alloy-1.0__polyphone.mp3",
"audio_sha256": "fa6e6ca29a3d17d33167c04c32b132d6aee2cb406d2acbf7bbeb13529af98abb",
"audio_bytes": 130560,
"failed_stage": "multimodal_judge"
},
{
"config": "tts1-alloy-1.0",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "openai",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "tts1-alloy-1.0__long.mp3",
"audio_sha256": "c04786022e111c49f635eb361cb4cae3b786334291af86f7f36e69fff7909d1a",
"audio_bytes": 273600,
"failed_stage": "multimodal_judge"
},
{
"config": "tts1-alloy-1.0",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "openai",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "tts1-alloy-1.0__emotion.mp3",
"audio_sha256": "86215ce027003e1b0a721545b594ef0325745738a46bbf927a7843da3a15b514",
"audio_bytes": 116160,
"failed_stage": "multimodal_judge"
},
{
"config": "tts1-alloy-1.0",
"sample": "sad",
"challenge": "悲伤情感/低语速低语调",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "question",
"challenge": "对话文体/疑问句升调",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "fishaudio-s1-clone",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__num.mp3",
"audio_sha256": "6e9717e58f422db10b8e9538aa3812de456a1dde4bd9028fde928c2eaac42ad3",
"audio_bytes": 101981,
"failed_stage": "multimodal_judge"
},
{
"config": "fishaudio-s1-clone",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__polyphone.mp3",
"audio_sha256": "6bff6109ec7682f85680d8b60ea58dd48fbe5b3eeda59fb326d2288d250c85b5",
"audio_bytes": 95293,
"failed_stage": "multimodal_judge"
},
{
"config": "fishaudio-s1-clone",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__long.mp3",
"audio_sha256": "89542f05312bac767d5151f7552d0c75065cc7ecdf739dcc180b3c92a67b21c5",
"audio_bytes": 206052,
"failed_stage": "multimodal_judge"
},
{
"config": "fishaudio-s1-clone",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__emotion.mp3",
"audio_sha256": "81608431645b08be6bf7171dbb250f391b1ba7f5714d535c0e2ce323d7f6ca29",
"audio_bytes": 104488,
"failed_stage": "multimodal_judge"
},
{
"config": "fishaudio-s1-clone",
"sample": "sad",
"challenge": "悲伤情感/低语速低语调",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__sad.mp3",
"audio_sha256": "bf16b438885b651681197f15ad969a447b8b5cf781a298600580af5bea049f4c",
"audio_bytes": 87352,
"failed_stage": "multimodal_judge"
},
{
"config": "fishaudio-s1-clone",
"sample": "question",
"challenge": "对话文体/疑问句升调",
"provider": "fishaudio",
"ok": false,
"error": "RuntimeError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__question.mp3",
"audio_sha256": "1d5f16e92d66e1855c57b264e3ec1ddaf9e09aa9cfedca38fb5dfd623f829ad3",
"audio_bytes": 76067,
"failed_stage": "multimodal_judge"
}
],
"summary": [
{
"config": "tts1-alloy-1.0",
"n_ok": 0,
"n": 6
},
{
"config": "fishaudio-s1-clone",
"n_ok": 0,
"n": 6
}
]
}
@@ -0,0 +1,68 @@
{
"schema_version": 1,
"experiment": "7-6",
"status": "incomplete",
"generated_at_utc": "2026-07-30T04:32:15.010689+00:00",
"run_dir": "chapter7/tts-quality-eval/validation/real_multimodal_20260730",
"git_commit": "f119cf510f3746cd5d071d0bce0051617f02f163",
"command": "python demo.py --providers openai,fishaudio --gemini --output validation/real_multimodal_20260730",
"provider_receipt_count": 6,
"status_reasons": [
"Six content-hashed Fish Audio MP3 artifacts were available and re-evaluated, but both the Google Gemini API and exact OpenRouter two-input_audio route rejected their configured credentials; zero direct-audio four-dimension judge cells completed.",
"The OpenAI account returned insufficient_quota before synthesis for all six requested cross-provider cells."
],
"inputs": [
{
"path": "chapter7/tts-quality-eval/config.py",
"bytes": 8642,
"sha256": "891396771cd7beb32ab8e4b316f9a6f73683951e0327dcae6504d858ffd92ba1"
},
{
"path": "chapter7/tts-quality-eval/demo.py",
"bytes": 17225,
"sha256": "c2da1f44b3ac3ec9e9b6648ee535e57c8fa757a14a45028f1e125ed9cb8f1938"
},
{
"path": "chapter7/tts-quality-eval/pipeline.py",
"bytes": 27511,
"sha256": "db62ac8058561ae22b9a2dacd67aec42176f181a401e162009e1a3be7360ed54"
}
],
"artifacts": [
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__emotion.mp3",
"bytes": 102817,
"sha256": "4eca80508f1d6f7a5b50b87de0e329e700097fc01a092e38e47fb70d7dc3675a"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__long.mp3",
"bytes": 203127,
"sha256": "d0947fc60450d4668e75376eb56a714d80a99e3148ee76219c59133d7364eb12"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__num.mp3",
"bytes": 99055,
"sha256": "15936f94727239ab9aadbc3814d70375fad93c89efd9b8562605d62790860898"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__polyphone.mp3",
"bytes": 97801,
"sha256": "4f8c45b00455a9dbda4b1feebbda9f09de50ec9458d367ea701798ec05972a88"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__question.mp3",
"bytes": 75231,
"sha256": "c48dfadf2f1eaa6b01a924e1de5ebf728cfbfad9df14234a70629e0e5890800a"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/fishaudio-s1-clone__sad.mp3",
"bytes": 80665,
"sha256": "295161d6fc7a169fc28ebd3fd07e2acaac6fca2f0cc24db6a51c3dc431310cf9"
},
{
"path": "chapter7/tts-quality-eval/validation/real_multimodal_20260730/results.json",
"bytes": 14278,
"sha256": "be1b2ea6fc585eceeacc7ba0d8f2552b41bfb8a245419063c69aa538775ef46d"
}
]
}
@@ -0,0 +1,280 @@
{
"schema_version": "2.0",
"experiment": "7-6",
"generated_at_utc": "2026-07-30T04:32:04.726815+00:00",
"command_scope": {
"providers": [
"fishaudio",
"openai"
],
"configurations": [
{
"name": "tts1-alloy-1.0",
"provider": "openai",
"model": "tts-1",
"voice": "alloy",
"speed": 1.0
},
{
"name": "fishaudio-s1-clone",
"provider": "fishaudio",
"model": "s1",
"voice": "6df3c1e14c9440e9ac978556536bf116",
"speed": 1.0
}
],
"corpus_ids": [
"num",
"polyphone",
"long",
"emotion",
"sad",
"question"
],
"expected_records": 12,
"direct_audio_judge": true,
"optional_asr_enabled": false
},
"reference_audio": {
"path": "../../../../chapter9/controllable-tts/reference_audio/neutral_normal_formal.mp3",
"sha256": "2cf4c64bb8222399ab54c63cc41049c572ea5f1b819ffdcbc496014daae004c0"
},
"rubric_dimensions": [
"准确性",
"自然度",
"情感表达",
"音色一致性"
],
"completion": {
"successful_records": 0,
"direct_audio_four_dimension_records": 0,
"expected_records": 12,
"all_cells_complete": false,
"multi_provider": true,
"manuscript_core_complete": false
},
"records": [
{
"config": "tts1-alloy-1.0",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "sad",
"challenge": "悲伤情感/低语速低语调",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "tts1-alloy-1.0",
"sample": "question",
"challenge": "对话文体/疑问句升调",
"provider": "openai",
"ok": false,
"error": "RateLimitError: Error code: 429 - {'error': {'message': 'You have no credits remaining. Add credits to continue using the API at https://platform.openai.com/settings/organization/billing/.', 'type': 'insufficient_quota', 'param': None, 'code': 'credit_balance_exhausted'}}",
"failed_stage": "synthesis"
},
{
"config": "fishaudio-s1-clone",
"sample": "num",
"challenge": "数字/百分比/日期",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__num.mp3",
"audio_sha256": "15936f94727239ab9aadbc3814d70375fad93c89efd9b8562605d62790860898",
"audio_bytes": 99055,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "polyphone",
"challenge": "多音字(行/长/重/还)",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__polyphone.mp3",
"audio_sha256": "4f8c45b00455a9dbda4b1feebbda9f09de50ec9458d367ea701798ec05972a88",
"audio_bytes": 97801,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "long",
"challenge": "长句/新闻文体",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__long.mp3",
"audio_sha256": "d0947fc60450d4668e75376eb56a714d80a99e3148ee76219c59133d7364eb12",
"audio_bytes": 203127,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "emotion",
"challenge": "专有名词 + 感叹情感",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__emotion.mp3",
"audio_sha256": "4eca80508f1d6f7a5b50b87de0e329e700097fc01a092e38e47fb70d7dc3675a",
"audio_bytes": 102817,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "sad",
"challenge": "悲伤情感/低语速低语调",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__sad.mp3",
"audio_sha256": "295161d6fc7a169fc28ebd3fd07e2acaac6fca2f0cc24db6a51c3dc431310cf9",
"audio_bytes": 80665,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
},
{
"config": "fishaudio-s1-clone",
"sample": "question",
"challenge": "对话文体/疑问句升调",
"provider": "fishaudio",
"ok": false,
"error": "JudgeRouteError: OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}",
"audio_path": "fishaudio-s1-clone__question.mp3",
"audio_sha256": "c48dfadf2f1eaa6b01a924e1de5ebf728cfbfad9df14234a70629e0e5890800a",
"audio_bytes": 75231,
"failed_stage": "multimodal_judge",
"judge_provider_attempts": [
{
"provider": "Google Gemini API",
"model": "gemini-3.5-flash",
"status": "unavailable",
"error": "Gemini HTTP 400: {\n \"error\": {\n \"code\": 400,\n \"message\": \"API key not valid. Please pass a valid API key.\",\n \"status\": \"INVALID_ARGUMENT\",\n \"details\": [\n {\n \"@type\": \"type.googleapis.com/google.rpc.ErrorInfo\",\n \"reason\": \"API_KEY_INVALID\",\n \"domain\": \"googleapis.com\",\n \"metadata\": {\n \"service\": \"generativelanguage.googleapis.com\"\n }\n },\n {\n \"@type\": \"type.googleapis.com/google.rpc.LocalizedMessage\",\n \"locale\": \"en-US\",\n \"message\": \"API key not valid. Please pass a valid API key.\"\n }\n ]\n }\n}\n"
},
{
"provider": "OpenRouter audio route",
"model": "google/gemini-3.5-flash",
"status": "unavailable",
"error": "OpenRouter audio HTTP 401: {\"error\":{\"message\":\"User not found.\",\"code\":401}}"
}
]
}
],
"summary": [
{
"config": "tts1-alloy-1.0",
"n_ok": 0,
"n": 6
},
{
"config": "fishaudio-s1-clone",
"n_ok": 0,
"n": 6
}
]
}