[{"data":1,"prerenderedAt":1720},["ShallowReactive",2],{"guide-\u002Fguides-zh\u002Fsdk":3,"developer-code-1wjk1yk":1703,"developer-code-rxqm9f":1704,"developer-code-13d8hrj":1705,"developer-code-1cfhzmk":1706,"developer-code-csrwmq":1707,"developer-code-znejch":1708,"developer-code-x94mlc":1709,"developer-code-1ao897t":1710,"developer-code-1h64ruz":1711,"developer-code-1ueolur":1712,"developer-code-12t7s0t":1713,"developer-code-1czdkeo":1714,"developer-code-1xagynz":1715,"developer-code-kz8rgy":1716,"developer-code-bw2srb":1717,"developer-code-1tcriyf":1718,"developer-code-kgaz19":1719},{"id":4,"title":5,"body":6,"description":1694,"extension":1695,"meta":1696,"navigation":1697,"path":1699,"seo":1700,"stem":1701,"__hash__":1702},"guidesZh\u002Fguides-zh\u002Fsdk.md","VisionStory Python SDK",{"type":7,"value":8,"toc":1675},"minimark",[9,22,25,30,55,59,68,71,118,135,139,144,155,163,204,207,252,336,356,360,363,386,424,431,434,514,528,548,560,564,570,719,757,761,771,807,815,819,822,887,891,923,934,938,998,1013,1017,1028,1167,1174,1178,1245,1249,1252,1304,1313,1317,1391,1395,1425,1429,1456,1640,1671],[10,11,12,16,17,21],"p",{},[13,14,15],"code",{},"visionstory"," 是 VisionStory API 的官方 Python SDK。这个",[18,19,20],"strong",{},"无运行时依赖","的客户端仅使用 Python 标准库，负责认证、JSON 处理、Base64 上传、异步轮询、错误处理和媒体下载。",[10,23,24],{},"需要 Python 3.10 或更高版本。",[26,27,29],"h2",{"id":28},"install-the-visionstory-python-sdk","安装 VisionStory Python SDK",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-bash shiki shiki-themes github-light github-dark","pip install visionstory\n","bash","",[13,38,39],{"__ignoreMap":36},[40,41,44,48,52],"span",{"class":42,"line":43},"line",1,[40,45,47],{"class":46},"sScJk","pip",[40,49,51],{"class":50},"sZZnC"," install",[40,53,54],{"class":50}," visionstory\n",[26,56,58],{"id":57},"discover-new-sdk-features","发现 SDK 新功能",[10,60,61,62,67],{},"在交互式 Python 会话中，SDK 每天最多检查一次 VisionStory 版本清单；有新版时，每周最多显示一次升级提醒，包含最新版本、版本标题、升级命令和",[63,64,66],"a",{"href":65},"\u002Fguides\u002Fchangelog","更新日志","。离线时会静默跳过检查，不会修改已安装的包。",[10,69,70],{},"在 Notebook、服务端进程或 CI 任务中，可以主动检查更新：",[31,72,76],{"className":73,"code":74,"language":75,"meta":36,"style":36},"language-python shiki shiki-themes github-light github-dark","from visionstory import check_for_updates\n\nprint(check_for_updates())\n# installed_version, latest_version, update_available, highlights, update_command\n","python",[13,77,78,94,101,111],{"__ignoreMap":36},[40,79,80,84,88,91],{"class":42,"line":43},[40,81,83],{"class":82},"szBVR","from",[40,85,87],{"class":86},"sVt8B"," visionstory ",[40,89,90],{"class":82},"import",[40,92,93],{"class":86}," check_for_updates\n",[40,95,97],{"class":42,"line":96},2,[40,98,100],{"emptyLinePlaceholder":99},true,"\n",[40,102,104,108],{"class":42,"line":103},3,[40,105,107],{"class":106},"sj4cs","print",[40,109,110],{"class":86},"(check_for_updates())\n",[40,112,114],{"class":42,"line":113},4,[40,115,117],{"class":116},"sJ8bj","# installed_version, latest_version, update_available, highlights, update_command\n",[10,119,120,121,124,125,128,129,134],{},"设置 ",[13,122,123],{},"VISIONSTORY_UPDATE_CHECK=0"," 可关闭被动提醒；设置 ",[13,126,127],{},"VISIONSTORY_UPDATE_CHECK=1"," 可强制启用交互式提醒行为。机器可读版本清单位于 ",[63,130,132],{"href":131},"\u002Freleases\u002Flatest.json",[13,133,131],{},"。",[26,136,138],{"id":137},"authenticate-the-python-client","配置 Python 客户端认证",[140,141,143],"h3",{"id":142},"default-setup-use-the-official-api","默认配置：连接官方 API",[10,145,146,147,150,151,154],{},"一般情况下，只需配置 ",[13,148,149],{},"VISIONSTORY_API_KEY","，然后使用 ",[13,152,153],{},"from_env()","。不需要填写域名，也不必调整超时时间。",[10,156,157,158,162],{},"先到 ",[63,159,161],{"href":160},"\u002Fapi-keys","API Key 页面","创建密钥，再通过应用的环境变量或部署平台的密钥存储提供给 Python 进程。不要把真实密钥写入代码、聊天或提交到 Git 的环境文件。",[31,164,166],{"className":73,"code":165,"language":75,"meta":36,"style":36},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env()\nprint(client.get_credits())  # Read-only authentication check; does not generate media\n",[13,167,168,179,183,194],{"__ignoreMap":36},[40,169,170,172,174,176],{"class":42,"line":43},[40,171,83],{"class":82},[40,173,87],{"class":86},[40,175,90],{"class":82},[40,177,178],{"class":86}," VisionStoryClient\n",[40,180,181],{"class":42,"line":96},[40,182,100],{"emptyLinePlaceholder":99},[40,184,185,188,191],{"class":42,"line":103},[40,186,187],{"class":86},"client ",[40,189,190],{"class":82},"=",[40,192,193],{"class":86}," VisionStoryClient.from_env()\n",[40,195,196,198,201],{"class":42,"line":113},[40,197,107],{"class":106},[40,199,200],{"class":86},"(client.get_credits())  ",[40,202,203],{"class":116},"# Read-only authentication check; does not generate media\n",[10,205,206],{},"如果只是本地测试，还没有配置环境变量，可在自己的终端中先运行下面的 Python 代码，再创建客户端。输入会隐藏；密钥仅在当前 Python 进程内有效，不会保存到后续终端：",[31,208,210],{"className":73,"code":209,"language":75,"meta":36,"style":36},"import getpass\nimport os\n\nos.environ[\"VISIONSTORY_API_KEY\"] = getpass.getpass(\"VisionStory API key (hidden): \")\n",[13,211,212,219,226,230],{"__ignoreMap":36},[40,213,214,216],{"class":42,"line":43},[40,215,90],{"class":82},[40,217,218],{"class":86}," getpass\n",[40,220,221,223],{"class":42,"line":96},[40,222,90],{"class":82},[40,224,225],{"class":86}," os\n",[40,227,228],{"class":42,"line":103},[40,229,100],{"emptyLinePlaceholder":99},[40,231,232,235,238,241,243,246,249],{"class":42,"line":113},[40,233,234],{"class":86},"os.environ[",[40,236,237],{"class":50},"\"VISIONSTORY_API_KEY\"",[40,239,240],{"class":86},"] ",[40,242,190],{"class":82},[40,244,245],{"class":86}," getpass.getpass(",[40,247,248],{"class":50},"\"VisionStory API key (hidden): \"",[40,250,251],{"class":86},")\n",[253,254,255,271],"table",{},[256,257,258],"thead",{},[259,260,261,265,268],"tr",{},[262,263,264],"th",{},"配置项",[262,266,267],{},"默认行为",[262,269,270],{},"自定义方式",[272,273,274,294,321],"tbody",{},[259,275,276,280,288],{},[277,278,279],"td",{},"API Key",[277,281,282,284,285,287],{},[13,283,153],{}," 读取 ",[13,286,149],{},"；缺失或为空时会报错",[277,289,290,291],{},"设置环境变量，或在构造函数中传入 ",[13,292,293],{},"api_key",[259,295,296,299,309],{},[277,297,298],{},"API 地址",[277,300,301,302,305,306],{},"未设置 ",[13,303,304],{},"VISIONSTORY_API_BASE"," 时使用 ",[13,307,308],{},"https:\u002F\u002Fopenapi.visionstory.ai",[277,310,311,312,314,315,317,318],{},"为 ",[13,313,153],{}," 设置 ",[13,316,304],{},"，或在构造函数中传入 ",[13,319,320],{},"base_url",[259,322,323,326,329],{},[277,324,325],{},"HTTP 超时",[277,327,328],{},"未被具体操作覆盖的请求默认为 60 秒",[277,330,331,332,335],{},"传入 ",[13,333,334],{},"request_timeout","，单位为秒",[337,338,339],"blockquote",{},[10,340,341,344,345,347,348,351,352,355],{},[18,342,343],{},"SDK 与 CLI 的认证相互独立。"," ",[13,346,153],{}," 只读取当前进程的环境变量，不会自动加载 ",[13,349,350],{},".env"," 文件，也不会读取 ",[13,353,354],{},"visionstory login"," 保存的密钥。请在创建客户端前，由应用加载或注入环境变量。",[140,357,359],{"id":358},"custom-setup-choose-another-api-address","自定义配置：使用其他 API 地址",[10,361,362],{},"仅在需要使用可信且兼容 VisionStory API 的代理、网关或测试服务时配置。最简单的方式是修改环境变量，Python 代码保持不变：",[31,364,366],{"className":33,"code":365,"language":35,"meta":36,"style":36},"# macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\nexport VISIONSTORY_API_BASE=\"https:\u002F\u002Fyour-api.example.com\"\n",[13,367,368,373],{"__ignoreMap":36},[40,369,370],{"class":42,"line":43},[40,371,372],{"class":116},"# macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\n",[40,374,375,378,381,383],{"class":42,"line":96},[40,376,377],{"class":82},"export",[40,379,380],{"class":86}," VISIONSTORY_API_BASE",[40,382,190],{"class":82},[40,384,385],{"class":50},"\"https:\u002F\u002Fyour-api.example.com\"\n",[31,387,389],{"className":73,"code":388,"language":75,"meta":36,"style":36},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env(request_timeout=120)\n",[13,390,391,401,405],{"__ignoreMap":36},[40,392,393,395,397,399],{"class":42,"line":43},[40,394,83],{"class":82},[40,396,87],{"class":86},[40,398,90],{"class":82},[40,400,178],{"class":86},[40,402,403],{"class":42,"line":96},[40,404,100],{"emptyLinePlaceholder":99},[40,406,407,409,411,414,417,419,422],{"class":42,"line":103},[40,408,187],{"class":86},[40,410,190],{"class":82},[40,412,413],{"class":86}," VisionStoryClient.from_env(",[40,415,334],{"class":416},"s4XuR",[40,418,190],{"class":82},[40,420,421],{"class":106},"120",[40,423,251],{"class":86},[10,425,426,427,430],{},"恢复官方地址时，移除覆盖设置（在同一 Shell 中执行 ",[13,428,429],{},"unset VISIONSTORY_API_BASE","），然后重新创建客户端。不要将变量设为空字符串。",[10,432,433],{},"需要为单个客户端指定配置时，直接传入参数：",[31,435,437],{"className":73,"code":436,"language":75,"meta":36,"style":36},"import os\nfrom visionstory import VisionStoryClient\n\nclient = VisionStoryClient(\n    api_key=os.environ[\"VISIONSTORY_API_KEY\"],\n    base_url=\"https:\u002F\u002Fyour-api.example.com\",\n    request_timeout=120,\n)\n",[13,438,439,445,455,459,468,483,497,509],{"__ignoreMap":36},[40,440,441,443],{"class":42,"line":43},[40,442,90],{"class":82},[40,444,225],{"class":86},[40,446,447,449,451,453],{"class":42,"line":96},[40,448,83],{"class":82},[40,450,87],{"class":86},[40,452,90],{"class":82},[40,454,178],{"class":86},[40,456,457],{"class":42,"line":103},[40,458,100],{"emptyLinePlaceholder":99},[40,460,461,463,465],{"class":42,"line":113},[40,462,187],{"class":86},[40,464,190],{"class":82},[40,466,467],{"class":86}," VisionStoryClient(\n",[40,469,471,474,476,478,480],{"class":42,"line":470},5,[40,472,473],{"class":416},"    api_key",[40,475,190],{"class":82},[40,477,234],{"class":86},[40,479,237],{"class":50},[40,481,482],{"class":86},"],\n",[40,484,486,489,491,494],{"class":42,"line":485},6,[40,487,488],{"class":416},"    base_url",[40,490,190],{"class":82},[40,492,493],{"class":50},"\"https:\u002F\u002Fyour-api.example.com\"",[40,495,496],{"class":86},",\n",[40,498,500,503,505,507],{"class":42,"line":499},7,[40,501,502],{"class":416},"    request_timeout",[40,504,190],{"class":82},[40,506,421],{"class":106},[40,508,496],{"class":86},[40,510,512],{"class":42,"line":511},8,[40,513,251],{"class":86},[10,515,516,344,519,521,522,524,525,527],{},[18,517,518],{},"配置优先级：",[13,520,153],{}," 读取密钥与地址两个环境变量；直接调用构造函数则使用传入参数和默认值，不读取 ",[13,523,304],{},"。因此，构造函数省略 ",[13,526,320],{}," 时，即使设置了该环境变量，也仍使用官方地址。修改环境变量不会改变已创建的客户端。",[337,529,530],{},[10,531,532,535,536,539,540,543,544,547],{},[18,533,534],{},"仅使用可信的 HTTPS 地址。"," SDK 会将密钥放在 ",[13,537,538],{},"X-API-Key"," 请求头中发送给目标服务。基础地址末尾不要加 ",[13,541,542],{},"\u002Fapi\u002Fv1","，SDK 方法会自动拼接 ",[13,545,546],{},"\u002Fapi\u002Fv1\u002Fmodels"," 等路径。更换域名并不代表可以调用不兼容的其他 API。",[10,549,550,552,553,556,557,134],{},[13,551,334],{}," 控制 HTTP 请求超时，不是整个视频的渲染等待时间；部分操作使用自己的请求超时。异步等待通过 ",[13,554,555],{},"wait_for_video(..., timeout=600)"," 单独设置，下载则使用 ",[13,558,559],{},"client.download(url, path, timeout=120)",[26,561,563],{"id":562},"generate-a-talking-avatar-video-in-python","在 Python 中生成数字人视频",[10,565,566,569],{},[13,567,568],{},"generate_video"," 会提交任务并轮询至完成，一次调用即可取得生成好的视频：",[31,571,573],{"className":73,"code":572,"language":75,"meta":36,"style":36},"from pathlib import Path\nfrom visionstory import VisionStoryClient, build_video_payload\n\nclient = VisionStoryClient.from_env()\n\npayload = build_video_payload(\n    avatar_id=\"YOUR_AVATAR_ID\",        # select from client.list_avatars()\n    text=\"Hello World, this is my first video.\",\n    voice_id=\"YOUR_VOICE_ID\",          # select from client.list_voices()\n)\nvideo = client.generate_video(payload)          # submit + poll until \"created\"\nclient.download(video[\"video_url\"], Path(\"result.mp4\"))\nprint(\"saved result.mp4\")\n",[13,574,575,587,598,602,610,614,624,640,652,669,674,688,706],{"__ignoreMap":36},[40,576,577,579,582,584],{"class":42,"line":43},[40,578,83],{"class":82},[40,580,581],{"class":86}," pathlib ",[40,583,90],{"class":82},[40,585,586],{"class":86}," Path\n",[40,588,589,591,593,595],{"class":42,"line":96},[40,590,83],{"class":82},[40,592,87],{"class":86},[40,594,90],{"class":82},[40,596,597],{"class":86}," VisionStoryClient, build_video_payload\n",[40,599,600],{"class":42,"line":103},[40,601,100],{"emptyLinePlaceholder":99},[40,603,604,606,608],{"class":42,"line":113},[40,605,187],{"class":86},[40,607,190],{"class":82},[40,609,193],{"class":86},[40,611,612],{"class":42,"line":470},[40,613,100],{"emptyLinePlaceholder":99},[40,615,616,619,621],{"class":42,"line":485},[40,617,618],{"class":86},"payload ",[40,620,190],{"class":82},[40,622,623],{"class":86}," build_video_payload(\n",[40,625,626,629,631,634,637],{"class":42,"line":499},[40,627,628],{"class":416},"    avatar_id",[40,630,190],{"class":82},[40,632,633],{"class":50},"\"YOUR_AVATAR_ID\"",[40,635,636],{"class":86},",        ",[40,638,639],{"class":116},"# select from client.list_avatars()\n",[40,641,642,645,647,650],{"class":42,"line":511},[40,643,644],{"class":416},"    text",[40,646,190],{"class":82},[40,648,649],{"class":50},"\"Hello World, this is my first video.\"",[40,651,496],{"class":86},[40,653,655,658,660,663,666],{"class":42,"line":654},9,[40,656,657],{"class":416},"    voice_id",[40,659,190],{"class":82},[40,661,662],{"class":50},"\"YOUR_VOICE_ID\"",[40,664,665],{"class":86},",          ",[40,667,668],{"class":116},"# select from client.list_voices()\n",[40,670,672],{"class":42,"line":671},10,[40,673,251],{"class":86},[40,675,677,680,682,685],{"class":42,"line":676},11,[40,678,679],{"class":86},"video ",[40,681,190],{"class":82},[40,683,684],{"class":86}," client.generate_video(payload)          ",[40,686,687],{"class":116},"# submit + poll until \"created\"\n",[40,689,691,694,697,700,703],{"class":42,"line":690},12,[40,692,693],{"class":86},"client.download(video[",[40,695,696],{"class":50},"\"video_url\"",[40,698,699],{"class":86},"], Path(",[40,701,702],{"class":50},"\"result.mp4\"",[40,704,705],{"class":86},"))\n",[40,707,709,711,714,717],{"class":42,"line":708},13,[40,710,107],{"class":106},[40,712,713],{"class":86},"(",[40,715,716],{"class":50},"\"saved result.mp4\"",[40,718,251],{"class":86},[10,720,721,724,725,344,728,344,731,734,735,738,739,742,743,742,746,742,749,752,753,756],{},[13,722,723],{},"build_video_payload"," 接受 ",[13,726,727],{},"text",[18,729,730],{},"或",[13,732,733],{},"audio_url"," \u002F ",[13,736,737],{},"audio_file","（三者只能选一个），以及可选的 ",[13,740,741],{},"model_id","、",[13,744,745],{},"aspect_ratio",[13,747,748],{},"resolution",[13,750,751],{},"speech_rate"," 等参数，直接映射到 ",[13,754,755],{},"POST \u002Fapi\u002Fv1\u002Fvideo"," 请求体。",[26,758,760],{"id":759},"use-the-visionstory-cli","使用 VisionStory CLI",[10,762,763,764,767,768,770],{},"独立的 ",[13,765,766],{},"visionstory-cli"," 包提供 ",[13,769,15],{}," 命令，覆盖相同能力，无需编写代码：",[31,772,774],{"className":33,"code":773,"language":35,"meta":36,"style":36},"visionstory create-video --avatar-id YOUR_AVATAR_ID --text \"Hello from VisionStory.\" --voice-id YOUR_VOICE_ID --output result.mp4\n",[13,775,776],{"__ignoreMap":36},[40,777,778,780,783,786,789,792,795,798,801,804],{"class":42,"line":43},[40,779,15],{"class":46},[40,781,782],{"class":50}," create-video",[40,784,785],{"class":106}," --avatar-id",[40,787,788],{"class":50}," YOUR_AVATAR_ID",[40,790,791],{"class":106}," --text",[40,793,794],{"class":50}," \"Hello from VisionStory.\"",[40,796,797],{"class":106}," --voice-id",[40,799,800],{"class":50}," YOUR_VOICE_ID",[40,802,803],{"class":106}," --output",[40,805,806],{"class":50}," result.mp4\n",[10,808,809,810,814],{},"完整命令、参数和示例见 ",[63,811,813],{"href":812},"\u002Fguides\u002Fcli","CLI"," 指南。",[26,816,818],{"id":817},"list-models-avatars-voices-and-credits","查询模型、形象、声音和点数",[10,820,821],{},"不要写死资源 ID，应在运行时查询并选择：",[31,823,825],{"className":73,"code":824,"language":75,"meta":36,"style":36},"client.list_models()      # avatar render models\nclient.list_avatars()     # your avatars + public ones\nclient.list_voices(locale=\"es-MX\", provider=\"minimax\", limit=50)\nclient.get_credits()      # remaining balance\n",[13,826,827,835,843,879],{"__ignoreMap":36},[40,828,829,832],{"class":42,"line":43},[40,830,831],{"class":86},"client.list_models()      ",[40,833,834],{"class":116},"# avatar render models\n",[40,836,837,840],{"class":42,"line":96},[40,838,839],{"class":86},"client.list_avatars()     ",[40,841,842],{"class":116},"# your avatars + public ones\n",[40,844,845,848,851,853,856,859,862,864,867,869,872,874,877],{"class":42,"line":103},[40,846,847],{"class":86},"client.list_voices(",[40,849,850],{"class":416},"locale",[40,852,190],{"class":82},[40,854,855],{"class":50},"\"es-MX\"",[40,857,858],{"class":86},", ",[40,860,861],{"class":416},"provider",[40,863,190],{"class":82},[40,865,866],{"class":50},"\"minimax\"",[40,868,858],{"class":86},[40,870,871],{"class":416},"limit",[40,873,190],{"class":82},[40,875,876],{"class":106},"50",[40,878,251],{"class":86},[40,880,881,884],{"class":42,"line":113},[40,882,883],{"class":86},"client.get_credits()      ",[40,885,886],{"class":116},"# remaining balance\n",[26,888,890],{"id":889},"verify-sdk-cli-and-mcp-compatibility","检查 SDK、CLI 与 MCP 的兼容性",[31,892,894],{"className":73,"code":893,"language":75,"meta":36,"style":36},"from visionstory import get_contract_info\n\nprint(get_contract_info())\n# contract_version, SHA-256 contract_hash, and operation_count=27\n",[13,895,896,907,911,918],{"__ignoreMap":36},[40,897,898,900,902,904],{"class":42,"line":43},[40,899,83],{"class":82},[40,901,87],{"class":86},[40,903,90],{"class":82},[40,905,906],{"class":86}," get_contract_info\n",[40,908,909],{"class":42,"line":96},[40,910,100],{"emptyLinePlaceholder":99},[40,912,913,915],{"class":42,"line":103},[40,914,107],{"class":106},[40,916,917],{"class":86},"(get_contract_info())\n",[40,919,920],{"class":42,"line":113},[40,921,922],{"class":116},"# contract_version, SHA-256 contract_hash, and operation_count=27\n",[10,924,925,926,929,930,933],{},"可以通过 ",[13,927,928],{},"visionstory contract"," 和 MCP 资源\n",[13,931,932],{},"visionstory:\u002F\u002Fcontract"," 获取相同指纹。指纹一致意味着 SDK、CLI 和 MCP\nServer 基于同一份 OpenAPI 及渠道映射构建。",[26,935,937],{"id":936},"create-avatars-clone-voices-and-upload-assets","创建形象、克隆声音与上传素材",[31,939,941],{"className":73,"code":940,"language":75,"meta":36,"style":36},"client.create_avatar(image_url=\"https:\u002F\u002Fyour.site\u002Fface.jpg\")   # or image_file=Path(\"face.jpg\")\nclient.clone_voice(audio_url=\"https:\u002F\u002Fyour.site\u002Fsample.mp3\")   # or audio_file=Path(\"sample.mp3\")\nclient.upload_asset(url=\"https:\u002F\u002Fyour.site\u002Fclip.mp4\")          # or file_path=Path(\"clip.mp4\")\n",[13,942,943,962,979],{"__ignoreMap":36},[40,944,945,948,951,953,956,959],{"class":42,"line":43},[40,946,947],{"class":86},"client.create_avatar(",[40,949,950],{"class":416},"image_url",[40,952,190],{"class":82},[40,954,955],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fface.jpg\"",[40,957,958],{"class":86},")   ",[40,960,961],{"class":116},"# or image_file=Path(\"face.jpg\")\n",[40,963,964,967,969,971,974,976],{"class":42,"line":96},[40,965,966],{"class":86},"client.clone_voice(",[40,968,733],{"class":416},[40,970,190],{"class":82},[40,972,973],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fsample.mp3\"",[40,975,958],{"class":86},[40,977,978],{"class":116},"# or audio_file=Path(\"sample.mp3\")\n",[40,980,981,984,987,989,992,995],{"class":42,"line":103},[40,982,983],{"class":86},"client.upload_asset(",[40,985,986],{"class":416},"url",[40,988,190],{"class":82},[40,990,991],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fclip.mp4\"",[40,993,994],{"class":86},")          ",[40,996,997],{"class":116},"# or file_path=Path(\"clip.mp4\")\n",[10,999,1000,1003,1004,1007,1008,1012],{},[13,1001,1002],{},"upload_asset"," 返回可复用的 ",[13,1005,1006],{},"asset_id","，可以在 ",[63,1009,1011],{"href":1010},"\u002Fguides\u002Fai-video","AI 视频","请求中引用。",[26,1014,1016],{"id":1015},"transcribe-audio-and-create-subtitles","转写音频与创建字幕",[10,1018,1019,1020,1023,1024,1027],{},"使用本地路径、公开 URL 或可复用素材转写 WAV 或 MP3 音频。设置 ",[13,1021,1022],{},"diarize=True"," 返回说话人标签，设置 ",[13,1025,1026],{},"srt=True"," 输出字幕：",[31,1029,1031],{"className":73,"code":1030,"language":75,"meta":36,"style":36},"from pathlib import Path\n\ntranscript = client.transcribe_audio(\n    audio_file=Path(\"interview.mp3\"),\n    diarize=True,\n    srt=True,\n)\nPath(\"interview.srt\").write_text(transcript[\"srt\"], encoding=\"utf-8\")\n\nalignment = client.align_audio(\n    text=\"Welcome to VisionStory.\",\n    asset_id=\"YOUR_AUDIO_ASSET_ID\",\n)\n",[13,1032,1033,1043,1047,1057,1073,1085,1096,1100,1126,1130,1140,1151,1163],{"__ignoreMap":36},[40,1034,1035,1037,1039,1041],{"class":42,"line":43},[40,1036,83],{"class":82},[40,1038,581],{"class":86},[40,1040,90],{"class":82},[40,1042,586],{"class":86},[40,1044,1045],{"class":42,"line":96},[40,1046,100],{"emptyLinePlaceholder":99},[40,1048,1049,1052,1054],{"class":42,"line":103},[40,1050,1051],{"class":86},"transcript ",[40,1053,190],{"class":82},[40,1055,1056],{"class":86}," client.transcribe_audio(\n",[40,1058,1059,1062,1064,1067,1070],{"class":42,"line":113},[40,1060,1061],{"class":416},"    audio_file",[40,1063,190],{"class":82},[40,1065,1066],{"class":86},"Path(",[40,1068,1069],{"class":50},"\"interview.mp3\"",[40,1071,1072],{"class":86},"),\n",[40,1074,1075,1078,1080,1083],{"class":42,"line":470},[40,1076,1077],{"class":416},"    diarize",[40,1079,190],{"class":82},[40,1081,1082],{"class":106},"True",[40,1084,496],{"class":86},[40,1086,1087,1090,1092,1094],{"class":42,"line":485},[40,1088,1089],{"class":416},"    srt",[40,1091,190],{"class":82},[40,1093,1082],{"class":106},[40,1095,496],{"class":86},[40,1097,1098],{"class":42,"line":499},[40,1099,251],{"class":86},[40,1101,1102,1104,1107,1110,1113,1116,1119,1121,1124],{"class":42,"line":511},[40,1103,1066],{"class":86},[40,1105,1106],{"class":50},"\"interview.srt\"",[40,1108,1109],{"class":86},").write_text(transcript[",[40,1111,1112],{"class":50},"\"srt\"",[40,1114,1115],{"class":86},"], ",[40,1117,1118],{"class":416},"encoding",[40,1120,190],{"class":82},[40,1122,1123],{"class":50},"\"utf-8\"",[40,1125,251],{"class":86},[40,1127,1128],{"class":42,"line":654},[40,1129,100],{"emptyLinePlaceholder":99},[40,1131,1132,1135,1137],{"class":42,"line":671},[40,1133,1134],{"class":86},"alignment ",[40,1136,190],{"class":82},[40,1138,1139],{"class":86}," client.align_audio(\n",[40,1141,1142,1144,1146,1149],{"class":42,"line":676},[40,1143,644],{"class":416},[40,1145,190],{"class":82},[40,1147,1148],{"class":50},"\"Welcome to VisionStory.\"",[40,1150,496],{"class":86},[40,1152,1153,1156,1158,1161],{"class":42,"line":690},[40,1154,1155],{"class":416},"    asset_id",[40,1157,190],{"class":82},[40,1159,1160],{"class":50},"\"YOUR_AUDIO_ASSET_ID\"",[40,1162,496],{"class":86},[40,1164,1165],{"class":42,"line":708},[40,1166,251],{"class":86},[10,1168,1169,1170,134],{},"请求结构、限制、词级时间戳和计费方式见",[63,1171,1173],{"href":1172},"\u002Fguides\u002Faudio-understanding","音频转写与对齐",[26,1175,1177],{"id":1176},"synthesize-localized-speech","合成指定语言地区的语音",[31,1179,1181],{"className":73,"code":1180,"language":75,"meta":36,"style":36},"speech = client.create_speech(\n    text=\"Welcome to VisionStory.\",\n    voice_id=\"YOUR_VOICE_ID\",\n    locale=\"en-GB\",\n)\nPath(\"speech.mp3\").write_bytes(speech[\"audio\"])\n",[13,1182,1183,1193,1203,1213,1225,1229],{"__ignoreMap":36},[40,1184,1185,1188,1190],{"class":42,"line":43},[40,1186,1187],{"class":86},"speech ",[40,1189,190],{"class":82},[40,1191,1192],{"class":86}," client.create_speech(\n",[40,1194,1195,1197,1199,1201],{"class":42,"line":96},[40,1196,644],{"class":416},[40,1198,190],{"class":82},[40,1200,1148],{"class":50},[40,1202,496],{"class":86},[40,1204,1205,1207,1209,1211],{"class":42,"line":103},[40,1206,657],{"class":416},[40,1208,190],{"class":82},[40,1210,662],{"class":50},[40,1212,496],{"class":86},[40,1214,1215,1218,1220,1223],{"class":42,"line":113},[40,1216,1217],{"class":416},"    locale",[40,1219,190],{"class":82},[40,1221,1222],{"class":50},"\"en-GB\"",[40,1224,496],{"class":86},[40,1226,1227],{"class":42,"line":470},[40,1228,251],{"class":86},[40,1230,1231,1233,1236,1239,1242],{"class":42,"line":485},[40,1232,1066],{"class":86},[40,1234,1235],{"class":50},"\"speech.mp3\"",[40,1237,1238],{"class":86},").write_bytes(speech[",[40,1240,1241],{"class":50},"\"audio\"",[40,1243,1244],{"class":86},"])\n",[26,1246,1248],{"id":1247},"control-asynchronous-polling","控制异步轮询",[10,1250,1251],{},"需要展示进度或在等待期间执行其他操作时，可以分开提交和轮询：",[31,1253,1255],{"className":73,"code":1254,"language":75,"meta":36,"style":36},"created = client.create_video(payload)          # returns immediately with a video_id\nvideo = client.wait_for_video(created[\"video_id\"], poll_interval=5, timeout=600)\n",[13,1256,1257,1270],{"__ignoreMap":36},[40,1258,1259,1262,1264,1267],{"class":42,"line":43},[40,1260,1261],{"class":86},"created ",[40,1263,190],{"class":82},[40,1265,1266],{"class":86}," client.create_video(payload)          ",[40,1268,1269],{"class":116},"# returns immediately with a video_id\n",[40,1271,1272,1274,1276,1279,1282,1284,1287,1289,1292,1294,1297,1299,1302],{"class":42,"line":96},[40,1273,679],{"class":86},[40,1275,190],{"class":82},[40,1277,1278],{"class":86}," client.wait_for_video(created[",[40,1280,1281],{"class":50},"\"video_id\"",[40,1283,1115],{"class":86},[40,1285,1286],{"class":416},"poll_interval",[40,1288,190],{"class":82},[40,1290,1291],{"class":106},"5",[40,1293,858],{"class":86},[40,1295,1296],{"class":416},"timeout",[40,1298,190],{"class":82},[40,1300,1301],{"class":106},"600",[40,1303,251],{"class":86},[10,1305,1306,1309,1310,134],{},[13,1307,1308],{},"generate_video(payload, wait=False)"," 等同于 ",[13,1311,1312],{},"create_video",[26,1314,1316],{"id":1315},"handle-sdk-errors-and-timeouts","处理 SDK 错误与超时",[31,1318,1320],{"className":73,"code":1319,"language":75,"meta":36,"style":36},"from visionstory import VisionStoryAPIError, VideoTimeoutError\n\ntry:\n    video = client.generate_video(payload)\nexcept VideoTimeoutError:\n    ...   # still not finished after `timeout` seconds\nexcept VisionStoryAPIError as e:\n    ...   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\n",[13,1321,1322,1333,1337,1345,1355,1363,1371,1384],{"__ignoreMap":36},[40,1323,1324,1326,1328,1330],{"class":42,"line":43},[40,1325,83],{"class":82},[40,1327,87],{"class":86},[40,1329,90],{"class":82},[40,1331,1332],{"class":86}," VisionStoryAPIError, VideoTimeoutError\n",[40,1334,1335],{"class":42,"line":96},[40,1336,100],{"emptyLinePlaceholder":99},[40,1338,1339,1342],{"class":42,"line":103},[40,1340,1341],{"class":82},"try",[40,1343,1344],{"class":86},":\n",[40,1346,1347,1350,1352],{"class":42,"line":113},[40,1348,1349],{"class":86},"    video ",[40,1351,190],{"class":82},[40,1353,1354],{"class":86}," client.generate_video(payload)\n",[40,1356,1357,1360],{"class":42,"line":470},[40,1358,1359],{"class":82},"except",[40,1361,1362],{"class":86}," VideoTimeoutError:\n",[40,1364,1365,1368],{"class":42,"line":485},[40,1366,1367],{"class":106},"    ...",[40,1369,1370],{"class":116},"   # still not finished after `timeout` seconds\n",[40,1372,1373,1375,1378,1381],{"class":42,"line":499},[40,1374,1359],{"class":82},[40,1376,1377],{"class":86}," VisionStoryAPIError ",[40,1379,1380],{"class":82},"as",[40,1382,1383],{"class":86}," e:\n",[40,1385,1386,1388],{"class":42,"line":511},[40,1387,1367],{"class":106},[40,1389,1390],{"class":116},"   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\n",[26,1392,1394],{"id":1393},"related-visionstory-developer-guides","相关 VisionStory 开发指南",[1396,1397,1398,1406,1413,1418],"ul",{},[1399,1400,1401,1405],"li",{},[63,1402,1404],{"href":1403},"\u002Fguides\u002Fquick-start","快速开始"," — 分步骤完成相同流程。",[1399,1407,1408,1412],{},[63,1409,1411],{"href":1410},"\u002Fguides\u002Ffor-agents","面向 Agent"," — 让 AI Agent 通过 Skill 或 MCP Server 调用 API。",[1399,1414,1415,1417],{},[63,1416,1173],{"href":1172}," — 语音转文字、SRT 和强制对齐。",[1399,1419,1420,1424],{},[63,1421,1423],{"href":1422},"\u002Freference","API 参考"," — 查看 SDK 封装的全部接口。",[26,1426,1428],{"id":1427},"structured-media-extraction-and-speech-rate","结构化媒体提取与语速",[10,1430,1431,1432,1435,1436,742,1439,1442,1443,1446,1447,742,1450,1442,1453,134],{},"使用 ",[13,1433,1434],{},"understand_media"," 从图片、音频或视频中提取符合 Schema 约束的 JSON。必填参数为 ",[13,1437,1438],{},"prompt",[13,1440,1441],{},"inputs"," 和 ",[13,1444,1445],{},"schema","；同步等待最长 180 秒，返回 ",[13,1448,1449],{},"output",[13,1451,1452],{},"usage",[13,1454,1455],{},"cost_credit",[31,1457,1459],{"className":73,"code":1458,"language":75,"meta":36,"style":36},"from visionstory import VisionStoryClient\n\nclient = VisionStoryClient.from_env()\nresult = client.understand_media(\n    prompt=\"Identify the subject\",\n    inputs=[{\"asset_id\": \"YOUR_ASSET_ID\"}],\n    schema={\"type\": \"object\", \"properties\": {\"subject\": {\"type\": \"string\"}}, \"required\": [\"subject\"]},\n)\nprint(result[\"output\"])\n\nspeech = client.create_speech(text=\"Hello\", voice_id=\"YOUR_VOICE_ID\", speech_rate=\"slow\")\n# Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\n",[13,1460,1461,1471,1475,1483,1493,1505,1527,1579,1583,1595,1599,1635],{"__ignoreMap":36},[40,1462,1463,1465,1467,1469],{"class":42,"line":43},[40,1464,83],{"class":82},[40,1466,87],{"class":86},[40,1468,90],{"class":82},[40,1470,178],{"class":86},[40,1472,1473],{"class":42,"line":96},[40,1474,100],{"emptyLinePlaceholder":99},[40,1476,1477,1479,1481],{"class":42,"line":103},[40,1478,187],{"class":86},[40,1480,190],{"class":82},[40,1482,193],{"class":86},[40,1484,1485,1488,1490],{"class":42,"line":113},[40,1486,1487],{"class":86},"result ",[40,1489,190],{"class":82},[40,1491,1492],{"class":86}," client.understand_media(\n",[40,1494,1495,1498,1500,1503],{"class":42,"line":470},[40,1496,1497],{"class":416},"    prompt",[40,1499,190],{"class":82},[40,1501,1502],{"class":50},"\"Identify the subject\"",[40,1504,496],{"class":86},[40,1506,1507,1510,1512,1515,1518,1521,1524],{"class":42,"line":485},[40,1508,1509],{"class":416},"    inputs",[40,1511,190],{"class":82},[40,1513,1514],{"class":86},"[{",[40,1516,1517],{"class":50},"\"asset_id\"",[40,1519,1520],{"class":86},": ",[40,1522,1523],{"class":50},"\"YOUR_ASSET_ID\"",[40,1525,1526],{"class":86},"}],\n",[40,1528,1529,1532,1534,1537,1540,1542,1545,1547,1550,1553,1556,1558,1560,1562,1565,1568,1571,1574,1576],{"class":42,"line":499},[40,1530,1531],{"class":416},"    schema",[40,1533,190],{"class":82},[40,1535,1536],{"class":86},"{",[40,1538,1539],{"class":50},"\"type\"",[40,1541,1520],{"class":86},[40,1543,1544],{"class":50},"\"object\"",[40,1546,858],{"class":86},[40,1548,1549],{"class":50},"\"properties\"",[40,1551,1552],{"class":86},": {",[40,1554,1555],{"class":50},"\"subject\"",[40,1557,1552],{"class":86},[40,1559,1539],{"class":50},[40,1561,1520],{"class":86},[40,1563,1564],{"class":50},"\"string\"",[40,1566,1567],{"class":86},"}}, ",[40,1569,1570],{"class":50},"\"required\"",[40,1572,1573],{"class":86},": [",[40,1575,1555],{"class":50},[40,1577,1578],{"class":86},"]},\n",[40,1580,1581],{"class":42,"line":511},[40,1582,251],{"class":86},[40,1584,1585,1587,1590,1593],{"class":42,"line":654},[40,1586,107],{"class":106},[40,1588,1589],{"class":86},"(result[",[40,1591,1592],{"class":50},"\"output\"",[40,1594,1244],{"class":86},[40,1596,1597],{"class":42,"line":671},[40,1598,100],{"emptyLinePlaceholder":99},[40,1600,1601,1603,1605,1608,1610,1612,1615,1617,1620,1622,1624,1626,1628,1630,1633],{"class":42,"line":676},[40,1602,1187],{"class":86},[40,1604,190],{"class":82},[40,1606,1607],{"class":86}," client.create_speech(",[40,1609,727],{"class":416},[40,1611,190],{"class":82},[40,1613,1614],{"class":50},"\"Hello\"",[40,1616,858],{"class":86},[40,1618,1619],{"class":416},"voice_id",[40,1621,190],{"class":82},[40,1623,662],{"class":50},[40,1625,858],{"class":86},[40,1627,751],{"class":416},[40,1629,190],{"class":82},[40,1631,1632],{"class":50},"\"slow\"",[40,1634,251],{"class":86},[40,1636,1637],{"class":42,"line":690},[40,1638,1639],{"class":116},"# Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\n",[10,1641,1642,724,1644,742,1647,1650,1651,1654,1655,1658,1659,1665,1666,134],{},[13,1643,751],{},[13,1645,1646],{},"slow",[13,1648,1649],{},"normal"," 或 ",[13,1652,1653],{},"fast","，传入 ",[13,1656,1657],{},"None"," 时不发送此字段。输入限制、计费和超时处理见",[63,1660,1664],{"href":1661,"rel":1662},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Fmedia-understanding",[1663],"nofollow","媒体理解","；二进制响应见",[63,1667,1670],{"href":1668,"rel":1669},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Ftext-to-speech",[1663],"文本转语音",[1672,1673,1674],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":36,"searchDepth":96,"depth":96,"links":1676},[1677,1678,1679,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693],{"id":28,"depth":96,"text":29},{"id":57,"depth":96,"text":58},{"id":137,"depth":96,"text":138,"children":1680},[1681,1682],{"id":142,"depth":103,"text":143},{"id":358,"depth":103,"text":359},{"id":562,"depth":96,"text":563},{"id":759,"depth":96,"text":760},{"id":817,"depth":96,"text":818},{"id":889,"depth":96,"text":890},{"id":936,"depth":96,"text":937},{"id":1015,"depth":96,"text":1016},{"id":1176,"depth":96,"text":1177},{"id":1247,"depth":96,"text":1248},{"id":1315,"depth":96,"text":1316},{"id":1393,"depth":96,"text":1394},{"id":1427,"depth":96,"text":1428},"安装无运行时依赖的 VisionStory Python SDK，完成媒体生成、声音筛选、语音合成、音频转写、字幕创建和 API 资源管理。","md",{},{"title":1698,"order":654},"Python SDK","\u002Fguides-zh\u002Fsdk",{"title":5,"description":1694},"guides-zh\u002Fsdk","RAbtp-j3c9lxJ4D6-PU7sRPkp5GVhQ-e6QTPLqGM3bY","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">pip\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> install\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> visionstory\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> check_for_updates\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(check_for_updates())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># installed_version, latest_version, update_available, highlights, update_command\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(client.get_credits())  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># Read-only authentication check; does not generate media\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> getpass\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VISIONSTORY_API_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">] \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> getpass.getpass(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VisionStory API key (hidden): \"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># macOS \u002F Linux \u002F WSL shell; applies to this terminal and its child processes\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">export\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VISIONSTORY_API_BASE\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour-api.example.com\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">request_timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">120\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    api_key\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"VISIONSTORY_API_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    base_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour-api.example.com\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    request_timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">120\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient, build_video_payload\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">payload \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> build_video_payload(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    avatar_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_AVATAR_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># select from client.list_avatars()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Hello World, this is my first video.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># select from client.list_voices()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.generate_video(payload)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># submit + poll until \"created\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.download(video[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"video_url\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"result.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"saved result.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">visionstory\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> create-video\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --avatar-id\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> YOUR_AVATAR_ID\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --text\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> \"Hello from VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --voice-id\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> YOUR_VOICE_ID\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --output\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> result.mp4\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_models()      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># avatar render models\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_avatars()     \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># your avatars + public ones\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_voices(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"es-MX\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">provider\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"minimax\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">limit\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">50\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.get_credits()      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># remaining balance\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> get_contract_info\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(get_contract_info())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># contract_version, SHA-256 contract_hash, and operation_count=27\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.create_avatar(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">image_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fface.jpg\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or image_file=Path(\"face.jpg\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.clone_voice(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">audio_url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fsample.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or audio_file=Path(\"sample.mp3\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.upload_asset(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">url\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"https:\u002F\u002Fyour.site\u002Fclip.mp4\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># or file_path=Path(\"clip.mp4\")\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> pathlib \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> Path\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">transcript \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.transcribe_audio(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    audio_file\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"interview.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    diarize\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    srt\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"interview.srt\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">).write_text(transcript[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"srt\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">encoding\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"utf-8\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">alignment \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.align_audio(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Welcome to VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    asset_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_AUDIO_ASSET_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">speech \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_speech(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Welcome to VisionStory.\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    locale\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"en-GB\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">Path(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"speech.mp3\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">).write_bytes(speech[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"audio\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">])\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">created \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_video(payload)          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># returns immediately with a video_id\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.wait_for_video(created[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"video_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">poll_interval\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">5\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">timeout\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">600\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryAPIError, VideoTimeoutError\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">try\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">    video \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.generate_video(payload)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">except\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VideoTimeoutError:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">    ...\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">   # still not finished after `timeout` seconds\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">except\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryAPIError \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> e:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">    ...\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF7B72\">from\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> visionstory \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">import\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> VisionStoryClient.from_env()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">result \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.understand_media(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    prompt\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Identify the subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    inputs\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">[{\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"asset_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_ASSET_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">}],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    schema\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"type\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"object\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"properties\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: {\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: {\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"type\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"string\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">}}, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"required\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"subject\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">]},\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79C0FF\">print\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(result[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"output\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">])\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">speech \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> client.create_speech(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">text\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Hello\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">voice_id\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"YOUR_VOICE_ID\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">speech_rate\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"slow\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#8B949E\"># Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1788547143928]