@starreel/mcp 0.1.242 → 0.1.243

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/SKILL.md CHANGED
@@ -1199,6 +1199,9 @@ shot whose voice drifted despite the anchor. Check them in this order:
1199
1199
  ≤0.05 s, so lip-sync and picture stay), skips shots that already carry the
1200
1200
  current anchor and match it, and keeps the original audio when QC fails.
1201
1201
  `preview_voice_unify` lets the customer listen to one shot first (free).
1202
+ Choose the target voice with `set_voice_unify_target` (the shot whose voice
1203
+ is right) rather than an IP voice anchor: the target is read only by voice
1204
+ unification, so generation keeps locking first/last frames.
1202
1205
  Recompose (`rerender_episode`) for `applied` shots to reach the final cut.
1203
1206
 
1204
1207
  ### "话没说完就切" / a line gets cut off mid-word
@@ -137,7 +137,9 @@
137
137
  "scan_wardrobe_consistency": "★Run this when the customer reports \"the same character changed clothes / clothing color or style is wrong\"; also recommended before final assembly. For each shot, compare the used first frame and one mid-video frame against each character's design image in that shot (or character sheet if none) for clothing style and color. A common cause is distant small characters being drawn by the image model in different clothes—even when reference images and prompts are correct. Overall color cast from night scenes/warm lighting does not count as inconsistency. One vision audit per shot, **usage-based billing**. Returns flagged[{shot, characters:[{name, differences}]}] / clean / errors. dry_run=true reports only and does not write back; otherwise writes back, and compose_episode final-assembly precheck will list these shots as wardrobe_mismatch. Remedy: regenerate this shot's first frame (generate_shot_frame), then regenerate_shot_video; reassembling cannot remove it.",
138
138
  "scan_voice_consistency": "★For original-voice dramas (video has built-in human speech), run this when the customer reports \"the same character's voice differs across shots / voice drifted\". Free (local inference, no vendor call). For each shot with dialogue, listens to vendor-generated human speech: whether the dialogue was fully spoken, and whether the voice resembles the timbre anchor bound to that character. **Async**: returns immediately; background full-episode scan takes about 10 minutes. Only one scan per episode can run at the same time (repeat calls return started=false). By default skips shots already scanned for the current video; rescan=true rescans all. Use get_voice_consistency to check progress and per-shot results.",
139
139
  "get_voice_consistency": "Check progress and per-shot results of the voice consistency scan (started by scan_voice_consistency). Free. summary.voice_mismatch = shot numbers whose voice does not resemble the character timbre anchor (focus on these); dialogue_issues = shots where dialogue was incomplete/wrong/extra speech appeared; not_scanned_or_stale = not scanned yet or video changed and needs rescan. speaker_verdict=uncertain means the human speech is too short to judge; it is not an issue. For shots with inconsistent voice: first use get_pipeline_status native_voice_anchor to confirm the character has a bound voice, then regenerate_shot_video. To keep first/last frames (regenerating loses composition) use quote_voice_unify → unify_voices: post-hoc conversion of vocals to the voice anchor's timbre without regenerating video. Shots that went through voice unification carry voice_unify: similarity / coverage / loudness_db are all before→after; summary.voice_unified = shots already in the final cut.",
140
- "quote_voice_unify": "★Use for native-audio dramas (vendor-voiced video) when \"the same character's voice differs across shots\" but you don't want to regenerate video for voice and lose first/last-frame composition. Free quote, read-only. Lists, for every dialogue shot in the episode, whether it needs post-hoc voice unification and why: to_process = no voice anchor was sent at generation / an old anchor was sent, always processed; conditional = the current anchor was sent, voiceprint is measured at execution and the shot is skipped free of charge if it matches; skipped = untouched (locked shot, real footage, existing track-replacement product, character has no voice anchor, etc.; see reason_text). Multi-speaker shots are judged per speaker; only the lines of the speaker that needs it are changed. Billed by seconds of converted speech: estimated_points is the upper bound, typical_points the usual cost—tell the customer both; after they agree call unify_voices with quote_id. Characters without a voice anchor: set_character_voice or set_voice_anchor_from_shot first (pick the shot whose voice is right as the reference). Per-drama gray release; returns 403 if not enabled.",
140
+ "quote_voice_unify": "★Use for native-audio dramas (vendor-voiced video) when \"the same character's voice differs across shots\" but you don't want to regenerate video for voice and lose first/last-frame composition. Free quote, read-only. Lists, for every dialogue shot in the episode, whether it needs post-hoc voice unification and why: to_process = no voice anchor was sent at generation / an old anchor was sent, always processed; conditional = the current anchor was sent, voiceprint is measured at execution and the shot is skipped free of charge if it matches; skipped = untouched (locked shot, real footage, existing track-replacement product, character has no voice anchor, etc.; see reason_text). Multi-speaker shots are judged per speaker; only the lines of the speaker that needs it are changed. Billed by seconds of converted speech: estimated_points is the upper bound, typical_points the usual cost—tell the customer both; after they agree call unify_voices with quote_id. Prefer set_voice_unify_target to choose the target voice (pick the shot whose voice is right; does not affect generation routing); otherwise the character's IP voice anchor is used. Per-drama gray release; returns 403 if not enabled.",
141
+ "set_voice_unify_target": "Set a character's \"unify target voice\": taken from the shot whose voice is right, used only by post-hoc voice unification (quote_voice_unify → unify_voices). Free. ★Difference from set_character_voice / set_voice_anchor_from_shot: those set the IP voice anchor, which native-audio generation sends as reference audio, so first/last frames may not be locked; this field is not read by generation routing, so the drama keeps \"first/last frames lock the picture, unify voice after generation\". Once set, every shot of the character is voiceprint-measured first and skipped free of charge if it already matches; the target shot itself is skipped. The shot must already have video and only this character may speak in it (a multi-speaker shot would mix other voices into the target; returns 400). Clear with clear_voice_unify_target. Per-drama gray release; returns 403 if not enabled.",
142
+ "clear_voice_unify_target": "Clear a character's \"unify target voice\" (set by set_voice_unify_target). Free. After clearing, voice unification falls back to the character's IP voice anchor; with neither, the character is skipped.",
141
143
  "unify_voices": "Run post-hoc voice unification (quote_voice_unify first; call with quote_id after the customer agrees). Only runs the shots in the quote, serially in the background (~1-2 min per shot). Per shot: separate vocals → locate that character's lines by dialogue and voiceprint → convert each line into the voice anchor's timbre (each line's duration changes by ≤0.05s; lip-sync and picture untouched, no video regeneration) → splice back, ambience and SFX kept as-is. If any QC check fails (transcript coverage drops / duration diff >0.1s / similarity to anchor not improved / loudness diff >1dB) the original audio is kept and that shot's charge is refunded. Use get_voice_unify_status for progress and per-shot before/after; shots with status=applied take effect after recomposing (rerender_episode).",
142
144
  "get_voice_unify_status": "Check voice-unification progress and per-shot results (free). summary: applied = unified (effective after recomposing the final cut) / kept_original = QC failed, original audio kept, charge refunded (reason says which check failed) / skipped = voiceprint already matched or no speech found for the character / errors = failed (charge refunded) / superseded = the shot was regenerated, switched or locked while processing; result discarded, not written back (charge refunded). Each shot carries similarity (before→after, to the voice anchor), coverage, loudness_db, points; stale = video or product changed since, result outdated.",
143
145
  "preview_voice_unify": "Preview voice unification on a single shot (free, not written back, not charged). Asynchronous: start=true launches it (~1-2 min); call again without start to get the result. productUrl in the result is the processed video (listen directly); checks are the four QC verdicts. By default the character's voice anchor is the target timbre; with reference_storyboard_id = the shot in the same episode whose voice is right, that shot's vocals become the target (useful before the character has an anchor; speaker selects which character to convert).",
@@ -141,7 +141,9 @@
141
141
  "scan_wardrobe_consistency": "★客户报「同一个角色前后换了衣服 / 衣服颜色款式不对」时跑这个;终拼前也建议跑一次。逐镜把采用的首帧和视频中段一帧,与本镜每个角色的设定图(没有则用定妆图)比对衣服的款式与颜色。常见成因是远景小人物被出图模型画成了别的衣服——即使参考图和提示词都对。夜景/暖光的整体偏色不算不一致。每镜一次视觉审计,**按用量计费**。返回 flagged[{shot, characters:[{name, differences}]}] / clean / errors。dry_run=true 只报告不写回;否则写回,compose_episode 的终拼预检会以 wardrobe_mismatch 列出这些镜。处置:重出该镜首帧(generate_shot_frame)再 regenerate_shot_video;重新拼接去不掉。",
142
142
  "scan_voice_consistency": "★原声剧(视频自带人声)客户报「同一个角色前后嗓音不一样 / 声线漂了」时跑这个。免费(本地推理,不调厂商)。对每个有台词的镜,听厂商生成的人声:台词念没念全,以及声音像不像该角色绑定的声线锚。**异步**:立即返回,后台整集约 10 分钟;同一集同时只跑一条(重复调用返回 started=false)。默认跳过已对当前视频扫过的镜,rescan=true 全部重扫。用 get_voice_consistency 查进度和逐镜结果。",
143
143
  "get_voice_consistency": "查声线一致性扫描的进度与逐镜结果(scan_voice_consistency 启动的)。免费。summary.voice_mismatch=声音不像该角色声线锚的镜号(重点看);dialogue_issues=台词没念完/念错/多出说话声的镜;not_scanned_or_stale=还没扫或视频换过需重扫。speaker_verdict=uncertain 表示人声太短判不了,不是问题。声线不一致的镜:先用 get_pipeline_status 的 native_voice_anchor 确认角色已绑声线,再 regenerate_shot_video 重出;要保住首尾帧(重出会丢构图)就走 quote_voice_unify → unify_voices,事后把人声转成声线锚的嗓音、不重生视频。做过声线统一的镜带 voice_unify:similarity / coverage / loudness_db 都是 before→after;summary.voice_unified=已进成片的镜号。",
144
- "quote_voice_unify": "★原声剧(视频自带人声)「同一个角色前后嗓音不一样」、又不想为声线重出视频丢掉首尾帧构图时用。免费报价、只读。列出本集每个有台词的镜要不要做「事后声线统一」及原因:to_process=出片时没送声线锚 / 送的是旧锚,一定处理;conditional=出片时已送进当前锚,执行时先测声纹,对得上就跳过、不收费;skipped=不动(锁定镜、实拍、已有换轨产物、角色没有声线锚等,见 reason_text)。多人镜按说话人分别判,只改需要处理的那个人的句子。按转换的人声秒数计费:estimated_points 是上界、typical_points 是通常花费,两个都告诉客户,客户同意后带 quote_id 调 unify_voices。角色没有声线锚的先 set_character_voice 或 set_voice_anchor_from_shot(挑一镜嗓音最对的当基准)。逐剧灰度,未开通回 403。",
144
+ "quote_voice_unify": "★原声剧(视频自带人声)「同一个角色前后嗓音不一样」、又不想为声线重出视频丢掉首尾帧构图时用。免费报价、只读。列出本集每个有台词的镜要不要做「事后声线统一」及原因:to_process=出片时没送声线锚 / 送的是旧锚,一定处理;conditional=出片时已送进当前锚,执行时先测声纹,对得上就跳过、不收费;skipped=不动(锁定镜、实拍、已有换轨产物、角色没有声线锚等,见 reason_text)。多人镜按说话人分别判,只改需要处理的那个人的句子。按转换的人声秒数计费:estimated_points 是上界、typical_points 是通常花费,两个都告诉客户,客户同意后带 quote_id 调 unify_voices。目标嗓音优先用 set_voice_unify_target 指定(挑一镜嗓音最对的当基准;不影响出片路线),没指定就用角色的 IP 声线锚。逐剧灰度,未开通回 403。",
145
+ "set_voice_unify_target": "给角色指定「统一目标嗓音」:取自嗓音最对的那一镜,只给事后声线统一(quote_voice_unify → unify_voices)用。免费。★与 set_character_voice / set_voice_anchor_from_shot 的区别:那两个设的是 IP 声线锚,原声剧出片时会送参考音频,首尾帧可能锁不住;这个字段出片路由不读,设了它仍按「首尾帧锁画面、出完再统一声线」走。指定后,该角色每一镜都先测声纹,对得上就跳过、不收费;目标镜自己跳过。这一镜必须已有视频、且只有该角色在说话(多人镜会把别人的嗓音一起当成目标,回 400)。清除用 clear_voice_unify_target。逐剧灰度,未开通回 403。",
146
+ "clear_voice_unify_target": "清除角色的「统一目标嗓音」(set_voice_unify_target 设的)。免费。清除后声线统一改用角色的 IP 声线锚;两者都没有就跳过该角色。",
145
147
  "unify_voices": "执行事后声线统一(必须先 quote_voice_unify,客户同意后带 quote_id)。只跑报价里的镜,后台串行(每镜约 1~2 分钟)。每镜:分离人声 → 按台词与声纹定位该角色的句子 → 逐句转成声线锚的嗓音(每句时长只变 ≤0.05s,口型与画面不动、不重生视频)→ 回填,环境声与音效原样保留。质检任一不过(转写覆盖率下降 / 时长差 >0.1s / 与锚的相似度没提升 / 响度差 >1dB)就保留原音轨并退回该镜费用。用 get_voice_unify_status 看进度与每镜前后对比;status=applied 的镜重拼成片(rerender_episode)后生效。",
146
148
  "get_voice_unify_status": "查声线统一的进度与逐镜结果(免费)。summary:applied=已统一(重拼成片后生效)/ kept_original=质检没过、保留原音轨、费用已退(reason 写了哪项没过)/ skipped=测下来声纹本来就对得上或找不到该角色的人声 / errors=失败(费用已退)/ superseded=处理期间镜头被重出、换版本或锁定,结果作废未写回(费用已退)。每镜带 similarity(before→after,与声线锚的相似度)、coverage、loudness_db、points;stale=视频或产物换过、结论过期。",
147
149
  "preview_voice_unify": "对单镜试听声线统一效果(免费、不写回、不扣费)。异步:start=true 启动(约 1~2 分钟),之后不带 start 再调一次取结果;结果里 productUrl 是处理后的视频(可直接听),checks 是四项质检结论。默认用该角色的声线锚当目标嗓音;reference_storyboard_id=同一集里嗓音最对的那一镜时,改用那一镜的人声当目标(适合角色还没绑锚、先挑基准的情况,speaker 指定转哪个角色)。",
@@ -1797,7 +1797,15 @@ export function registerProduceTools(server, client) {
1797
1797
  '列出本集每个有台词的镜要不要做「事后声线统一」及原因:to_process=出片时没送声线锚 / 送的是旧锚,一定处理;' +
1798
1798
  'conditional=出片时已送进当前锚,执行时先测声纹,对得上就跳过、不收费;skipped=不动(锁定镜、实拍、已有换轨产物、角色没有声线锚等,见 reason_text)。' +
1799
1799
  '多人镜按说话人分别判,只改需要处理的那个人的句子。按转换的人声秒数计费:estimated_points 是上界、typical_points 是通常花费,两个都告诉客户,客户同意后带 quote_id 调 unify_voices。' +
1800
- '角色没有声线锚的先 set_character_voice 或 set_voice_anchor_from_shot(挑一镜嗓音最对的当基准)。逐剧灰度,未开通回 403。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/voice-unify/quote`)));
1800
+ '目标嗓音优先用 set_voice_unify_target 指定(挑一镜嗓音最对的当基准;不影响出片路线),没指定就用角色的 IP 声线锚。逐剧灰度,未开通回 403。', { episode_id: z.number().int().positive() }, async ({ episode_id }) => jsonResult(await client.produceGet(`/episodes/${episode_id}/voice-unify/quote`)));
1801
+ server.tool('set_voice_unify_target', '给角色指定「统一目标嗓音」:取自嗓音最对的那一镜,只给事后声线统一(quote_voice_unify → unify_voices)用。免费。' +
1802
+ '★与 set_character_voice / set_voice_anchor_from_shot 的区别:那两个设的是 IP 声线锚,原声剧出片时会送参考音频,首尾帧可能锁不住;' +
1803
+ '这个字段出片路由不读,设了它仍按「首尾帧锁画面、出完再统一声线」走。指定后,该角色每一镜都先测声纹,对得上就跳过、不收费;目标镜自己跳过。' +
1804
+ '这一镜必须已有视频、且只有该角色在说话(多人镜会把别人的嗓音一起当成目标,回 400)。清除用 clear_voice_unify_target。逐剧灰度,未开通回 403。', {
1805
+ character_id: z.number().int().positive(),
1806
+ storyboard_id: z.number().int().positive().describe('嗓音最对、且只有该角色说话的那一镜(同一部剧、已有视频)'),
1807
+ }, async ({ character_id, storyboard_id }) => jsonResult(await client.producePut(`/characters/${character_id}/voice-unify-target`, { storyboard_id })));
1808
+ server.tool('clear_voice_unify_target', '清除角色的「统一目标嗓音」(set_voice_unify_target 设的)。免费。清除后声线统一改用角色的 IP 声线锚;两者都没有就跳过该角色。', { character_id: z.number().int().positive() }, async ({ character_id }) => jsonResult(await client.produceDelete(`/characters/${character_id}/voice-unify-target`)));
1801
1809
  server.tool('unify_voices', '执行事后声线统一(必须先 quote_voice_unify,客户同意后带 quote_id)。只跑报价里的镜,后台串行(每镜约 1~2 分钟)。' +
1802
1810
  '每镜:分离人声 → 按台词与声纹定位该角色的句子 → 逐句转成声线锚的嗓音(每句时长只变 ≤0.05s,口型与画面不动、不重生视频)→ 回填,环境声与音效原样保留。' +
1803
1811
  '质检任一不过(转写覆盖率下降 / 时长差 >0.1s / 与锚的相似度没提升 / 响度差 >1dB)就保留原音轨并退回该镜费用。' +
package/openapi.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "StarReel Production API",
5
- "version": "0.1.242",
6
- "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.242 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.243",
6
+ "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.243 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
@@ -983,6 +983,118 @@
983
983
  }
984
984
  }
985
985
  },
986
+ "/characters/{character_id}/voice-unify-target": {
987
+ "put": {
988
+ "operationId": "set_voice_unify_target",
989
+ "summary": "给角色指定「统一目标嗓音」:取自嗓音最对的那一镜,只给事后声线统一(quote_voice_unify → unify_voices)用",
990
+ "description": "给角色指定「统一目标嗓音」:取自嗓音最对的那一镜,只给事后声线统一(quote_voice_unify → unify_voices)用。免费。★与 set_character_voice / set_voice_anchor_from_shot 的区别:那两个设的是 IP 声线锚,原声剧出片时会送参考音频,首尾帧可能锁不住;这个字段出片路由不读,设了它仍按「首尾帧锁画面、出完再统一声线」走。指定后,该角色每一镜都先测声纹,对得上就跳过、不收费;目标镜自己跳过。这一镜必须已有视频、且只有该角色在说话(多人镜会把别人的嗓音一起当成目标,回 400)。清除用 clear_voice_unify_target。逐剧灰度,未开通回 403。",
991
+ "tags": [
992
+ "characters"
993
+ ],
994
+ "parameters": [
995
+ {
996
+ "name": "character_id",
997
+ "in": "path",
998
+ "required": true,
999
+ "schema": {
1000
+ "type": "integer",
1001
+ "exclusiveMinimum": 0
1002
+ }
1003
+ }
1004
+ ],
1005
+ "requestBody": {
1006
+ "required": true,
1007
+ "content": {
1008
+ "application/json": {
1009
+ "schema": {
1010
+ "type": "object",
1011
+ "properties": {
1012
+ "storyboard_id": {
1013
+ "type": "integer",
1014
+ "exclusiveMinimum": 0,
1015
+ "description": "嗓音最对、且只有该角色说话的那一镜(同一部剧、已有视频)"
1016
+ }
1017
+ },
1018
+ "required": [
1019
+ "storyboard_id"
1020
+ ]
1021
+ }
1022
+ }
1023
+ }
1024
+ },
1025
+ "responses": {
1026
+ "200": {
1027
+ "description": "StarReel envelope",
1028
+ "content": {
1029
+ "application/json": {
1030
+ "schema": {
1031
+ "type": "object",
1032
+ "properties": {
1033
+ "code": {
1034
+ "type": "integer"
1035
+ },
1036
+ "message": {
1037
+ "type": "string"
1038
+ },
1039
+ "data": {
1040
+ "description": "Operation result payload"
1041
+ }
1042
+ }
1043
+ }
1044
+ }
1045
+ }
1046
+ },
1047
+ "402": {
1048
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
1049
+ }
1050
+ }
1051
+ },
1052
+ "delete": {
1053
+ "operationId": "clear_voice_unify_target",
1054
+ "summary": "清除角色的「统一目标嗓音」(set_voice_unify_target 设的)",
1055
+ "description": "清除角色的「统一目标嗓音」(set_voice_unify_target 设的)。免费。清除后声线统一改用角色的 IP 声线锚;两者都没有就跳过该角色。",
1056
+ "tags": [
1057
+ "characters"
1058
+ ],
1059
+ "parameters": [
1060
+ {
1061
+ "name": "character_id",
1062
+ "in": "path",
1063
+ "required": true,
1064
+ "schema": {
1065
+ "type": "integer",
1066
+ "exclusiveMinimum": 0
1067
+ }
1068
+ }
1069
+ ],
1070
+ "responses": {
1071
+ "200": {
1072
+ "description": "StarReel envelope",
1073
+ "content": {
1074
+ "application/json": {
1075
+ "schema": {
1076
+ "type": "object",
1077
+ "properties": {
1078
+ "code": {
1079
+ "type": "integer"
1080
+ },
1081
+ "message": {
1082
+ "type": "string"
1083
+ },
1084
+ "data": {
1085
+ "description": "Operation result payload"
1086
+ }
1087
+ }
1088
+ }
1089
+ }
1090
+ }
1091
+ },
1092
+ "402": {
1093
+ "description": "Insufficient prepaid balance (never overdrafts); response carries `needed` points"
1094
+ }
1095
+ }
1096
+ }
1097
+ },
986
1098
  "/dramas": {
987
1099
  "post": {
988
1100
  "operationId": "create_drama",
@@ -11560,7 +11672,7 @@
11560
11672
  "get": {
11561
11673
  "operationId": "quote_voice_unify",
11562
11674
  "summary": "★原声剧(视频自带人声)「同一个角色前后嗓音不一样」、又不想为声线重出视频丢掉首尾帧构图时用",
11563
- "description": "★原声剧(视频自带人声)「同一个角色前后嗓音不一样」、又不想为声线重出视频丢掉首尾帧构图时用。免费报价、只读。列出本集每个有台词的镜要不要做「事后声线统一」及原因:to_process=出片时没送声线锚 / 送的是旧锚,一定处理;conditional=出片时已送进当前锚,执行时先测声纹,对得上就跳过、不收费;skipped=不动(锁定镜、实拍、已有换轨产物、角色没有声线锚等,见 reason_text)。多人镜按说话人分别判,只改需要处理的那个人的句子。按转换的人声秒数计费:estimated_points 是上界、typical_points 是通常花费,两个都告诉客户,客户同意后带 quote_id 调 unify_voices。角色没有声线锚的先 set_character_voice 或 set_voice_anchor_from_shot(挑一镜嗓音最对的当基准)。逐剧灰度,未开通回 403。",
11675
+ "description": "★原声剧(视频自带人声)「同一个角色前后嗓音不一样」、又不想为声线重出视频丢掉首尾帧构图时用。免费报价、只读。列出本集每个有台词的镜要不要做「事后声线统一」及原因:to_process=出片时没送声线锚 / 送的是旧锚,一定处理;conditional=出片时已送进当前锚,执行时先测声纹,对得上就跳过、不收费;skipped=不动(锁定镜、实拍、已有换轨产物、角色没有声线锚等,见 reason_text)。多人镜按说话人分别判,只改需要处理的那个人的句子。按转换的人声秒数计费:estimated_points 是上界、typical_points 是通常花费,两个都告诉客户,客户同意后带 quote_id 调 unify_voices。目标嗓音优先用 set_voice_unify_target 指定(挑一镜嗓音最对的当基准;不影响出片路线),没指定就用角色的 IP 声线锚。逐剧灰度,未开通回 403。",
11564
11676
  "tags": [
11565
11677
  "episodes"
11566
11678
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.242",
3
+ "version": "0.1.243",
4
4
  "mcpName": "ai.starreel/starreel",
5
5
  "description": "StarReel MCP server — drive the AI short-drama production pipeline (script → storyboards → frames → video → final cut) from Claude, Cursor, or any MCP client",
6
6
  "license": "MIT",
package/server.json CHANGED
@@ -2,13 +2,13 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
3
3
  "name": "ai.starreel/starreel",
4
4
  "description": "Turn a script into a finished, downloadable short-drama episode — via MCP or REST.",
5
- "version": "0.1.242",
5
+ "version": "0.1.243",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.242",
11
+ "version": "0.1.243",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },