Files
blind/audio_2/voice_style_prompts.py
T
xsl 12eb1eab44 VoxCPM2 v5 音色克隆:脚本、参考音频、游戏对白与状态文档
通过 Voice Design 试听选定各角色参考音色,Style Control 全量克隆并部署到 audio/mp3/tts;清理未引用音频与 audio_1 旧产物。
2026-05-24 00:34:50 +08:00

178 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
《林夏》角色 Voice Design 提示词
纯提示词生成音色,不使用 reference_wav_path。
API: POST /v1/speech/styled { text, style } (不传 voice_id
每个角色有独立的「音色描述」;同角色不同台词仅叠加「表演修饰」。
"""
# ── 角色音色(Voice Design 核心:决定“谁在说”) ─────────────
# 男声角色:azhe / zhounan / delivery — 必须含「男声/男性」
ROLE_VOICE_DESIGN = {
"linxia": (
"24岁中国女性,中低音女声,声线偏薄但稳定,"
"疲惫但清醒,克制有温度,普通话,像深夜发微信语音"
),
"mom": (
"52岁中国女性,温厚的中老年女声,音色略哑,"
"轻微西部口音,说话慢而稳,像母亲打电话"
),
"azhe": (
"27岁中国男性,清朗偏低男声,城市口音,"
"理性偏冷,语速平稳,用词克制,略带距离感"
),
"xiaomei": (
"24岁中国女性,明亮偏高的女声,语速快,"
"活泼直接,像闺蜜连发语音,能量足"
),
"xiaomei_drunk": (
"24岁中国女性,同闺蜜音色但喝醉了,"
"口齿略含糊,情绪起伏大,时而哭时而笑"
),
"zhounan": (
"26岁中国男性,温和偏闷的男中音,略拘谨,"
"语速偏慢,像很久没联系的老同学,真诚不油"
),
"hr": (
"38岁中国女性,成熟职场女声,中音区,"
"知性干练,疲惫的善意,像HR发工作语音"
),
"anan": (
"23岁中国女性,甜亮高音女声,语速快,"
"比闺蜜更嗲,像在酒吧里喊,背景略吵"
),
"dorm_a": (
"22岁中国女性,兴奋尖亮女声,语速很快,"
"像群里报喜,充满喜悦"
),
"dorm_b": (
"23岁中国女性,普通随和女声,中音,"
"语速正常,像室友起哄"
),
"dorm_c": (
"23岁中国女性,温柔低声女声,"
"语速略慢,像注意到朋友沉默的室友"
),
"delivery": (
"30岁中国北方男性,男声,中低音,"
"语速适中偏慢,北方口音,礼貌直接,像外卖小哥打电话"
),
"self_3y": (
"21岁中国女性,比林夏更亮更高的女声,"
"刚来北京,兴奋带紧张,声音更年轻"
),
}
# ── 表演修饰(同角色内:决定“怎么说”) ─────────────────────
LINXIA_PERFORMANCE = {
"_warm": "语气温暖开放,柔软但有分寸",
"_cold": "语气冷淡疏离,短促",
"_curious": "语气好奇,略带追问",
"_tap": "极简回应,中性敷衍",
"_auto": "疲惫克制,轻声",
"_silent": "极度退缩,气声很重",
"ending_": "结局独白,轻声自语",
"sys_": "平静清晰,像对自己说话",
}
MOM_SEGMENT_PERFORMANCE = {
"seg1": "温柔试探,像怕打扰女儿",
"seg2": "平静追忆",
"seg3": "克制回忆痛苦",
"seg4": "释然",
"seg5": "深沉情感,声音更轻",
"seg6": "极简温柔",
"seg7": "不要求回应的 tender",
"seg8": "几乎微笑的晚安",
}
ZHOUNAN_SEGMENT_PERFORMANCE = {
"_seg1": "真诚回忆,略带感激",
"_seg2": "自嘲平淡",
"_seg3": "小心翼翼",
"_seg4": "生日夜的孤独",
}
XIAOMEI_DRUNK_PERFORMANCE = {
"seg1": "醉态开场,黏糊",
"seg2": "醉态爆料,情绪上来",
"seg3": "醉态解释,委屈",
"seg4": "醉态收尾,失落",
}
def _performance(filename: str, role: str) -> str | None:
name = filename.lower()
if role == "linxia":
for key, perf in LINXIA_PERFORMANCE.items():
if key in name:
return perf
if role == "mom" and "mom_voice_01" in name:
for seg, perf in MOM_SEGMENT_PERFORMANCE.items():
if seg in name:
return perf
if role == "zhounan" and "2345_zhounan" in name:
for seg, perf in ZHOUNAN_SEGMENT_PERFORMANCE.items():
if seg in name:
return perf
if role == "xiaomei_drunk":
for seg, perf in XIAOMEI_DRUNK_PERFORMANCE.items():
if seg in name:
return perf
if "_react_warm" in name or "_r3_react_warm" in name:
return "语气更温暖积极"
if "_react_cold" in name or "_r3_react_cold" in name:
return "语气更冷淡"
if "_react_curious" in name:
return "语气好奇,略追问"
if "_react_silent" in name:
return "语气犹豫,像等对方回应"
if role == "mom":
if "v2_msg10_call" in name or name.endswith("_call_mom"):
return "电话里听到女儿声音不对,担心但克制"
if "0015_mom_call" in name:
return "担心女儿,语气轻但着急"
if role == "azhe" and ("2315_azhe_call" in name or "v2_msg11" in name):
return "电话里略紧张,像鼓足勇气"
if "ending_e" in name and role == "zhounan":
return "轻快一点,像看到希望"
return None
def get_clone_style(filename: str, role: str, text: str) -> str:
"""Style Control 克隆模式:仅返回表演修饰,音色由参考音频提供。"""
perf = _performance(filename, role)
if perf:
return perf
if role == "self_3y":
if "voice_01" in filename:
return "兴奋带紧张,像刚来北京"
if "voice_02" in filename:
return "疲惫但假装坚强"
if "voice_03" in filename:
return "平静有力,像对未来的自己说话"
return ""
def get_style(filename: str, role: str, text: str) -> str:
"""返回 Voice Design 完整提示词(音色 + 可选表演)。"""
voice = ROLE_VOICE_DESIGN.get(role, ROLE_VOICE_DESIGN["linxia"])
perf = _performance(filename, role)
if perf:
return f"{voice}{perf}"
return voice
# 兼容旧名
get_voice_design = get_style