[{"data":1,"prerenderedAt":1857},["ShallowReactive",2],{"guide-\u002Fguides-zh\u002Fsdk":3,"developer-code-1wjk1yk":1840,"developer-code-rxqm9f":1841,"developer-code-13d8hrj":1842,"developer-code-1cfhzmk":1843,"developer-code-csrwmq":1844,"developer-code-znejch":1845,"developer-code-x94mlc":1846,"developer-code-1ao897t":1847,"developer-code-1h64ruz":1848,"developer-code-lwo884":1849,"developer-code-18x26s6":1850,"developer-code-1vj3ov7":1851,"developer-code-1xagynz":1852,"developer-code-kz8rgy":1853,"developer-code-bw2srb":1854,"developer-code-1tcriyf":1855,"developer-code-kgaz19":1856},{"id":4,"title":5,"body":6,"description":1831,"extension":1832,"meta":1833,"navigation":1834,"path":1836,"seo":1837,"stem":1838,"__hash__":1839},"guidesZh\u002Fguides-zh\u002Fsdk.md","VisionStory Python SDK",{"type":7,"value":8,"toc":1812},"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,923,927,959,970,974,1111,1136,1151,1155,1166,1304,1311,1315,1382,1386,1389,1441,1450,1454,1528,1532,1562,1566,1593,1777,1808],[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(limit=20)                  # owned avatars\nclient.list_avatars(is_public=True, limit=20)  # public avatar library\nclient.list_voices(locale=\"es-MX\", provider=\"minimax\", limit=50)\nclient.get_credits()      # remaining balance\n",[13,826,827,835,854,881,915],{"__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,843,845,848,851],{"class":42,"line":96},[40,838,839],{"class":86},"client.list_avatars(",[40,841,842],{"class":416},"limit",[40,844,190],{"class":82},[40,846,847],{"class":106},"20",[40,849,850],{"class":86},")                  ",[40,852,853],{"class":116},"# owned avatars\n",[40,855,856,858,861,863,866,869,871,873,875,878],{"class":42,"line":103},[40,857,839],{"class":86},[40,859,860],{"class":416},"is_public",[40,862,190],{"class":82},[40,864,865],{"class":106},"True",[40,867,868],{"class":86},", ",[40,870,842],{"class":416},[40,872,190],{"class":82},[40,874,847],{"class":106},[40,876,877],{"class":86},")  ",[40,879,880],{"class":116},"# public avatar library\n",[40,882,883,886,889,891,894,896,899,901,904,906,908,910,913],{"class":42,"line":113},[40,884,885],{"class":86},"client.list_voices(",[40,887,888],{"class":416},"locale",[40,890,190],{"class":82},[40,892,893],{"class":50},"\"es-MX\"",[40,895,868],{"class":86},[40,897,898],{"class":416},"provider",[40,900,190],{"class":82},[40,902,903],{"class":50},"\"minimax\"",[40,905,868],{"class":86},[40,907,842],{"class":416},[40,909,190],{"class":82},[40,911,912],{"class":106},"50",[40,914,251],{"class":86},[40,916,917,920],{"class":42,"line":470},[40,918,919],{"class":86},"client.get_credits()      ",[40,921,922],{"class":116},"# remaining balance\n",[26,924,926],{"id":925},"verify-sdk-cli-and-mcp-compatibility","检查 SDK、CLI 与 MCP 的兼容性",[31,928,930],{"className":73,"code":929,"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=28\n",[13,931,932,943,947,954],{"__ignoreMap":36},[40,933,934,936,938,940],{"class":42,"line":43},[40,935,83],{"class":82},[40,937,87],{"class":86},[40,939,90],{"class":82},[40,941,942],{"class":86}," get_contract_info\n",[40,944,945],{"class":42,"line":96},[40,946,100],{"emptyLinePlaceholder":99},[40,948,949,951],{"class":42,"line":103},[40,950,107],{"class":106},[40,952,953],{"class":86},"(get_contract_info())\n",[40,955,956],{"class":42,"line":113},[40,957,958],{"class":116},"# contract_version, SHA-256 contract_hash, and operation_count=28\n",[10,960,961,962,965,966,969],{},"可以通过 ",[13,963,964],{},"visionstory contract"," 和 MCP 资源\n",[13,967,968],{},"visionstory:\u002F\u002Fcontract"," 获取相同指纹。指纹一致意味着 SDK、CLI 和 MCP\nServer 基于同一份 OpenAPI 及渠道映射构建。",[26,971,973],{"id":972},"create-avatars-clone-voices-and-upload-assets","创建形象、克隆声音与上传素材",[31,975,977],{"className":73,"code":976,"language":75,"meta":36,"style":36},"avatar = client.create_avatar(image_url=\"https:\u002F\u002Fyour.site\u002Fface.jpg\")   # or image_file=Path(\"face.jpg\")\nclient.update_avatar_framing(\n    avatar_id=avatar[\"avatar_id\"],\n    aspect_ratio=\"9:16\",\n    zoom=1.2,\n    offset_x=0,\n    offset_y=-0.25,\n)\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,978,979,1003,1008,1022,1034,1046,1058,1071,1075,1092],{"__ignoreMap":36},[40,980,981,984,986,989,992,994,997,1000],{"class":42,"line":43},[40,982,983],{"class":86},"avatar ",[40,985,190],{"class":82},[40,987,988],{"class":86}," client.create_avatar(",[40,990,991],{"class":416},"image_url",[40,993,190],{"class":82},[40,995,996],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fface.jpg\"",[40,998,999],{"class":86},")   ",[40,1001,1002],{"class":116},"# or image_file=Path(\"face.jpg\")\n",[40,1004,1005],{"class":42,"line":96},[40,1006,1007],{"class":86},"client.update_avatar_framing(\n",[40,1009,1010,1012,1014,1017,1020],{"class":42,"line":103},[40,1011,628],{"class":416},[40,1013,190],{"class":82},[40,1015,1016],{"class":86},"avatar[",[40,1018,1019],{"class":50},"\"avatar_id\"",[40,1021,482],{"class":86},[40,1023,1024,1027,1029,1032],{"class":42,"line":113},[40,1025,1026],{"class":416},"    aspect_ratio",[40,1028,190],{"class":82},[40,1030,1031],{"class":50},"\"9:16\"",[40,1033,496],{"class":86},[40,1035,1036,1039,1041,1044],{"class":42,"line":470},[40,1037,1038],{"class":416},"    zoom",[40,1040,190],{"class":82},[40,1042,1043],{"class":106},"1.2",[40,1045,496],{"class":86},[40,1047,1048,1051,1053,1056],{"class":42,"line":485},[40,1049,1050],{"class":416},"    offset_x",[40,1052,190],{"class":82},[40,1054,1055],{"class":106},"0",[40,1057,496],{"class":86},[40,1059,1060,1063,1066,1069],{"class":42,"line":499},[40,1061,1062],{"class":416},"    offset_y",[40,1064,1065],{"class":82},"=-",[40,1067,1068],{"class":106},"0.25",[40,1070,496],{"class":86},[40,1072,1073],{"class":42,"line":511},[40,1074,251],{"class":86},[40,1076,1077,1080,1082,1084,1087,1089],{"class":42,"line":654},[40,1078,1079],{"class":86},"client.clone_voice(",[40,1081,733],{"class":416},[40,1083,190],{"class":82},[40,1085,1086],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fsample.mp3\"",[40,1088,999],{"class":86},[40,1090,1091],{"class":116},"# or audio_file=Path(\"sample.mp3\")\n",[40,1093,1094,1097,1100,1102,1105,1108],{"class":42,"line":671},[40,1095,1096],{"class":86},"client.upload_asset(",[40,1098,1099],{"class":416},"url",[40,1101,190],{"class":82},[40,1103,1104],{"class":50},"\"https:\u002F\u002Fyour.site\u002Fclip.mp4\"",[40,1106,1107],{"class":86},")          ",[40,1109,1110],{"class":116},"# or file_path=Path(\"clip.mp4\")\n",[10,1112,1113,1114,1116,1117,1120,1121,1124,1125,1128,1129,1131,1132,1135],{},"形象列表使用游标分页，每次只返回一种集合。省略 ",[13,1115,860],{}," 时查询当前账户拥有的形象；设置 ",[13,1118,1119],{},"is_public=True"," 时查询公共形象库。将 ",[13,1122,1123],{},"next_cursor"," 传给 ",[13,1126,1127],{},"cursor="," 继续翻页，",[13,1130,842],{}," 可设置为 1 到 100。只有专属形象可以调整取景；更新某个画幅前，请先读取该形象当前的 ",[13,1133,1134],{},"framing"," 条目。",[10,1137,1138,1141,1142,1145,1146,1150],{},[13,1139,1140],{},"upload_asset"," 返回可复用的 ",[13,1143,1144],{},"asset_id","，可以在 ",[63,1147,1149],{"href":1148},"\u002Fguides\u002Fai-video","AI 视频","请求中引用。",[26,1152,1154],{"id":1153},"transcribe-audio-and-create-subtitles","转写音频与创建字幕",[10,1156,1157,1158,1161,1162,1165],{},"使用本地路径、公开 URL 或可复用素材转写 WAV 或 MP3 音频。设置 ",[13,1159,1160],{},"diarize=True"," 返回说话人标签，设置 ",[13,1163,1164],{},"srt=True"," 输出字幕：",[31,1167,1169],{"className":73,"code":1168,"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,1170,1171,1181,1185,1195,1211,1222,1233,1237,1263,1267,1277,1288,1300],{"__ignoreMap":36},[40,1172,1173,1175,1177,1179],{"class":42,"line":43},[40,1174,83],{"class":82},[40,1176,581],{"class":86},[40,1178,90],{"class":82},[40,1180,586],{"class":86},[40,1182,1183],{"class":42,"line":96},[40,1184,100],{"emptyLinePlaceholder":99},[40,1186,1187,1190,1192],{"class":42,"line":103},[40,1188,1189],{"class":86},"transcript ",[40,1191,190],{"class":82},[40,1193,1194],{"class":86}," client.transcribe_audio(\n",[40,1196,1197,1200,1202,1205,1208],{"class":42,"line":113},[40,1198,1199],{"class":416},"    audio_file",[40,1201,190],{"class":82},[40,1203,1204],{"class":86},"Path(",[40,1206,1207],{"class":50},"\"interview.mp3\"",[40,1209,1210],{"class":86},"),\n",[40,1212,1213,1216,1218,1220],{"class":42,"line":470},[40,1214,1215],{"class":416},"    diarize",[40,1217,190],{"class":82},[40,1219,865],{"class":106},[40,1221,496],{"class":86},[40,1223,1224,1227,1229,1231],{"class":42,"line":485},[40,1225,1226],{"class":416},"    srt",[40,1228,190],{"class":82},[40,1230,865],{"class":106},[40,1232,496],{"class":86},[40,1234,1235],{"class":42,"line":499},[40,1236,251],{"class":86},[40,1238,1239,1241,1244,1247,1250,1253,1256,1258,1261],{"class":42,"line":511},[40,1240,1204],{"class":86},[40,1242,1243],{"class":50},"\"interview.srt\"",[40,1245,1246],{"class":86},").write_text(transcript[",[40,1248,1249],{"class":50},"\"srt\"",[40,1251,1252],{"class":86},"], ",[40,1254,1255],{"class":416},"encoding",[40,1257,190],{"class":82},[40,1259,1260],{"class":50},"\"utf-8\"",[40,1262,251],{"class":86},[40,1264,1265],{"class":42,"line":654},[40,1266,100],{"emptyLinePlaceholder":99},[40,1268,1269,1272,1274],{"class":42,"line":671},[40,1270,1271],{"class":86},"alignment ",[40,1273,190],{"class":82},[40,1275,1276],{"class":86}," client.align_audio(\n",[40,1278,1279,1281,1283,1286],{"class":42,"line":676},[40,1280,644],{"class":416},[40,1282,190],{"class":82},[40,1284,1285],{"class":50},"\"Welcome to VisionStory.\"",[40,1287,496],{"class":86},[40,1289,1290,1293,1295,1298],{"class":42,"line":690},[40,1291,1292],{"class":416},"    asset_id",[40,1294,190],{"class":82},[40,1296,1297],{"class":50},"\"YOUR_AUDIO_ASSET_ID\"",[40,1299,496],{"class":86},[40,1301,1302],{"class":42,"line":708},[40,1303,251],{"class":86},[10,1305,1306,1307,134],{},"请求结构、限制、词级时间戳和计费方式见",[63,1308,1310],{"href":1309},"\u002Fguides\u002Faudio-understanding","音频转写与对齐",[26,1312,1314],{"id":1313},"synthesize-localized-speech","合成指定语言地区的语音",[31,1316,1318],{"className":73,"code":1317,"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,1319,1320,1330,1340,1350,1362,1366],{"__ignoreMap":36},[40,1321,1322,1325,1327],{"class":42,"line":43},[40,1323,1324],{"class":86},"speech ",[40,1326,190],{"class":82},[40,1328,1329],{"class":86}," client.create_speech(\n",[40,1331,1332,1334,1336,1338],{"class":42,"line":96},[40,1333,644],{"class":416},[40,1335,190],{"class":82},[40,1337,1285],{"class":50},[40,1339,496],{"class":86},[40,1341,1342,1344,1346,1348],{"class":42,"line":103},[40,1343,657],{"class":416},[40,1345,190],{"class":82},[40,1347,662],{"class":50},[40,1349,496],{"class":86},[40,1351,1352,1355,1357,1360],{"class":42,"line":113},[40,1353,1354],{"class":416},"    locale",[40,1356,190],{"class":82},[40,1358,1359],{"class":50},"\"en-GB\"",[40,1361,496],{"class":86},[40,1363,1364],{"class":42,"line":470},[40,1365,251],{"class":86},[40,1367,1368,1370,1373,1376,1379],{"class":42,"line":485},[40,1369,1204],{"class":86},[40,1371,1372],{"class":50},"\"speech.mp3\"",[40,1374,1375],{"class":86},").write_bytes(speech[",[40,1377,1378],{"class":50},"\"audio\"",[40,1380,1381],{"class":86},"])\n",[26,1383,1385],{"id":1384},"control-asynchronous-polling","控制异步轮询",[10,1387,1388],{},"需要展示进度或在等待期间执行其他操作时，可以分开提交和轮询：",[31,1390,1392],{"className":73,"code":1391,"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,1393,1394,1407],{"__ignoreMap":36},[40,1395,1396,1399,1401,1404],{"class":42,"line":43},[40,1397,1398],{"class":86},"created ",[40,1400,190],{"class":82},[40,1402,1403],{"class":86}," client.create_video(payload)          ",[40,1405,1406],{"class":116},"# returns immediately with a video_id\n",[40,1408,1409,1411,1413,1416,1419,1421,1424,1426,1429,1431,1434,1436,1439],{"class":42,"line":96},[40,1410,679],{"class":86},[40,1412,190],{"class":82},[40,1414,1415],{"class":86}," client.wait_for_video(created[",[40,1417,1418],{"class":50},"\"video_id\"",[40,1420,1252],{"class":86},[40,1422,1423],{"class":416},"poll_interval",[40,1425,190],{"class":82},[40,1427,1428],{"class":106},"5",[40,1430,868],{"class":86},[40,1432,1433],{"class":416},"timeout",[40,1435,190],{"class":82},[40,1437,1438],{"class":106},"600",[40,1440,251],{"class":86},[10,1442,1443,1446,1447,134],{},[13,1444,1445],{},"generate_video(payload, wait=False)"," 等同于 ",[13,1448,1449],{},"create_video",[26,1451,1453],{"id":1452},"handle-sdk-errors-and-timeouts","处理 SDK 错误与超时",[31,1455,1457],{"className":73,"code":1456,"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,1458,1459,1470,1474,1482,1492,1500,1508,1521],{"__ignoreMap":36},[40,1460,1461,1463,1465,1467],{"class":42,"line":43},[40,1462,83],{"class":82},[40,1464,87],{"class":86},[40,1466,90],{"class":82},[40,1468,1469],{"class":86}," VisionStoryAPIError, VideoTimeoutError\n",[40,1471,1472],{"class":42,"line":96},[40,1473,100],{"emptyLinePlaceholder":99},[40,1475,1476,1479],{"class":42,"line":103},[40,1477,1478],{"class":82},"try",[40,1480,1481],{"class":86},":\n",[40,1483,1484,1487,1489],{"class":42,"line":113},[40,1485,1486],{"class":86},"    video ",[40,1488,190],{"class":82},[40,1490,1491],{"class":86}," client.generate_video(payload)\n",[40,1493,1494,1497],{"class":42,"line":470},[40,1495,1496],{"class":82},"except",[40,1498,1499],{"class":86}," VideoTimeoutError:\n",[40,1501,1502,1505],{"class":42,"line":485},[40,1503,1504],{"class":106},"    ...",[40,1506,1507],{"class":116},"   # still not finished after `timeout` seconds\n",[40,1509,1510,1512,1515,1518],{"class":42,"line":499},[40,1511,1496],{"class":82},[40,1513,1514],{"class":86}," VisionStoryAPIError ",[40,1516,1517],{"class":82},"as",[40,1519,1520],{"class":86}," e:\n",[40,1522,1523,1525],{"class":42,"line":511},[40,1524,1504],{"class":106},[40,1526,1527],{"class":116},"   # API returned an error, or the task failed — credits for failed tasks are refunded automatically\n",[26,1529,1531],{"id":1530},"related-visionstory-developer-guides","相关 VisionStory 开发指南",[1533,1534,1535,1543,1550,1555],"ul",{},[1536,1537,1538,1542],"li",{},[63,1539,1541],{"href":1540},"\u002Fguides\u002Fquick-start","快速开始"," — 分步骤完成相同流程。",[1536,1544,1545,1549],{},[63,1546,1548],{"href":1547},"\u002Fguides\u002Ffor-agents","面向 Agent"," — 让 AI Agent 通过 Skill 或 MCP Server 调用 API。",[1536,1551,1552,1554],{},[63,1553,1310],{"href":1309}," — 语音转文字、SRT 和强制对齐。",[1536,1556,1557,1561],{},[63,1558,1560],{"href":1559},"\u002Freference","API 参考"," — 查看 SDK 封装的全部接口。",[26,1563,1565],{"id":1564},"structured-media-extraction-and-speech-rate","结构化媒体提取与语速",[10,1567,1568,1569,1572,1573,742,1576,1579,1580,1583,1584,742,1587,1579,1590,134],{},"使用 ",[13,1570,1571],{},"understand_media"," 从图片、音频或视频中提取符合 Schema 约束的 JSON。必填参数为 ",[13,1574,1575],{},"prompt",[13,1577,1578],{},"inputs"," 和 ",[13,1581,1582],{},"schema","；同步等待最长 180 秒，返回 ",[13,1585,1586],{},"output",[13,1588,1589],{},"usage",[13,1591,1592],{},"cost_credit",[31,1594,1596],{"className":73,"code":1595,"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,1597,1598,1608,1612,1620,1630,1642,1664,1716,1720,1732,1736,1772],{"__ignoreMap":36},[40,1599,1600,1602,1604,1606],{"class":42,"line":43},[40,1601,83],{"class":82},[40,1603,87],{"class":86},[40,1605,90],{"class":82},[40,1607,178],{"class":86},[40,1609,1610],{"class":42,"line":96},[40,1611,100],{"emptyLinePlaceholder":99},[40,1613,1614,1616,1618],{"class":42,"line":103},[40,1615,187],{"class":86},[40,1617,190],{"class":82},[40,1619,193],{"class":86},[40,1621,1622,1625,1627],{"class":42,"line":113},[40,1623,1624],{"class":86},"result ",[40,1626,190],{"class":82},[40,1628,1629],{"class":86}," client.understand_media(\n",[40,1631,1632,1635,1637,1640],{"class":42,"line":470},[40,1633,1634],{"class":416},"    prompt",[40,1636,190],{"class":82},[40,1638,1639],{"class":50},"\"Identify the subject\"",[40,1641,496],{"class":86},[40,1643,1644,1647,1649,1652,1655,1658,1661],{"class":42,"line":485},[40,1645,1646],{"class":416},"    inputs",[40,1648,190],{"class":82},[40,1650,1651],{"class":86},"[{",[40,1653,1654],{"class":50},"\"asset_id\"",[40,1656,1657],{"class":86},": ",[40,1659,1660],{"class":50},"\"YOUR_ASSET_ID\"",[40,1662,1663],{"class":86},"}],\n",[40,1665,1666,1669,1671,1674,1677,1679,1682,1684,1687,1690,1693,1695,1697,1699,1702,1705,1708,1711,1713],{"class":42,"line":499},[40,1667,1668],{"class":416},"    schema",[40,1670,190],{"class":82},[40,1672,1673],{"class":86},"{",[40,1675,1676],{"class":50},"\"type\"",[40,1678,1657],{"class":86},[40,1680,1681],{"class":50},"\"object\"",[40,1683,868],{"class":86},[40,1685,1686],{"class":50},"\"properties\"",[40,1688,1689],{"class":86},": {",[40,1691,1692],{"class":50},"\"subject\"",[40,1694,1689],{"class":86},[40,1696,1676],{"class":50},[40,1698,1657],{"class":86},[40,1700,1701],{"class":50},"\"string\"",[40,1703,1704],{"class":86},"}}, ",[40,1706,1707],{"class":50},"\"required\"",[40,1709,1710],{"class":86},": [",[40,1712,1692],{"class":50},[40,1714,1715],{"class":86},"]},\n",[40,1717,1718],{"class":42,"line":511},[40,1719,251],{"class":86},[40,1721,1722,1724,1727,1730],{"class":42,"line":654},[40,1723,107],{"class":106},[40,1725,1726],{"class":86},"(result[",[40,1728,1729],{"class":50},"\"output\"",[40,1731,1381],{"class":86},[40,1733,1734],{"class":42,"line":671},[40,1735,100],{"emptyLinePlaceholder":99},[40,1737,1738,1740,1742,1745,1747,1749,1752,1754,1757,1759,1761,1763,1765,1767,1770],{"class":42,"line":676},[40,1739,1324],{"class":86},[40,1741,190],{"class":82},[40,1743,1744],{"class":86}," client.create_speech(",[40,1746,727],{"class":416},[40,1748,190],{"class":82},[40,1750,1751],{"class":50},"\"Hello\"",[40,1753,868],{"class":86},[40,1755,1756],{"class":416},"voice_id",[40,1758,190],{"class":82},[40,1760,662],{"class":50},[40,1762,868],{"class":86},[40,1764,751],{"class":416},[40,1766,190],{"class":82},[40,1768,1769],{"class":50},"\"slow\"",[40,1771,251],{"class":86},[40,1773,1774],{"class":42,"line":690},[40,1775,1776],{"class":116},"# Save speech[\"audio\"] as MP3. Omit speech_rate to keep normal speed.\n",[10,1778,1779,724,1781,742,1784,1787,1788,1791,1792,1795,1796,1802,1803,134],{},[13,1780,751],{},[13,1782,1783],{},"slow",[13,1785,1786],{},"normal"," 或 ",[13,1789,1790],{},"fast","，传入 ",[13,1793,1794],{},"None"," 时不发送此字段。输入限制、计费和超时处理见",[63,1797,1801],{"href":1798,"rel":1799},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Fmedia-understanding",[1800],"nofollow","媒体理解","；二进制响应见",[63,1804,1807],{"href":1805,"rel":1806},"https:\u002F\u002Fdevelopers.visionstory.ai\u002Fguides\u002Ftext-to-speech",[1800],"文本转语音",[1809,1810,1811],"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":1813},[1814,1815,1816,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830],{"id":28,"depth":96,"text":29},{"id":57,"depth":96,"text":58},{"id":137,"depth":96,"text":138,"children":1817},[1818,1819],{"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":925,"depth":96,"text":926},{"id":972,"depth":96,"text":973},{"id":1153,"depth":96,"text":1154},{"id":1313,"depth":96,"text":1314},{"id":1384,"depth":96,"text":1385},{"id":1452,"depth":96,"text":1453},{"id":1530,"depth":96,"text":1531},{"id":1564,"depth":96,"text":1565},"安装无运行时依赖的 VisionStory Python SDK，完成媒体生成、声音筛选、语音合成、音频转写、字幕创建和 API 资源管理。","md",{},{"title":1835,"order":654},"Python SDK","\u002Fguides-zh\u002Fsdk",{"title":5,"description":1831},"guides-zh\u002Fsdk","u24biwt2qOxH0KVslknvvw_oE_rMcxzUtXf8eKMmQzA","\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:#FFA657\">limit\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">20\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># owned avatars\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E6EDF3\">client.list_avatars(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">is_public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">True\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\">20\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"># public avatar library\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=28\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\">avatar \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\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.update_avatar_framing(\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:#E6EDF3\">avatar[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"avatar_id\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    aspect_ratio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"9:16\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    zoom\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1.2\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    offset_x\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">0\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFA657\">    offset_y\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=-\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">0.25\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\">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>",1790231923841]