免费的全模态Agnes API 实战系列(三):多角色对话视频生成——让同一画面的不同人物开口说话

前言

在前两篇文章中,我们介绍了Agnes AI API的基础用法和提示词编写技巧。本篇将聚焦一个更具挑战性的场景:如何让同一画面中的不同角色分别开口说话

这个需求在制作对话场景、角色互动视频时非常常见,但在AI视频生成中却是一个技术难点。我们将通过实际测试,展示如何编写提示词、如何选择语音参数,并分享在测试过程中发现的优化技巧。


一、问题背景:为什么多角色对话这么难?

在AI视频生成中,让单个角色说话已经不容易,要让同一画面中的多个角色分别开口说话,面临的挑战包括:

  1. 只有部分角色说话:模型倾向于让"主要角色"说话,其他角色静止
  2. 口型不同步:说话角色的嘴部动作不自然
  3. 语音混乱:分不清是谁在说话,或者用了错误的语言
  4. 角色特征丢失:为了生成对话,模型重新绘制了角色,导致形象不一致

在我们的测试项目中(一张包含祖孙四代的家族肖像),这些问题逐一出现,并通过迭代优化逐步解决。


二、初次测试:为什么只有一个人说话?

2.1 测试设置

我们使用一张家族肖像图(包含:青年男子、中年女子、老年男子、小女孩),测试让每个角色分别开口说话。

初始提示词(错误示范)

复制代码
让画面左边的中年女子说:"你好!"

结果:4个视频中,只有第4个(小女孩)正确说话,前3个角色都没有开口。

2.2 问题分析

通过多次测试,我们发现了两个关键问题:

问题1:位置描述不准确

模型不理解"左边"、"右边"这样的位置描述,特别是当画面中有多个相似角色时。

问题2:缺少嘴部动作描述

即使模型理解了要让谁说话,如果没有明确描述"嘴在动",生成的结果往往是角色静止,或者只有轻微的面部表情变化。


三、优化方案:如何让指定角色开口说话

3.1 优化1:用服装特征代替位置描述

核心思路 :不使用"左边"、"右边"等位置词,而是用服装、外观特征来指定角色。

优化后提示词

复制代码
让身穿白色T恤的青年男子说:"你好!"
他正在说话,嘴在动。

原理

  • 服装特征(白色T恤、红色连衣裙、灰色西装等)比位置描述更明确
  • 模型能更准确地识别要动画化哪个角色

3.2 优化2:明确描述嘴部动作

在提示词中加入**"嘴在动"、"正在说话"**等描述,强制模型生成嘴部动画。

提示词模板

复制代码
[角色特征描述] + [对话内容] + "他/她正在说话,嘴在动"

3.3 优化3:用括号指定语言

在视频生成中,可以用括号强制指定说话语言:

复制代码
(用中文说)"你好!"

实测效果:✅ 有效!角色会用中文发音,而不是随机语言。

3.4 完整优化提示词(最终版)

复制代码
让身穿白色T恤的青年男子说:(用中文说)"你好!"
他正在说话,他的嘴在动。
青年男子的声音,年轻男性的声音。
NO English speech.

关键要素

  1. ✅ 用服装特征指定角色
  2. ✅ 用括号指定语言
  3. ✅ 明确描述嘴部动作
  4. ✅ 指定声音特征(年龄、性别)
  5. ✅ 用"NO 语言"防止混入其他语言

四、实测效果:四代同堂对话视频

4.1 测试设置

输入图片:家族肖像(青年男子、中年女子、老年男子、小女孩)

目标 :让每个角色分别开口说话

4.2 优化前(v1)------ 只有1/4成功

角色 提示词 结果
青年男子 "让画面左边的青年男子说..." ❌ 没说话
中年女子 "让画面中间的中年女子说..." ❌ 没说话
老年男子 "让画面右边的老年男子说..." ❌ 没说话
小女孩 "让画面左下方的小女孩说..." ✅ 说话了

问题:位置描述不准确,模型无法识别目标角色。

4.3 优化后(v2)------ 3/4成功

角色 提示词 结果
青年男子 "让身穿白色T恤的青年男子说..." + "嘴在动" ✅ 说话了

img2vid_v2_1_young_man

| 中年女子 | "让身穿红色连衣裙的中年女子说..." + "嘴在动" | ✅ 说话了 |

img2vid_v2_2_middle_woman

| 老年男子 | "让身穿灰色西装的老年男子说..." + "嘴在动" | ❌ 没说话 |

img2vid_1_young_man

| 小女孩 | "让身穿粉色裙子的小女孩说..." + "嘴在动" | ✅ 说话了 |

img2vid_4_young_girl

改进:用服装特征指定角色,3/4成功。

剩余问题:老年男子仍然没说话。分析原图发现,老年男子的"灰色西装"在画面中不够突出,模型可能误识别了其他角色。

4.4 最终版(v3)------ 4/4全部成功

针对老年男子,进一步优化提示词:

复制代码
让画面中头发花白、身穿深灰色上衣的老年男子说:
(用中文说)"你好!"
他正在说话,他的嘴在动。
老年男性的声音,低沉的嗓音。
NO English speech.

结果:✅ 老年男子也开口说话了!

关键改进

  • 不只描述服装,还加入了"头发花白"这一外貌特征
  • 指定了"低沉的嗓音",帮助模型选择正确的音色

img2vid_v3_3_elderly


五、语音参数与音色选择

5.1 Agnes API的语音参数

在Agnes API中,语音是通过提示词来控制的(而不是单独的API参数)。这意味着,您需要在prompt中描述期望的音色。

支持的音色描述

  • 年龄:年轻、中年、老年
  • 性别:男性、女性
  • 音色特点:低沉、清脆、沙哑、温和等

5.2 实测音色效果

我们测试了8种不同音色,以下是结果总结:

音色描述 提示词关键词 效果
年轻男性 "青年男子的声音" ✅ 清晰,有活力
中年男性 "中年男性的声音" ✅ 稳重,成熟
老年男性 "老年男性的声音,低沉的嗓音" ✅ 沙哑,有质感
小男孩 "小男孩的声音,清脆" ✅ 高亢,稚嫩
年轻女性 "年轻女性的声音" ✅ 清亮,柔和
中年女性 "中年女性的声音,温和" ✅ 沉稳,亲切
老年女性 "老年女性的声音,沙哑" ✅ 沧桑,有故事感
小女孩 "小女孩的声音,甜美" ✅ 可爱,高亢

5.3 中英文混合对话

如果希望角色说中文,但背景音或字幕是英文,可以在提示词中明确指定:

复制代码
(用中文说)"你好!"
Chinese dialogue, (用中文说)"你好!"
NO English speech.

注意:实测发现,加入"NO English speech"可以有效防止模型混入英文发音。


六、多角色对话的高级技巧

6.1 让两个角色对话

如果想要两个角色一问一答,可以在提示词中描述对话顺序:

复制代码
青年男子先说:(用中文说)"你最近好吗?"
然后中年女子回答:(用中文说)"我很好,谢谢!"
青年男子的嘴先动,然后中年女子的嘴动。

注意 :目前Agnes API的视频生成是一次性生成整个片段,无法做真正的"轮播对话"。上述提示词的效果取决于模型是否能理解"先...然后..."的时间顺序。

6.2 口型同步优化

如果发现口型不同步或不自然,可以尝试:

  1. 加入"mouth is moving naturally"

    复制代码
    His mouth is moving naturally, lip sync with the dialogue.
  2. 指定对话速度

    复制代码
    Speaking slowly and clearly, mouth moving with each word.
  3. 避免过长对话

    • 建议单条对话不超过10个字/词
    • 过长对话容易导致口型不同步

6.3 多角色场景的Prompt模板

复制代码
[指定角色]: 用[服装/外貌特征]描述,不要用位置
[对话内容]: 用括号指定语言,如(用中文说)"..."
[动作描述]: "他/她正在说话,嘴在动"
[音色描述]: [年龄] + [性别] + [音色特点]
[负面约束]: "NO [不需要的语言] speech"

完整示例

复制代码
让身穿白色T恤的青年男子说:
(用中文说)"你好!"
他正在说话,他的嘴在动。
青年男子的声音,年轻男性的声音,清晰的嗓音。
NO English speech.

七、完整测试代码

以下是一个完整的测试脚本,展示如何让同一画面中的不同角色开口说话:

python 复制代码
from openai import OpenAI
import requests
import time

client = OpenAI(
    api_key='YOUR_API_KEY',
    base_url='https://apihub.agnes-ai.com/v1'
)

# 家族肖像图(包含4个角色)
image_url = 'https://.../family_portrait.png'

# 测试4个角色分别说话
test_cases = [
    {
        'role': '青年男子',
        'prompt': (
            'The young man in the white T-shirt says: '
            '(用中文说)"你好!" '
            'He is speaking, his mouth is moving. '
            'Young male voice, clear tone. '
            'NO English speech.'
        )
    },
    {
        'role': '中年女子',
        'prompt': (
            'The middle-aged woman in the red dress says: '
            '(用中文说)"你好!" '
            'She is speaking, her mouth is moving. '
            'Middle-aged female voice, gentle tone. '
            'NO English speech.'
        )
    },
    {
        'role': '老年男子',
        'prompt': (
            'The elderly man with gray hair in the dark gray jacket says: '
            '(用中文说)"你好!" '
            'He is speaking, his mouth is moving. '
            'Old male voice, deep tone. '
            'NO English speech.'
        )
    },
    {
        'role': '小女孩',
        'prompt': (
            'The little girl in the pink dress says: '
            '(用中文说)"你好!" '
            'She is speaking, her mouth is moving. '
            'Little girl voice, sweet tone. '
            'NO English speech.'
        )
    }
]

for i, test in enumerate(test_cases, 1):
    print(f"=== 测试 {i}: {test['role']} ===")
    
    # 创建视频任务
    response = client.videos.generate(
        model='agnes-video-v2.0',
        prompt=test['prompt'],
        height=768,
        width=1152,
        num_frames=81,  # 约3.4秒
        frame_rate=24,
        extra_body={
            'image': image_url  # 单张参考图
        }
    )
    
    video_id = response.data[0].id
    print(f"任务ID: {video_id}")
    
    # 轮询状态
    while True:
        result = requests.get(
            f'https://apihub.agnes-ai.com/agnesapi?video_id={video_id}',
            headers={'Authorization': f'Bearer YOUR_API_KEY'}
        ).json()
        
        if result['status'] == 'completed':
            video_url = result['video_url']
            print(f"✅ 完成!视频: {video_url}")
            break
        elif result['status'] == 'failed':
            print(f"❌ 失败: {result.get('error')}")
            break
        
        time.sleep(10)
    
    print()

八、总结与最佳实践

8.1 关键要点

  1. 指定角色:用服装/外貌特征,不要用"左边"、"右边"
  2. 嘴部动作:必须明确描述"正在说话,嘴在动"
  3. 语言控制 :用(用中文说)括号法,加"NO 语言 speech"
  4. 音色选择:在提示词中描述年龄、性别、音色特点
  5. 对话长度:单次对话不超过10个字,避免口型不同步

8.2 推荐工作流

复制代码
准备参考图(包含多个角色)
  → 分析每个角色的服装/外貌特征
  → 编写优化的提示词(用特征描述+嘴部动作+语言指定)
  → 逐个测试每个角色
  → 对失败的角色,补充更多特征描述
  → 完成多角色对话视频

8.3 常见问题排查

问题 可能原因 解决方案
只有部分角色说话 位置描述不准确 改用服装/外貌特征描述
嘴部不动 缺少嘴部动作描述 加入"嘴在动"、"mouth is moving"
说了错误的语言 模型随机选择了语言 用括号法+NO 语言约束
口型不同步 对话过长 缩短对话,加入"speaking slowly"
音色不对 缺少音色描述 在提示词中明确描述年龄、性别、音色

九、下一步探索

  • 真正的轮播对话:目前需要多次生成再剪辑,未来可能支持单次生成多轮对话
  • 唇形同步精度:测试不同模型版本的口型准确度
  • 情感表达:让角色在说话时加入情感(微笑、皱眉等)
  • 背景音配配:为对话场景添加合适的背景音乐和音效

附录:提示词模板库

模板1:单角色说话

复制代码
让[服装/外貌特征]的[角色]说:
(用[语言]说)"[对话内容]"
他/她正在说话,嘴在动。
[年龄]+[性别]+[音色特点]的声音。
NO [不需要的语言] speech.

模板2:多角色对话(需多次生成)

复制代码
# 第1次生成:角色A说话
让[角色A特征]说:(用中文说)"[对话A]"
他/她正在说话,嘴在动。
NO [不需要的语言] speech.

# 第2次生成:角色B说话
让[角色B特征]说:(用中文说)"[对话B]"
他/她正在说话,嘴在动。
NO [不需要的语言] speech.

模板3:指定音色

复制代码
声音描述关键词:
- 年轻男性:young male voice, clear tone, energetic
- 中年男性:middle-aged male voice, steady tone, mature
- 老年男性:old male voice, deep tone, raspy
- 年轻女性:young female voice, bright tone, soft
- 小女孩:little girl voice, sweet tone, high-pitched

系列文章回顾

相关资源


如果本文对您有帮助,欢迎点赞、收藏、关注!下一篇我们将探讨如何使用Agnes API生成更长、更复杂的对话场景。