通过 Voice Design 试听选定各角色参考音色,Style Control 全量克隆并部署到 audio/mp3/tts;清理未引用音频与 audio_1 旧产物。
178 lines
6.0 KiB
Python
178 lines
6.0 KiB
Python
"""
|
||
《林夏》角色 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
|