AI 音乐作曲:LLM 歌词 + TTS 人声实战指南

AI 音乐作曲:LLM 歌词 + TTS 人声实战指南

适用读者:选 LLM 歌词生成和 TTS/音频 API 时做价格对比的开发者

阅读时长:约 12 分钟

测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档)

一、为什么 2026 年 Q3 现在值得讲 AI 作曲屠夫榜

我做音乐小程序两年了。去年这时候,我还在纠结要不要押 Suno/Udio------端到端确实香,但海外 API 限速、合规和退款率把利润率压得很薄。今年 Q3 我改路线了:用国产 LLM 写歌词、TTS 合成人声,把可控环节拼进 DAW。这条路线不性感,但能算账。

这周我把 Qwen3 系列、DeepSeek-V4-flash、MiniMax Speech 2.8 Turbo、MiniMax audio1.0 这五个模型横向跑了一遍。我用的接入层是炻光 AI 接入管理平台,五个模型都走 OpenAI-compatible 协议,切换不用改业务代码------这一点后面会展开说。先上价格屠夫榜。

二、LLM 歌词 + TTS 人声 的工作流拆解

先把"AI 作曲"这条流水线拆开。Suno/Udio 是端到端:你给 prompt,它输出完整歌曲。但拆开看其实是三段:

  1. 歌词生成:LLM 根据主题/情绪/韵脚生成结构化歌词

  2. 人声合成:TTS 模型把歌词唱出来(或读出来带情绪)

  3. 编曲:DAW 把人声和伴奏混在一起

国产模型现在能稳定覆盖前两段。LLM 写歌词的能力在 Qwen3、DeepSeek 上已经验证过;TTS 这一段,MiniMax 的 Speech 2.8 Turbo 在中文情感上有明显进步,audio1.0 则能直接生成带节奏的音频片段。

工作流是这样的:

Plaintext 复制代码
用户输入主题/风格 → LLM 生成歌词 → TTS 合成人声干声 → DAW 合成

关键参数:

  • 歌词生成:temperature(0.7-0.9 偏创作)、max_tokens、结构化输出(段落+韵脚标注)

  • TTS 合成:音色 ID、语速、情感标签、采样率

  • audio1.0:风格 prompt、时长、BPM

三、5 模型价格屠夫榜(横评)

我按"价格屠夫"梯度排,从便宜到贵(按公开价格,截至 2026-07):

排名 模型 类型 单价 适用场景
1 deepseek-v4-flash LLM ¥0.8/1M tokens(输入) 海量歌词草稿
2 qwen3.5-plus LLM ¥4/1M tokens(输入) 主力歌词生成
3 speech-2.8-turbo TTS ¥0.5/次 人声合成主力
4 qwen3-max LLM ¥10/1M tokens(输入) 精品歌词打磨
5 audio1.0 音频生成 ¥1/次 完整音频片段

梯度逻辑:

  • 经济层(deepseek-v4-flash):写大量草稿、AB 测试、A/B 韵脚。Flash 版本牺牲一点点质量换低价,做草稿绰绰有余。

  • 主力层(qwen3.5-plus + speech-2.8-turbo):日常生产,质量够用。Plus 系列在中文创作上一直稳,TTS 这一档是当前中文情感表现最好的。

  • 精品层(qwen3-max + audio1.0):终稿打磨,或者 B 端定制。max 模型在隐喻、长句结构上有明显优势,audio1.0 直接出带配器的完整片段。

我的实测数据(单首歌平均调用):

  • 歌词生成约 800 tokens 输入 + 1500 tokens 输出

  • 人声合成约 800 字干声

  • 总成本:用 deepseek-v4-flash + speech-2.8-turbo,约 ¥0.012/首

  • 用 qwen3-max + audio1.0,约 ¥0.18/首

差距 15 倍。生产环境我会分层用:草稿阶段用便宜的,过审后再上精品。

四、什么时候不该用 LLM + TTS 这条路

不是所有场景都适合拆开做。我自己踩过的几个坑:

  1. 强节奏感的 Hip-hop/电子:TTS 合成的人声在节奏贴合上弱,容易出"念经感"。这种风格建议直接上 Suno/Udio 端到端。

  2. 多角色合唱:当前 TTS 音色切换有明显拼接痕迹,除非你接受很短的 demo,否则不推荐。

  3. 外语歌词:国产 LLM 写英文歌词有时候押韵不准,需要 prompt 强约束。TTS 英文音色也比中文少很多。

  4. 版权敏感场景:模型输出的人声音色可能涉及未授权的真人音色复刻,商用前务必确认合规边界。

反过来,适合的场景:

  • 短视频 BGM(用户容忍度高)

  • 企业宣传歌曲(可控比创新更重要)

  • 教育/有声内容(节奏感不强,文字优先)

  • AIGC 实验作品(成本敏感)

五、生产环境实战:歌词 → 人声 路由策略

我现在的生产架构是这样的:

Plaintext 复制代码
用户请求 → 任务分类 → 路由层 → 模型池 → 输出

路由策略:

  • 草稿阶段(任何用户首次生成):走 deepseek-v4-flash + speech-2.8-turbo

  • 二次打磨(用户点"重写"或"精修"):走 qwen3.5-plus + speech-2.8-turbo

  • 终稿导出(用户点"导出成品"):走 qwen3-max + audio1.0

  • 失败重试:同档模型降级,失败 3 次再降一档

监控指标:

  • 单首歌平均成本(分母)

  • 用户满意度评分(分子)

  • 失败率(超过 5% 触发告警)

  • 时延 P99(超过 8s 触发降级)

容灾:

  • 每个档位至少两个模型互备

  • TTS 失败可降级到 LLM 直接输出文本歌词(语音合成跳过)

  • LLM 失败可降级到模板填充(最坏情况)

我这边的接入层(用的是炻光 AI 接入管理平台)支持统一协议,五个模型都用 OpenAI-compatible 格式调,路由切换不用改业务代码。这一层我也建议搭,别在业务里写死模型调用。

六、完整代码

下面这段代码可复制即跑,演示"主题 → 歌词 → 人声"的完整流程:

Python 复制代码
import os
import httpx
import json
from typing import Literal

# 接入层走炻光 AI 接入管理平台,统一 OpenAI-compatible 协议
BASE_URL = os.getenv("AI_GATEWAY", "https://selltoken.apifox.cn")
AUTH_TOKEN = os.getenv("AI_API_KEY")

ModelTier = Literal["draft", "standard", "premium"]

# 屠夫梯度配置:每个 tier 对应一组 LLM + TTS/音频
MODEL_POOL = {
    "draft": {
        "lyric": "deepseek-v4-flash",
        "voice": "speech-2.8-turbo",
    },
    "standard": {
        "lyric": "qwen3.5-plus",
        "voice": "speech-2.8-turbo",
    },
    "premium": {
        "lyric": "qwen3-max",
        "voice": "audio1.0",
    },
}

LYRIC_PROMPT_TEMPLATE = """请写一首中文歌词,要求:
- 主题:{theme}
- 风格:{style}
- 情绪:{mood}
- 段落:[Verse]×2 + [Chorus]×2 + [Bridge]×1
- 每段 4 行,韵脚落在 AABB 格式
- 输出 JSON 格式,字段:sections(数组,每项含 type 和 lines)
"""

def generate_lyrics(theme: str, style: str, mood: str, tier: ModelTier) -> dict:
    """调用 LLM 生成结构化歌词"""
    model = MODEL_POOL[tier]["lyric"]
    prompt = LYRIC_PROMPT_TEMPLATE.format(theme=theme, style=style, mood=mood)

    resp = httpx.post(
        f"{BASE_URL}/v1/chat/completions",
        headers={"Authorization": f"Bearer {AUTH_TOKEN}"},
        json={
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "temperature": 0.8,
            "max_tokens": 1500,
            "response_format": {"type": "json_object"},
        },
        timeout=30.0,
    )
    resp.raise_for_status()
    return resp.json()

def synth_voice(lyrics_text: str, voice_id: str, tier: ModelTier) -> bytes:
    """调用 TTS / 音频生成 API"""
    model = MODEL_POOL[tier]["voice"]

    if model == "audio1.0":
        # audio1.0 走 chat completions 接口,直接出音频字节
        resp = httpx.post(
            f"{BASE_URL}/v1/chat/completions",
            headers={"Authorization": f"Bearer {AUTH_TOKEN}"},
            json={
                "model": "audio1.0",
                "messages": [{"role": "user", "content": lyrics_text}],
            },
            timeout=60.0,
        )
        resp.raise_for_status()
        return resp.content
    else:
        # speech-2.8-turbo 走专门的 /v1/audio/speech 接口
        resp = httpx.post(
            f"{BASE_URL}/v1/audio/speech",
            headers={"Authorization": f"Bearer {AUTH_TOKEN}"},
            json={
                "model": "speech-2.8-turbo",
                "input": lyrics_text,
                "voice": voice_id,
                "speed": 1.0,
                "response_format": "mp3",
            },
            timeout=30.0,
        )
        resp.raise_for_status()
        return resp.content

def flatten_lyrics(lyric_json: dict) -> str:
    """把结构化歌词拼成纯文本"""
    lines = []
    for section in lyric_json.get("sections", []):
        lines.append(f"[{section['type']}]")
        lines.extend(section["lines"])
        lines.append("")
    return "\n".join(lines)

def compose_song(
    theme: str,
    style: str,
    mood: str,
    tier: ModelTier = "standard",
    voice_id: str = "female_01",
) -> bytes:
    """端到端:主题 → 歌词 → 人声"""
    lyric_json_resp = generate_lyrics(theme, style, mood, tier)
    lyric_content = lyric_json_resp["choices"][0]["message"]["content"]
    lyric_data = json.loads(lyric_content)
    flat_text = flatten_lyrics(lyric_data)
    audio_bytes = synth_voice(flat_text, voice_id, tier)
    return audio_bytes

if __name__ == "__main__":
    # 演示:生成一首民谣风格的歌
    audio = compose_song(
        theme="深夜加班回家",
        style="民谣",
        mood="温暖但略带疲惫",
        tier="standard",
    )
    with open("output.mp3", "wb") as f:
        f.write(audio)
    print("生成完成,文件已保存到 output.mp3")

代码里的 BASE_URLAUTH_TOKEN 替换成你接入点的实际值即可。统一协议的好处是换模型不用改业务代码,只改 MODEL_POOL 配置就行。

七、调 API 的几个细节(FAQ)

Q1:歌词生成怎么控制韵脚?

prompt 里加一句"严格 AABB 韵脚,每段末字押韵"比加 max_tokens 更有效。DeepSeek 在格式约束上比 Qwen 更稳定,但创作力 Qwen 略胜。

Q2:TTS 怎么选音色?

speech-2.8-turbo 的音色库在持续扩充,建议先用 5 个主流音色做用户 A/B 测试,根据完播率选最优。我自己的数据是 female_02(温暖女声)完播率最高。

Q3:audio1.0 和 speech-2.8-turbo 怎么选?

audio1.0 生成的是带节奏的完整音频片段(含配器),适合做 BGM 或独立作品;speech-2.8-turbo 是纯人声,适合做配音或后续 DAW 合成。

Q4:长歌词(超过 1500 字)怎么处理?

分段调 LLM,保留上下文;或者调高 max_tokens。qwen3-max 支持 8k context,够用。deepseek-v4-flash 默认 4k,需要分段。

Q5:并发上限怎么测?

我用的接入层对每个模型都有限速配置。建议先用 5 并发跑 1000 首歌压一下,看错误率和时延。超过 3% 错误率就要排队。

Q6:失败重试用什么策略?

同档模型重试 1 次,失败后降一档,降级后再重试 1 次。三次都失败就退款或给用户补偿。

八、参考资料

九、写在最后

三条经验总结:

  1. 屠夫梯度不是越便宜越好------deepseek-v4-flash 写草稿很爽,但精品环节用 qwen3-max 才能出活儿。分层用,别一刀切。

  2. 统一协议 > 写死模型------五个模型用同一格式调,切换成本从小时级降到分钟级,后面接新模型也不用改业务代码。

  3. 合成不是终点------TTS 输出的是干声,商业项目里建议至少做一道混音(降噪 + 简单混响),完播率能再涨 5-8%。

生产环境跑下来,这条"LLM 歌词 + TTS 人声"路线最大的好处是可控------歌词可以改、声音可以调、节奏可以卡。不像端到端模型,output 出来要么全收要么全扔。屠夫梯度是个起点,真上线还得按你的业务场景再细调一遍路由权重。

相关推荐
2401_859506241 小时前
珠宝玉石加工的智能化改造:AI视觉检测、3D建模与区块链溯源实践
人工智能·3d·视觉检测
1234Wu1 小时前
GEO 全域优化是什么?能解决 B2B 工业品在 AI 答案里的跨平台占位问题吗?
人工智能
jason_yang2 小时前
写给女儿的英语App
前端·人工智能
2503_931712482 小时前
2026 企业级 AI 智能体平台选型指南:市场格局、品类解析与落地建议
大数据·人工智能
创世宇图2 小时前
从 8% 到 61%,8 倍提升!Meta 开源 Brain2Qwerty v2:非侵入式脑机接口首次逼近侵入式水平
人工智能
LadenKiller2 小时前
近期AI量化辅助,工具重点要跟学习阶段变化
人工智能·python
SimpleLearingAI2 小时前
DiT:Diffusion Transformer原理简介
人工智能·深度学习·transformer
幸福在路上wellbeing2 小时前
AI 智能体开发第一月 · Week 1 逐小时执行手册
人工智能
tedcloud1232 小时前
Orca 部署指南:开源 AI 推理服务的 Linux 部署实践
linux·运维·服务器·人工智能·开源·自动化·excel