import json
import time
import uuid
import requests
# task_id:"dc0c5a45-d635-4439-a543-ec63aab55453"
# task_id:"470e35f1-4fcf-4f60-892c-21c75f86b5c2"

def extract_byteance_text(response_data):
    """
    从字节跳动语音识别 API 的响应中提取识别文本。
    成功时返回 result.text，失败时返回 "错误码：xxx，错误信息：xxx"。

    :param response_data: API 返回的 JSON 字符串 或 已解析的 dict
    :return: 识别文本 或 错误描述
    """
    # 1. 解析 JSON
    if isinstance(response_data, str):
        try:
            data = json.loads(response_data)
        except json.JSONDecodeError:
            return "错误：响应不是合法的 JSON 格式"
    else:
        data = response_data

    # 2. 检查是否有错误字段（根据火山引擎 API 规范）
    code = data.get("code")
    message = data.get("message")
    
    # 如果 code 存在且不为 0，或 message 非空，视为错误
    if code is not None and code != 0:
        return f"错误码：{code}，错误信息：{message or '无详细信息'}"
    if message:
        return f"错误信息：{message}"

    # 3. 尝试提取识别文本（成功响应结构）
    try:
        text = data["result"]["text"]
        return text
    except KeyError:
        # 如果缺少 result.text，可能是响应结构发生变化
        return "错误：响应中缺少 result.text 字段"


def submit_task():

    submit_url = "https://openspeech.bytedance.com/api/v3/auc/bigmodel/submit"
    # submit_url = "https://openspeech-direct.zijieapi.com/api/v3/auc/bigmodel/submit"

    task_id = str(uuid.uuid4())

    headers = {
        "X-Api-App-Key": appid,
        "X-Api-Access-Key": token,
        "X-Api-Resource-Id": x_api_resource_id,
        "X-Api-Request-Id": task_id,
        "X-Api-Sequence": "-1"
    }

    request = {
        "user": {
            "uid": "fake_uid"
        },
        "audio": {
            "url": file_url,
            # "format": "mp3",
            # "codec": "map3",
            # "rate": 48000,
            # "bits": 16,
            #"channel": 2
        },
        "request": {
            "model_name": "bigmodel",
            "enable_channel_split": True, 
            "enable_ddc": True, 
            "enable_speaker_info": True, 
            "enable_punc": True, 
            "enable_itn": True,
            # "enable_itn": True,
            # "enable_punc": True,
            # "enable_ddc": True,
            # "show_utterances": True,
            # "enable_channel_split": True,
            # "vad_segment": True,
            # "enable_speaker_info": True,
            "corpus": {
                # "boosting_table_name": "test",
                "correct_table_name": "",
                "context": ""
            }
        }
    }
    print(f'Submit task id: {task_id}')
    response = requests.post(submit_url, data=json.dumps(request), headers=headers)
    if 'X-Api-Status-Code' in response.headers and response.headers["X-Api-Status-Code"] == "20000000":
        print(f'Submit task response header X-Api-Status-Code: {response.headers["X-Api-Status-Code"]}')
        print(f'Submit task response header X-Api-Message: {response.headers["X-Api-Message"]}')
        x_tt_logid = response.headers.get("X-Tt-Logid", "")
        print(f'Submit task response header X-Tt-Logid: {response.headers["X-Tt-Logid"]}\n')
        return task_id, x_tt_logid
    else:
        print(f'Submit task failed and the response headers are: {response.headers}')
        exit(1)
    return task_id


def query_task(task_id, x_tt_logid):
    url = "https://openspeech.bytedance.com/api/v3/auc/bigmodel/query"
    headers = {
        "X-Api-App-Key": appid,
        "X-Api-Access-Key": token,
        "X-Api-Resource-Id": x_api_resource_id,
        "X-Api-Request-Id": task_id,
        "Content-Type": "application/json"
    }
    payload = {}
    
    response = requests.post(url, headers=headers, json=payload)
    return response


def main():
    task_id, x_tt_logid = submit_task()
    while True:
        query_response = query_task(task_id, x_tt_logid)
        code = query_response.headers.get('X-Api-Status-Code', "")
        print(query_response.text)
        if query_response.text == "{}":
            continue
        if code == '20000000':  # task finished
            print(extract_byteance_text(query_response.text))
            print("SUCCESS!")
            exit(0)
        elif code != '20000001' and code != '20000002':  # task failed
            print("FAILED!")
            exit(1)
        time.sleep(1)

# 需要使用在线url，推荐使用TOS
#file_url = "https://aihuanxin.cn/kunlun/ingress/api/68b329/0afa024051ea4765b95d5405766aa2e8/ai-6d0d567e3d194163aa0c05822759ef42/service-e4e907b73b8641a1b7d0e79ad1017549/download/BAC009S0764W0358.wav"
file_url = "http://115.190.192.57/v20260807/BAC009S0764W0358.wav"

# 填入控制台获取的app id和access token
# 注意事项: 新版控制台只需要 app_key 即可,不需要 access_key;老版本控制台都需要
appid = "8663136047"
token = "79F8S_n88XIh2vpHvVoZ4_Ypk4nodA0Y"
x_api_resource_id = "volc.seedasr.auc"

if __name__ == '__main__':
    main()
