"""
语音处理工具 - 将用户的语音输入转换为文本
"""
import base64
from typing import Optional
from langchain.tools import tool
from coze_coding_dev_sdk import ASRClient
from coze_coding_utils.runtime_ctx.context import new_context
import logging

logger = logging.getLogger(__name__)


@tool
def transcribe_audio(
    audio_url: Optional[str] = None,
    audio_base64: Optional[str] = None
) -> str:
    """
    将语音转换为文字。支持通过URL或Base64编码传入音频文件。
    
    参数:
        audio_url: 音频文件的URL地址（支持MP3/WAV/OGG/M4A格式）
        audio_base64: Base64编码的音频数据（如果提供audio_url，此参数会被忽略）
    
    返回:
        识别出的文本内容
        
    示例:
        transcribe_audio(audio_url="https://example.com/voice.mp3")
        transcribe_audio(audio_base64="base64_encoded_audio_data")
    """
    try:
        # 获取上下文
        ctx = new_context(method="asr.recognize")
        
        # 参数验证
        if not audio_url and not audio_base64:
            return "错误：请提供音频URL或Base64编码的音频数据"
        
        # 初始化ASR客户端
        client = ASRClient(ctx=ctx)
        
        # 调用ASR服务
        if audio_url:
            logger.info(f"正在识别音频URL: {audio_url}")
            text, data = client.recognize(
                uid="property_assistant_user",
                url=audio_url
            )
        else:
            logger.info("正在识别Base64音频数据")
            text, data = client.recognize(
                uid="property_assistant_user",
                base64_data=audio_base64
            )
        
        # 返回识别结果
        if text:
            logger.info(f"语音识别成功: {text}")
            return text
        else:
            return "未能识别出语音内容，请确保音频清晰且时长不超过2小时"
            
    except Exception as e:
        error_msg = f"语音识别失败: {str(e)}"
        logger.error(error_msg, exc_info=True)
        return error_msg
