跳到主要内容
AI教程

用 ElevenLabs、Whisper 与 ffmpeg 制作自然的双语亲密语音

本教程基于真实测试,讲解如何设计自然的中英双语音色,控制呼吸与语气,并使用独立素材和 ffmpeg 完成亲吻声、环境声、语音条及实时通话音频。

用 ElevenLabs、Whisper 与 ffmpeg 制作自然的双语亲密语音

项目概览

这套工作流用于制作自然、连贯的中英双语亲密语音。核心原则不是让文本转语音模型模仿所有声音,而是把成品拆成不同职责的音轨:ElevenLabs 负责台词和呼吸表现,真实素材负责亲吻声与环境声,ffmpeg 负责裁切、变速、混音和拼接,Whisper 则充当质量检测工具。

最重要的结论:语音模型只负责“话”和融入说话节奏的呼吸。亲吻声、湿声等非语言音效应当独立制作,再与人声混合。

README 中的流程在 Mac mini 上完成,但所用方法并不依赖特定 Mac 型号。只要系统能够调用 ElevenLabs API、运行 ffmpeg 和使用 Whisper 转录,就可以复现主要步骤。

核心工具与职责

  • ElevenLabs:通过 Voice Design 创建音色,并使用文本转语音模型生成台词。
  • ffmpeg:统一采样率、放慢语速、裁切素材、淡入淡出、混音和拼接。
  • Whisper:检测非语言素材是否被模型念成了可识别的字词。
  • 合法授权的真实录音:提供独立环境声。原流程只使用公有领域的 CC0 素材,并记录来源。

开始前的安装与准备

1. 准备 ElevenLabs

注册 ElevenLabs 并取得可调用 Voice Design 和文本转语音接口的凭据。实际需要使用的接口包括 POST /v1/text-to-voice/design 和 POST /v1/text-to-voice。

第一步提交 voice_description 和试听文本,获得多份候选预览;选定候选后,再用它的 generated_voice_id 保存正式音色。保存成功后记录 voice_id,后续合成都使用这个 ID。

2. 安装 ffmpeg

确认终端可以直接执行 ffmpeg。在 macOS 上可通过常用的软件包管理器安装。安装后运行以下命令检查:

ffmpeg -version

3. 准备 Whisper

Whisper 在本流程中不是用来生成音频,而是作为“验声探针”。它会检查候选的亲吻或非语言片段:如果能够稳定转录出字词,通常说明模型其实在念拟声字,而不是真正产生非语言声音。

4. 建立素材目录

建议提前将文件按职责分开,至少包含人声输出、亲吻候选、通过筛选的亲吻素材、原始环境声、裁切后的环境声窗口以及最终混音文件。这样可以避免把未经审核的候选素材直接用于成品。

第一步:设计中英双语音色

使用文字描述,而不是只在音色库中挑选

根据 README 的测试,现成中文音色可能在英文中带口音,而通过 Voice Design 明确描述双语背景,更容易获得中文和英文都自然的结果。描述中应明确四类信息:母语能力、年龄范围、人物关系或角色气质,以及目标情绪。

下面是原流程使用的描述,可根据角色需求调整:

Native bilingual speaker of Mandarin Chinese (standard putonghua) and American English,
both at native level, with no cross-language accent in either. Male, 35–40. Studio quality.
Persona: mature, dominant, doting. Emotion: composed, doting, low-burning.
Rich, chesty, slightly gravelly low voice; unhurried, even pacing with weight on key words
and a breathy softness at the ends of sentences.

试听文本不要使用广告文案。应选择角色平时真正会说的话,并为同一描述生成多个候选。试听时优先判断它是否像目标人物自然说话,而不是只比较声音是否低沉或悦耳。

选择合适的模型

  • 普通对话:README 推荐 v3,适合从文本内容中表现日常情绪。
  • 实时通话或亲密场景:推荐 v4。它更适合在同一音色中处理中文、英文和中英混写,也更容易识别轻量的声音指导标签。
  • 纯英文长段:如果不使用 v4,可选择 eleven_turbo_v2_5,并明确设置 language_code=en,以减少英文中的中文口音。

调整音色参数

README 中的实测起点如下:

  • stability=0.35:变化和戏剧性较明显。
  • stability=0.5:更接近日常说话,可降低“刻意表演”的感觉。
  • similarity_boost=0.8:用于保持目标音色的一致性。
  • style=0.3:原记录指出 v3 不识别该参数,因此不要依赖它控制 v3。

调试时一次只改变一个变量。保留一份已经获得好评的基准音频,然后只调整稳定度或标签中的一个,才能准确判断变化来源。

第二步:让呼吸融入说话节奏

只在声口改变时加入标签

不要每句都添加标签。每组六到十句使用两三个轻量标签通常已经足够,后面的句子可以延续前一个声口。原流程常用的词包括 low、close、quiet、soft 和 unhurried。

[low and close to her ear, unhurried]
……过来。别躲。

……靠近一点。对。

[quiet laugh under the breath]
……急什么。

像 intense、heavy、growl、strained 和 rough 这类强烈词语并非完全不可用,但在原测试中很容易令声音变得夸张。更可靠的策略是压低、靠近、放慢,而不是要求模型用力表演。

使用标点塑造呼吸

比起反复写 heavy breathing,在句首、句尾或句中加入适量的“……”更容易得到自然停顿。每组只安排两三处明显呼吸,并改变表现方式,例如轻轻呼气、说到一半停顿、短暂屏息、带笑呼气或收住半声。

同一种喘息连续出现会暴露重复感。生成后应完整试听,不要只检查单句。

尽量整段生成

完整段落一次生成时,呼吸、情绪和音高更容易连续。把八句话分别合成再拼接,会让每一块都像重新开始。如果实时通话无法整段生成,可按两句话或约四十个汉字组成一个块,避免一句一块。

传递上下文

v4 支持 previous_text 和 next_text。逐块生成时,将前后文本传给模型,可以减轻机械朗读感。README 特别指出 v3 不支持这两个字段,向 v3 传递可能报错,因此需要按模型分别构造请求。

避免错误的语言路由

如果程序通过汉字比例决定模型或语言,必须先剥离方括号中的英文标签。否则,一句很短的中文可能因为包含大量英文标签而被误判为英文。使用 v4 时,可以直接保持同一模型,减少中英切换。

第三步:控制语速

原测试中,v4 的 speed 参数未产生预期效果。要让 v4 更慢,可先在文本中增加自然停顿,再用 ffmpeg 保持音调地放慢:

ffmpeg -i input.mp3 -filter:a "atempo=0.9" output.mp3

纯英文使用 turbo 模型时,README 记录的可用起点是 speed=0.84,并可在句间加入停顿:

<break time="0.4s"/>

单段不要堆叠过多停顿标签。原测试建议最多约六个,过多可能让输出不稳定。

第四步:建立可复用的亲吻素材盒

为什么不直接写拟声字

让文本转语音模型朗读亲吻拟声字,常见结果是可识别的音节或字母感,而不是自然的非语言声音。只写动作标签也可能退化为普通哼声。因此,原项目采用“先批量生成,再裁切和筛选”的素材盒方案。

制作步骤

  1. 使用同一音色和同一段包含亲吻动作的文本,完整生成五到六遍。原流程使用 v4 和 stability=0.35。
  2. 用静音检测或音频编辑工具,将每次输出中的候选非语言片段裁切出来。
  3. 用 Whisper 转录每个片段。能够转录出明确字符或词语的片段直接淘汰。
  4. 检查差分能量与原始能量的比例。原测试中,较可信片段通常高于 0.2;被念成字的片段约为 0.12 至 0.16;普通哼声通常低于 0.1。这些数字来自特定素材,只适合作为初始参考。
  5. 人工试听通过的素材,并按轻亲、较深的亲吻和位置变化等类别整理。
  6. 调用时随机选择近期未使用的片段,并对音高和速度做不超过约 3% 的轻微变化。原流程只允许放慢,不加快。

自动筛选不能代替人工试听。README 中曾出现带有持续嘶声的片段,Whisper 已转录出类似 Sssss 的结果,但因检查疏忽进入了成品。正确流程应同时检查转录文本、波形指标和实际听感。

第五步:用真实环境声完成双轨混音

选择素材

原流程比较了三种方案:让语音模型模拟、使用 AI 音效生成,以及采用真实录音。最终选择的是没有人声、授权明确的 CC0 真实素材。使用任何外部录音前,都应核对许可证并保存来源记录。

不要直接乘固定音量

环境录音的平均响度和峰值可能相差很大,也可能包含长时间安静区。直接套用固定音量系数,容易出现完全听不见或盖住人声的问题。更稳定的做法是:

  1. 从原始素材中随机截取两个与人声长度相近的窗口。
  2. 测量两个窗口的峰值,选择有效声音较多的一个。
  3. 计算增益,使环境声峰值约等于当前人声峰值减 12 dB。
  4. 给环境声添加 0.5 秒淡入。
  5. 人声结束后保留约 1 秒尾音,并使用约 1.4 秒淡出。
  6. 亲吻素材本身已有相应质感时,不再额外叠加环境声。

ffmpeg 混音示例

假设人声是 v.mp3,已经裁好的环境声窗口是 w.wav,GAIN 为峰值对齐后算出的增益,END 为淡出开始位置:

ffmpeg -i v.mp3 -i w.wav -filter_complex \
 "[1:a]volume=GAIN,afade=t=in:st=0:d=0.5,afade=t=out:st=END-1.4:d=1.4[w];\
  [0:a]apad=pad_dur=1.0[v];[v][w]amix=inputs=2:duration=first:normalize=0[a]" \
 -map "[a]" -c:a libmp3lame -q:a 2 out.mp3

normalize=0 很重要。按 README 的测试,如果省略它,amix 可能明显压低人声。

把混音标记与朗读标签分开

可以在写作阶段使用类似 [low, close, wet] 的标签,将 wet 作为后期混音标记。程序在请求语音模型前必须删除这个词,避免模型尝试表演音效;人声返回后,再按标记叠加对应的真实素材。下一个标签不再包含该标记时,环境声就应淡出。

第六步:制作完整语音条

将脚本拆成三类块:普通台词块送入文本转语音;纯非语言块从素材盒中选择;带环境声标记的块先生成人声,再执行双轨混音。

不同来源的音频可能具有不同采样率,拼接前应统一,例如先转换为 44100 Hz:

ffmpeg -i input.wav -ar 44100 output.wav

统一采样率后,再使用 ffmpeg 的 concat 滤镜按脚本顺序拼成一条。拼接完成后应从头到尾试听,重点检查块与块之间的音色、底噪、响度和呼吸是否突然变化。

第七步:用于实时通话

实时模式的关键是降低等待时间,同时保留上下文。可以按独立成行的标签切块,让没有新标签的后续句子继承当前声口。积累到两句或约四十个汉字后提交生成。

  1. 播放当前块时,后台预先生成下一块。
  2. 向 v4 传递当前块的上一句和下一句。
  3. 纯非语言块直接从素材盒取用,不再请求文本转语音。
  4. 最后一句播放完成后再打开麦克风,避免声音互相覆盖。
  5. 如果合成失败,只显示文字或短暂保持安静,不要临时切换另一副音色。

中途换音色造成的角色断裂,通常比一秒左右的停顿更明显。因此,应优先保持角色声音一致。

高级调试技巧

建立固定对照样本

保存一条已经确认自然的基准音频。每次只更改稳定度、标签、标点、模型或后期速度中的一项,并与基准版本盲听比较。

将生成标签和后期标签分层

语音模型只接收它应该表演的声口标签;环境声、素材类别和混音强度属于后期元数据,必须在请求前移除。这样可以避免模型把制作指令读出来或试图模仿音效。

保存最近使用记录

为素材盒维护一个近期使用队列,例如避开最近使用过的十个片段。它能降低重复感,比每次完全随机抽取更稳定。

自动化质量门槛

可将以下检查加入输出流水线:

  • Whisper 是否转录出不应存在的字词。
  • 人声与环境声的峰值差是否接近目标值。
  • 采样率是否统一。
  • 输出结尾是否保留自然尾音。
  • 请求所用模型是否支持传入的参数。
  • 语言检测前是否已经删除英文标签。

成本、授权与内容边界

README 记录使用 Creator 方案,价格为每月 22 美元、约 12 万字额度;首次设计音色消耗约三千字,日常使用从数百到两千字不等。README 还提到 v4 当时存在限时优惠,因此实际价格、额度和计费方式应以使用时的官方页面为准。

所有内容必须只涉及明确的成年人。不要使用可能被理解为未成年人的角色设定或模糊年龄表达。平台会依据文本进行审核,违规内容可能导致账号停用。

使用他人录音时必须确认授权。即使素材可以免费下载,也不代表允许重新分发或商用。原流程只采用 CC0 素材,并记录每个文件的来源。

结论

自然的亲密语音并不是靠堆叠强烈标签得到的。更可靠的方法是让语音模型专注于台词、轻量情绪和呼吸节奏,把非语言声音拆成经过转录与人工试听筛选的素材,再由 ffmpeg 完成峰值匹配、淡入淡出和拼接。

从最小版本开始:先做稳定的双语音色,再验证整段生成和上下文传递,之后加入素材盒与环境声。每一步保留基准样本并只调整一个变量,通常比不断增加标签更容易获得自然、一致且可复用的结果。