## Basic tool info Model name: pruna/p-video-avatar Model description: Generate a lip-synced talking avatar video from a single portrait image plus a script or uploaded audio. Pick a voice, language, and 720p or 1080p output. Model cover: https://cdn.wiro.ai/uploads/models/pruna-p-video-avatar-cover.mp4 Model categories: - tool - use-agent - quick-showcase - partner - pruna - fast-inference - image-to-video - nogpu-pipeline Run Task Endpoint (POST): https://api.wiro.ai/v1/Run/pruna/p-video-avatar Get Task Detail Endpoint (POST): https://api.wiro.ai/v1/Task/Detail ## Model Inputs: - name: inputImage label: Input Image help: Required: Portrait image (jpg, jpeg, png, webp) type: combinefileinput default: pruna-p-videoavatar-input-1.jpg - name: voiceScript label: Voice Script help: Script for the person to say. Required if no audio is provided. Ignored when audio is provided type: textarea default: We all know how frustrating it can be when you're dealing with flat tire. It wastes your time, drains your energy, and gets in the way of your day. That is exactly why this product was created. By combining smart design with intuitive features, it completely eliminates the hassle and lets you get back to what matters most. It's fast, it's reliable, and it's incredibly easy to use. Click the link below to see exactly how it works. - name: voice label: Voice help: Voice for generated speech. Ignored when audio is provided type: select default: Zephyr (Female) options: - value: "Zephyr (Female)" label: Zephyr (Female) - value: "Puck (Male)" label: Puck (Male) - value: "Charon (Male)" label: Charon (Male) - value: "Kore (Female)" label: Kore (Female) - value: "Fenrir (Male)" label: Fenrir (Male) - value: "Leda (Female)" label: Leda (Female) - value: "Orus (Male)" label: Orus (Male) - value: "Aoede (Female)" label: Aoede (Female) - value: "Callirrhoe (Female)" label: Callirrhoe (Female) - value: "Autonoe (Female)" label: Autonoe (Female) - value: "Enceladus (Male)" label: Enceladus (Male) - value: "Iapetus (Male)" label: Iapetus (Male) - value: "Umbriel (Male)" label: Umbriel (Male) - value: "Algenib (Male)" label: Algenib (Male) - value: "Despina (Female)" label: Despina (Female) - value: "Erinome (Female)" label: Erinome (Female) - value: "Laomedeia (Female)" label: Laomedeia (Female) - value: "Achernar (Female)" label: Achernar (Female) - value: "Algieba (Male)" label: Algieba (Male) - value: "Schedar (Male)" label: Schedar (Male) - value: "Gacrux (Female)" label: Gacrux (Female) - value: "Pulcherrima (Female)" label: Pulcherrima (Female) - value: "Achird (Male)" label: Achird (Male) - value: "Zubenelgenubi (Male)" label: Zubenelgenubi (Male) - value: "Vindemiatrix (Female)" label: Vindemiatrix (Female) - value: "Sadachbia (Male)" label: Sadachbia (Male) - value: "Sadaltager (Male)" label: Sadaltager (Male) - value: "Sulafat (Female)" label: Sulafat (Female) - value: "Alnilam (Male)" label: Alnilam (Male) - value: "Rasalgethi (Male)" label: Rasalgethi (Male) - name: voiceLanguage label: Voice Language help: Output language. Ignored when audio is provided type: select default: English (US) options: - value: "English (US)" label: English (US) - value: "English (UK)" label: English (UK) - value: "Spanish" label: Spanish - value: "French" label: French - value: "German" label: German - value: "Italian" label: Italian - value: "Portuguese (Brazil)" label: Portuguese (Brazil) - value: "Japanese" label: Japanese - value: "Korean" label: Korean - value: "Hindi" label: Hindi - name: inputAudio label: Input Audio help: Optional: Audio (flac, mp3, wav). Takes priority over Voice Script if both provided type: combinefileinput default: - name: resolution label: Resolution help: Required. 720p ($0.025/sec) or 1080p ($0.045/sec) type: select default: 720p options: - value: "720p" label: 720p - value: "1080p" label: 1080p - name: videoPrompt label: Video Prompt help: Optional prompt describing the video type: textarea default: The person is talking. - name: voicePrompt label: Voice Prompt help: Optional speaking style, tone, pacing or emotion instructions type: textarea default: Say the following. - name: seed label: Seed help: Random seed. Leave zero to randomize the seed type: text default: 0 - name: disableSafetyFilter label: Disable Safety Filter help: When disabled, prompts and image are not checked for unsafe content before generation type: select default: true options: - value: "true" label: True - value: "false" label: False - name: disablePromptUpsampling label: Disable Prompt Upsampling help: When true, skip the multimodal prompt upsampler and pass the raw user prompt to the video model type: select default: false options: - value: "true" label: True - value: "false" label: False ## Integration Header Prepare ```bash # Sign up Wiro dashboard and create project export YOUR_API_KEY="{{useSelectedProjectAPIKey}}"; export YOUR_API_SECRET="XXXXXXXXX"; # unix time or any random integer value export NONCE=$(date +%s); # hmac-SHA256 (YOUR_API_SECRET+Nonce) with YOUR_API_KEY export SIGNATURE="$(echo -n "${YOUR_API_SECRET}${NONCE}" | openssl dgst -sha256 -hmac "${YOUR_API_KEY}")"; ``` ## Run Command - Make HTTP Post Request ```bash curl -X POST "https://api.wiro.ai/v1/Run/pruna/p-video-avatar" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "inputImage": "pruna-p-videoavatar-input-1.jpg", "voiceScript": "We all know how frustrating it can be when you're dealing with flat tire. It wastes your time, drains your energy, and gets in the way of your day. That is exactly why this product was created. By combining smart design with intuitive features, it completely eliminates the hassle and lets you get back to what matters most. It's fast, it's reliable, and it's incredibly easy to use. Click the link below to see exactly how it works.", "voice": "Zephyr (Female)", "voiceLanguage": "English (US)", "inputAudio": "", "resolution": "720p", "videoPrompt": "The person is talking.", "voicePrompt": "Say the following.", "seed": "0", "disableSafetyFilter": "true", "disablePromptUpsampling": "false", "callbackUrl": "You can provide a callback URL; Wiro will send a POST request to it when the task is completed." }'; ``` ## Run Command - Response ```json { "errors": [], "taskid": "2221", "socketaccesstoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt", "result": true } ``` ## Get Task Detail - Make HTTP Post Request with Task ID ```bash curl -X POST "https://api.wiro.ai/v1/Task/Detail" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "taskid": "2221" }'; ``` ## Get Task Detail - Make HTTP Post Request with Socket Access Token ```bash curl -X POST "https://api.wiro.ai/v1/Task/Detail" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "tasktoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt" }'; ``` ## Get Task Detail - Response ```json { "total": "1", "errors": [], "tasklist": [ { "id": "2221", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "socketaccesstoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt", "parameters": {}, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_postprocess_end", "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` ## Kill Task - Make HTTP Post Request with Task ID ```bash curl -X POST "https://api.wiro.ai/v1/Task/Kill" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "taskid": "534574" }'; ``` ## Kill Task - Make HTTP Post Request with Socket Access Token ```bash curl -X POST "https://api.wiro.ai/v1/Task/Kill" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE" }'; ``` ## Kill Task - Response ```json { "errors": [], "tasklist": [ { "id": "534574", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "name": "", "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE", "parameters": { "inputImage": "https://api.wiro.ai/v1/File/mCmUXgZLG1FNjjjwmbtPFr2LVJA112/inputImage-6060136.png" }, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_cancel", "cps": "0.000585000000", "totalcost": "0.003510000000", "guestid": null, "projectid": "699", "modelid": "598", "description": "", "basemodelid": "0", "runtype": "model", "modelfolderid": "", "modelfileid": "", "callbackurl": "", "marketplaceid": null, "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "pexit": "0", "categories": "["tool","image-to-image","quick-showcase","compare-landscape"]", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "foldercount": "0", "filecount": "0", "ispublic": 0, "expiretime": null, "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` ## Cancel Task - Make HTTP Post Request (For tasks on queue) ```bash curl -X POST "https://api.wiro.ai/v1/Task/Cancel" -H "Content-Type: multipart/form-data" -H "x-api-key: ${YOUR_API_KEY}" -H "x-nonce: ${NONCE}" -H "x-signature: ${SIGNATURE}" -d '{ "taskid": "634574" }'; ``` ## Cancel Task - Response ```json { "errors": [], "tasklist": [ { "id": "634574", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "name": "", "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE", "parameters": { "inputImage": "https://api.wiro.ai/v1/File/mCmUXgZLG1FNjjjwmbtPFr2LVJA112/inputImage-6060136.png" }, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_cancel", "cps": "0.000585000000", "totalcost": "0.003510000000", "guestid": null, "projectid": "699", "modelid": "598", "description": "", "basemodelid": "0", "runtype": "model", "modelfolderid": "", "modelfileid": "", "callbackurl": "", "marketplaceid": null, "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "pexit": "0", "categories": "["tool","image-to-image","quick-showcase","compare-landscape"]", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "foldercount": "0", "filecount": "0", "ispublic": 0, "expiretime": null, "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` ## Task Status Information This section defines the possible task status values returned by the API when polling for task completion. ### Completed Task Statuses (Polling can stop) These indicate that the task has reached a terminal state — either success or failure. Once any of these is received, polling should stop. - task_postprocess_end : Task completed successfully and post-processing is done. - task_cancel : Task was cancelled by the user or system. ### Running Task Statuses (Continue polling) These statuses indicate that the task is still in progress. Polling should continue if one of these is returned. - task_queue : Task is waiting in the queue. - task_accept : Task has been accepted for processing. - task_assign : Task is being assigned to a worker. - task_preprocess_start : Preprocessing is starting. - task_preprocess_end : Preprocessing is complete. - task_start : Task execution has started. - task_output : Output is being generated.