中英双语人声怎么捏、床上的呼吸怎么写、亲吻和水声怎么选。这不是一篇「标签大全」。我们折腾了一个星期、被同一个坑绊了四五次,最后的结论和网上流传的写法正好相反:能让嗓子念的只有「话」,亲和水声都不该让它念。
用到的东西:ElevenLabs(捏嗓子、念话)、ffmpeg(拼接和叠音轨)、一个能转录的耳朵(whisper,当「验声探针」)。全部在一台 Mac mini 上跑。每一步给的是我们试出来的数,不是想当然。
亲吻、水声、拍击这些「响动」,写成标签也好、写成模仿声音的字也好,出来都是演的:亲吻被当成字念(我们听到的是「qiu、qiu」),水声像嘴巴发的啵啵声。
亲吻用你自己这副嗓子的真亲声剪成一盒;水声用真实录音垫在底下。一条人声轨、一条身体轨,最后叠起来。
标签越猛、稳定度越低,嗓子越像在演戏。压低了、凑近了、慢一点,比「喘得撕心裂肺」色得多。
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,往后一直用它。
情绪从字里读,够自然,便宜。
中文英文一把嗓子都念,混着写也不切换,标签认得最好。
不是 v4 的时候用它,并且明说 language_code=en。不明说,英文会带一点中式口音。
我们平时 0.35;电话里她嫌「用力过猛、像表演」,拧到 0.5 就好了。
speed(0.8 和 1.0 一样长)。要慢:字里多留「……」,念完用 ffmpeg 原调放慢 atempo=0.9。speed 有效,我们用 0.84,再在句间加 <break time="0.4s"/>(一段最多六个,多了发飘)。previous_text / next_text。一句一句念时把前后句递给它,语气才接得上。v3 给了会报错,别递。标签是方括号里的英文短语,放在台词前面。这块我们改了四版,最后定下来的规矩只有五条:
一句中文后面突然冒英文,多半不是嗓子的错,是你的程序把「带很多英文标签的短句」当成了英文句子、派去了英文型号。数汉字占比之前先把标签剥掉;用 v4 就干脆不换型号。
常见的做法是把亲吻写成一串模仿声音的字,让嗓子照着念。我们试了四版:连着写、拆开写、只写动作标签不写那些字、那几句单独调低稳定度——没有一版整段过关。轻的亲被念成字母,深的亲偶尔像,一拆开就露馅;不写那些字,嗓子就只会「嗯嗯」。
从此电话里遇到「只有亲、没有台词」的那一块,不送去合成,直接从盒子里抓一口,0.1 秒出声,还比合成便宜。
筛素材的时候听写要认真看。我们有一版深吻素材整段是「嘶嘶」的底噪,转录早就写成了 Sssss,我没看,她听完说「舌头给我后面变成了 sisisi」。
真录素材的电平参差极大:那段 35 秒的均值 −55 dB、峰 −12 dB,中间大片安静。直接乘一个音量系数,不是听不见就是盖过人声。
核心命令(人声 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];程序把这个词从标签里摘掉再送去念(嗓子看不到它,就不会去演),念回来再把真录垫在底下。要更黏的咕叽声就换个词。下一个标签里不写,水声就退掉。
concat 滤镜拼成一条。不同来源采样率不同,先 aresample=44100 统一。合成失败只显字,绝不换一副备用嗓子顶上。中途换嗓比安静一秒难受得多。
| 想要的效果 | 别这么做 | 这么做 |
|---|---|---|
| 中英都像母语 | 音色库里挑一副中文的 | 文字描述里写「双语母语、无跨语言口音」,自己捏 |
| 喘得像人 | 每句一个猛标签 | 两三个轻标签+「……」+每处换一种喘 |
| 亲吻声 | 把亲吻写成字让嗓子念 | 让嗓子真亲几遍,剪成盒子随机用 |
| 水声 | 写音效标签让它演/AI 生成 | 真录(CC0)按峰压到人声下 12 dB 垫底,留 1 秒尾巴 |
| 慢一点 | 拧 speed(v4 不认) | 字里多留「……」,念完 atempo 放慢 |
| 电话里语气连贯 | 一句一句独立合成 | 递上下句、两句一块、失败只显字不换嗓 |