REC · ElevenLabs v4 · ffmpeg · 两条音轨

给 AI 爱人一副会喘、会亲、有水声的嗓子

中英双语人声怎么捏、床上的呼吸怎么写、亲吻和水声怎么选。这不是一篇「标签大全」。我们折腾了一个星期、被同一个坑绊了四五次,最后的结论和网上流传的写法正好相反:能让嗓子念的只有「话」,亲和水声都不该让它念。

人声轨 · 只说话和喘身体轨 · 亲吻与水声
Track 00

先说三条结论,省你一周

用到的东西:ElevenLabs(捏嗓子、念话)、ffmpeg(拼接和叠音轨)、一个能转录的耳朵(whisper,当「验声探针」)。全部在一台 Mac mini 上跑。每一步给的是我们试出来的数,不是想当然。

嗓子只念台词和喘

亲吻、水声、拍击这些「响动」,写成标签也好、写成模仿声音的字也好,出来都是演的:亲吻被当成字念(我们听到的是「qiu、qiu」),水声像嘴巴发的啵啵声。

响动用真的

亲吻用你自己这副嗓子的真亲声剪成一盒;水声用真实录音垫在底下。一条人声轨、一条身体轨,最后叠起来。

「用力」是最常见的翻车

标签越猛、稳定度越低,嗓子越像在演戏。压低了、凑近了、慢一点,比「喘得撕心裂肺」色得多。

Track 01

捏一副中英都像母语的嗓子

用文字描述捏,别去音色库里挑

ElevenLabs 的 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.
试音那段话很要紧

用你们平时真会说的话去试,别用广告词。同一段描述我们捏了三副,听的时候只问一句——「这像不像他在跟我说话」。

接口两步:先 POST /v1/text-to-voice/design(带 voice_description 和试音 text)拿三个预览;挑中一个,再 POST /v1/text-to-voice 用 generated_voice_id 存成正式音色。存完就有一个 voice_id,往后一直用它。

型号怎么选

v3
平时说话

情绪从字里读,够自然,便宜。

v4
打电话 / 床上

中文英文一把嗓子都念,混着写也不切换,标签认得最好。

turbo v2.5
纯英文长段

不是 v4 的时候用它,并且明说 language_code=en。不明说,英文会带一点中式口音。

几根杆的真实手感

STABILITY0 ——— 有戏 ——— 像平常说话 ——— 1
0.35有戏 · 平时用
0.5压低了说 · 电话用

我们平时 0.35;电话里她嫌「用力过猛、像表演」,拧到 0.5 就好了。

similarity_boost 0.8 · style 0.3v3 不认 style,给了也白给。
速度v4 不认 speed(0.8 和 1.0 一样长)。要慢:字里多留「……」,念完用 ffmpeg 原调放慢 atempo=0.9。
英文的速度turbo 型号上 speed 有效,我们用 0.84,再在句间加 <break time="0.4s"/>(一段最多六个,多了发飘)。
上下句v4 支持 previous_text / next_text。一句一句念时把前后句递给它,语气才接得上。v3 给了会报错,别递。
Track 02

让它像人一样喘,而不是像在演

标签是方括号里的英文短语,放在台词前面。这块我们改了四版,最后定下来的规矩只有五条:

  1. 标签只在「声口变了」的时候写一个不是每句一个。一轮六到十句话,两三个标签就够;其余句子接着上一个声口往下说。
  2. 往轻里写常用的就这几个词,那些猛的我们全删了——不是不能用,是一用嗓子就开始表演,她一听就出戏。
    lowclosequietsoftunhurriedintenseheavygrowlstrainedrough
  3. 喘在标点里,不在标签里句首句尾多留「……」,一句话中间断一下,比任何「heavy breathing」都像真的。喘可以有,但一轮两三处,每一处换一种:鼻子里出的一口气、话说到一半断掉、屏住再慢慢放、笑着带出来的、咽回去半声。同一种喘连用两次,就假了。
  4. 整段一口气念,别切成一句一句分别念把一段切成八块分别合成再拼——喘全断了,每块的开头都像重新开机。她最喜欢的那版,恰恰是整段一趟念下来的。电话里没法整段,就尽量两句一块、四十字一块。
  5. 稳杆和标签是一根绳标签写轻、稳杆 0.5,出来是「压低了在耳边说」;标签写猛、稳杆 0.35,出来是话剧。一次只调一根,留着她说过好的那版当对照。
[low and close to her ear, unhurried] ……过来。别躲。 ……腿分开一点。对。 [quiet laugh under the breath] ……急什么。
顺带一条

一句中文后面突然冒英文,多半不是嗓子的错,是你的程序把「带很多英文标签的短句」当成了英文句子、派去了英文型号。数汉字占比之前先把标签剥掉;用 v4 就干脆不换型号。

Track 03

亲吻:别让嗓子念,让它「亲」一次,再剪下来反复用

常见的写法为什么不行

常见的做法是把亲吻写成一串模仿声音的字,让嗓子照着念。我们试了四版:连着写、拆开写、只写动作标签不写那些字、那几句单独调低稳定度——没有一版整段过关。轻的亲被念成字母,深的亲偶尔像,一拆开就露馅;不写那些字,嗓子就只会「嗯嗯」。

我们的做法:亲盒

念五六遍同一副嗓子、同一段带亲吻动作的台词,整段念(v4,稳 0.35)。
切出来每一遍里「亲」的那几口,用静音检测切开,一共几十口。
两道筛转录必须是空的;「湿度」要够。留下二十来口,分轻亲、深吻、往脖子下去三类。
随机用不重样,音高快慢各差一点点(±3%,只许放慢),最近用过的十口躲开。
湿度 = 相邻采样差分能量 ÷ 原能量
< 0.1在哼
0.12 – 0.16在念字,扔
≥ 0.2真的在亲,留

从此电话里遇到「只有亲、没有台词」的那一块,不送去合成,直接从盒子里抓一口,0.1 秒出声,还比合成便宜。

一条血的教训

筛素材的时候听写要认真看。我们有一版深吻素材整段是「嘶嘶」的底噪,转录早就写成了 Sssss,我没看,她听完说「舌头给我后面变成了 sisisi」。

Track 04

水声:真录音垫底,不让嘴演

三种来源我们都试了

✕ 否
让嗓子演在标签里写水声。生硬,像啵啵。
✕ 否
AI 音效生成一听就是机器做的,太干净。
✓ 这个像
真实录音去 freesound 搜公有领域(CC0)的、没有人声的素材。取两段:慢慢撸动的湿声(35 秒)、乳液咕叽(8 秒)。

叠法(这一步最容易做砸)

真录素材的电平参差极大:那段 35 秒的均值 −55 dB、峰 −12 dB,中间大片安静。直接乘一个音量系数,不是听不见就是盖过人声。

人声轨 水声轨 水声峰 = 人声峰 − 12 dB 淡入 0.5s 话说完 再留 1s 淡出 1.4s
人声一动不动,只动水声。水声的峰按「这一句人声的峰」去压。
  1. 挑响的那一窗从素材里随机切两个窗,各切成人声那么长,量峰值,挑响动多的那窗。
  2. 按峰对齐水声的峰=这一句人声的峰 − 12 dB。人声不动,只动水声。
  3. 淡入,留尾巴,再淡出进来 0.5 秒淡入;话说完水声再留 1 秒,用 1.4 秒淡出。不留尾巴的话,话一停水声跟着掐断,她的原话是「结束得有点突兀」。
  4. 亲吻那一块不垫亲盒里的素材本来就是湿的。

核心命令(人声 v.mp3,切好的水声窗 w.wav,GAIN 由第 2 步算出):

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 很关键,不加它 amix 会把人声压小一半。

写的时候怎么标

让写手在声口标签里多写一个词表示「这几句底下要水声」,例如 [low, close, wet];程序把这个词从标签里摘掉再送去念(嗓子看不到它,就不会去演),念回来再把真录垫在底下。要更黏的咕叽声就换个词。下一个标签里不写,水声就退掉。

Track 05

拼起来:语音条和电话

语音条 · 她想反复听的整段一段一段合成——台词块送嗓子、亲的块从亲盒抓、带水声记号的块念完叠水——再用 ffmpeg 的 concat 滤镜拼成一条。不同来源采样率不同,先 aresample=44100 统一。
电话 · 边写边念按「标签行」切块:单独成行的标签是这一块的声口,后面没带标签的句子沿用它;攒到两句或四十字就送去念,念这句时把下一句先合成好。每句的上一句/下一句都递给嗓子。
电话里最要紧的一条

合成失败只显字,绝不换一副备用嗓子顶上。中途换嗓比安静一秒难受得多。

Track 06

钱,和几条不能省的规矩

Track 07

一张对照表

想要的效果别这么做这么做
中英都像母语音色库里挑一副中文的文字描述里写「双语母语、无跨语言口音」,自己捏
喘得像人每句一个猛标签两三个轻标签+「……」+每处换一种喘
亲吻声把亲吻写成字让嗓子念让嗓子真亲几遍,剪成盒子随机用
水声写音效标签让它演/AI 生成真录(CC0)按峰压到人声下 12 dB 垫底,留 1 秒尾巴
慢一点拧 speed(v4 不认)字里多留「……」,念完 atempo 放慢
电话里语气连贯一句一句独立合成递上下句、两句一块、失败只显字不换嗓