isolate_voice
Apply or clear AI voice isolation on a video or audio item with spoken human voice. This is not generic denoise — it is speech-only enhancement.
External MCP voice-isolation rule: action="apply" without filePath requires itemId, sourceAssetId, full projectId and timelineId UUIDs, and a connected authenticated browser executor with readable media via the editor tool bridge. The visible page need not show that target. If browser execution is unavailable, create a DeepFilterNet3 full-source WAV locally, import it through import_media plus the asset-import upload-media.mjs helper, then action="attach" with its assetId as denoisedAssetId plus itemId and sourceAssetId. Attach/clear do not require browser execution. Do not pass workspace filePath on this connector.
Required inputs: apply and attach require itemId and sourceAssetId from inspect_item; attach also requires denoisedAssetId. Clear needs only itemId. Web apply without filePath executes in an authenticated browser and requires the full timelineId UUID; external callers also pass the full projectId UUID. Never pass shortened scope IDs. Get the target timelineId from editor state, read_project, or manage_timelines action="list". Workspace filePath apply, attach, and clear do not require browser execution. Desktop uses its separate native tool contract.
IMPORTANT — only for clips that contain spoken human voice: The open editor selects its native speech-enhancement engine: ChatCut Desktop uses flux MossFormer2 with a persistent disk cache; Web uses DeepFilterNet3. Both suppress everything EXCEPT human speech. Applying voice isolation to a clip with no speech (music, ambient noise, sound effects, action footage) will distort or silence the audio. If the user's clip does not contain spoken voice, tell them ChatCut does not have a suitable tool for that request.
Desktop MossFormer2 runs at its native fixed strength; Desktop normalizes legacy strength values to 100. Web DeepFilterNet3 continues to support strength 0-100.
Use this tool for spoken-voice dereverb too: When the user asks to reduce room echo, reverb, reverberation, or "echoey" / "distant" speech (去混响 / 回声大 / 空旷感 / 人声不贴耳), treat it as a voice-isolation use case if the target clip contains spoken human voice. Do not use it as generic dereverb for music, ambience, SFX, or non-speech recordings.
How this tool works:
Preferred route when the editor is open: call action="apply" with itemId and sourceAssetId, no filePath. The open editor runs the same platform-native AI Voice Isolation pipeline as the manual UI, creates the derived audio asset, and points the item at it.
Workspace route: run the
deep-filterbinary (DeepFilterNet3) locally to produce a voice-isolated WAV, then call action="apply" with filePath and sourceAssetId. The local engine MUST be DeepFilterNet3, or the derivative is incompatible with the editor's cache.External connector route: call import_media action="create_session", run the asset-import upload-media.mjs helper on the already-cleaned WAV, then action="attach" with the returned audio assetId. The source asset is never modified; clearing reverts to the original.
If DeepFilterNet3 is missing, install it; do not substitute generic ffmpeg denoise. Use a deep-filter release binary, or a temp Python 3.11 venv with deepfilternet==0.5.6, torch==2.3.1, torchaudio==2.3.1, soundfile==0.12.1; run deep-filter-py --model-base-dir DeepFilterNet3 --atten-lim <0-100> --output-dir <dir> <input.wav>.
Workspace workflow (driven by the voice-isolation skill when the frontend route is unavailable):
Use preview_timeline to find the target item, then inspect_item for its assetId and audio state. If it shows no speech signals and likely has no spoken voice, do NOT proceed — tell the user.
Get the full source asset audio locally, not just the visible timeline range; timeline items can have sourceStart offsets. For video, extract the full audio track with ffmpeg and transcode to mono 48 kHz WAV.
Run DeepFilterNet3 on that full-source WAV:
deep-filter -a <0-100> <input.wav>ordeep-filter-py --model-base-dir DeepFilterNet3 --atten-lim <0-100> --output-dir <dir> <input.wav>(atten-lim-db: 0=no reduction, 100=full).apply (workspace filePath) or attach (already-uploaded denoisedAssetId).
itemId / sourceAssetId / denoisedAssetId accept 10-hex prefix ids or full UUIDs.
Actions:
apply: itemId, sourceAssetId (the item's current assetId), optional strength (0-100, default 100). With no filePath, asks the open editor to run AI Voice Isolation. With filePath, uploads the workspace wav and points the item at it; strength must match the deep-filter -a value.
attach: itemId, denoisedAssetId (an already-uploaded voice-isolated audio asset), sourceAssetId, optional strength. Points the item at that asset. The asset must actually contain the item's audio: a freshly uploaded cleaned file must span the whole source, and an apply-produced derivative keeps the source slice it was made for. Never reuse one item's apply output on other items — the item would go silent; call apply on each item instead. On connectors with no workspace, import the cleaned WAV through import_media plus the asset-import upload-media.mjs helper, then attach its returned assetId.
clear: itemId only. Reverts to the original audio.
Returns JSON describing what changed.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"action": "<action>",
"itemId": "<itemId>"
},
"name": "isolate_voice"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | apply requires sourceAssetId; without filePath it also requires full timelineId browser scope. attach requires sourceAssetId and denoisedAssetId. clear requires only itemId. | |
| itemId | Yes | Target audio/video item id (prefix or full UUID) from preview_timeline. | |
| strength | No | apply/attach: voice isolation strength 0-100 (atten-lim-db), default 100. | |
| projectId | No | Full project UUID. Required for external browser work; internal agents may omit. Execution/explicit-timeline calls never change later calls' target. | |
| timelineId | No | Full timeline UUID, not a prefix. Required for browser work, even unplaced assets. Get it from read_project or manage_timelines action="list". Never switches visible timeline. | |
| sourceAssetId | No | Required for apply and attach; optional only for clear. Copy the target item's current assetId from inspect_item. Asset IDs may be unambiguous prefixes; projectId and timelineId must be full UUIDs. | |
| idempotencyKey | No | Stable key for this browser execution. Reuse only with identical scope and parameters after a lost acknowledgement; applies only to this call. | |
| denoisedAssetId | No | Required for attach, otherwise omit: assetId of the already-uploaded voice-isolated audio asset. | |
| browserProfileId | No | Optional browser profile override. Omit to select automatically; do not ask the user to choose. |