("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expect...

2026年05月23日 13:26 18.86 秒 success

错误信息

[2026-05-23 13:23:38.492] [Core] [ERRO] [v4.23.6] [result_decorate.stage:337]: Traceback (most recent call last): File "/AstrBot/astrbot/core/pipeline/result_decorate/stage.py", line 300, in process audio_path = await tts_provider.get_audio(comp.text) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/AstrBot/astrbot/core/provider/sources/mimo_tts_api_source.py", line 115, in get_audio data = response.json() ^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/site-packages/httpx/_models.py", line 832, in json return jsonlib.loads(self.content, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/json/__init__.py", line 346, in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/json/decoder.py", line 338, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.12/json/decoder.py", line 356, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) [2026-05-23 13:23:38.492] [Core] [ERRO] [v4.23.6] [result_decorate.stage:338]: TTS 失败,使用文本发送。

AI 解决方案

🌐 错误翻译


原文:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
译文:JSON解码器错误:期望值:第1行第1列(字符0)

🎯 原因分析


根本原因是 AstrBot 调用 Mimo TTS API 服务后,返回的响应内容不是有效的JSON格式。错误发生在 mimo_tts_api_source.py 第115行的 response.json() 调用。
  • char 0 表明响应体可能为空(””)或为非JSON内容(如HTML错误页面)。

  • 可能的触发场景:

  • 1. TTS API服务地址错误或网络不通。
    2. API密钥(Key)失效或配额用尽,导致服务返回了错误的网页或纯文本提示。
    3. API服务暂时不可用。

    💡 解决方案


    在调用 .json() 前,应先检查HTTP响应状态码和内容类型,并添加异常处理,以避免程序崩溃并获取更明确的错误信息。
    # 在文件 `/AstrBot/astrbot/core/provider/sources/mimo_tts_api_source.py` 第115行附近修改
    # 修复前:
    # data = response.json()
    
    # 修复后:
    import logging
    from httpx import HTTPStatusError
    
    # ... 在 get_audio 方法内 ...
    
    try:
        # 首先检查HTTP请求是否成功
        response.raise_for_status()
        # 检查响应内容是否为JSON
        if 'application/json' not in response.headers.get('content-type', ''):
            raise ValueError(f"API返回了非JSON格式的内容,Content-Type: {response.headers.get('content-type')}")
        data = response.json()
    except HTTPStatusError as e:
        logging.error(f"TTS API请求失败,状态码:{e.response.status_code},响应:{e.response.text[:200]}") # 记录前200字符
        raise  # 或根据业务逻辑返回默认值
    except (json.JSONDecodeError, ValueError) as e:
        logging.error(f"TTS API返回内容解析失败:{e},原始响应:{response.text[:200]}")
        raise
    

    🛡️ 预防措施


  • 配置验证:在应用启动或调用前,验证TTS API的地址、密钥(Key)等配置信息是否正确且有效。

  • 健壮性编码:所有对外部API的调用都应包含完善的异常处理(网络异常、HTTP错误、响应格式错误)和重试机制(针对瞬时故障)。