AI 辅助创作声明:本文使用 OpenAI Codex 辅助整理结构和撰写初稿,作者已核查产品事实并修改定稿;题图由 OpenAI ImageGen 生成。
假设你要制作一句公交到站提示:
前方到站,请带好随身物品。
普通话配音很好找。但如果这条提示要用四川话、粤语或者带有东北特点的声音说出来,事情就不只是换一个音色那么简单了。
声音选对了,文稿可能仍然不像当地人说的话;同一个方言分类下,不同声音适合的场景也不一样;一句简单的问候听起来没有问题,换成人名、地名和数字就可能暴露发音问题。
当我开始把不同地方音色整理成一个可以真正使用的产品时,才逐渐发现:方言文字转语音的难点,不只是“有没有这个声音”,而是怎样从一段文稿走到一段可以交付的语音。
这些问题最后变成了乡音阁,也形成了我现在使用方言 TTS 的一套基本方法。

方言不是一种可以套在普通话上的滤镜
很多人第一次接触方言语音合成,会自然地理解为:输入一段普通话,选择粤语或四川话,系统就会自动把它变成当地人的表达。
但文字转语音首先解决的是“怎样读”,不是“怎样改写”。
如果输入的是普通话书面语,系统通常仍会按照原文朗读。它可以使用带有地方特点的声音,却不会自动知道某个地方的人在同一场景下会换成什么词、怎样组织句子,或者在哪些位置加入语气词。
这两件事看起来接近,实际上属于不同的问题:
- 文本改写负责决定“说什么”;
- 语音合成负责决定“怎么读出来”。
如果把两者混在一起,试听不自然时就很难判断问题来自哪里:是音色不合适,还是文稿本身不符合当地表达?
因此,乡音阁目前选择了一个比较直接的边界:系统朗读用户提交的文本,不把普通话自动改写成方言。地方词、地域表达和说话方式,需要在生成前由使用者准备。
这并不意味着文稿必须写得很复杂。相反,短句通常更容易验证。
以门店宣传为例,与其先提交一整段促销文案,不如从一句真正会使用的话开始:
今天到店,有一份家乡味等你来尝。
如果希望它更接近某个地区的说法,可以先由熟悉当地表达的人调整文字,再交给语音工具朗读。这样既能保留创作者对内容的控制,也更容易判断声音本身是否合适。
“你好”可能是最差的测试文案
最初挑选音色时,人很容易输入“你好”“欢迎使用”这样的句子。它们足够短,几乎每一款声音都能顺利读完。
问题是,这类句子提供的信息太少了。
真正进入视频、讲解、播报或客服场景后,文稿里会出现更多困难内容:
- 人名和地名;
- 日期、价格与电话号码;
- 地方词和语气词;
- 中英文混合内容;
- 较长句子里的停顿;
- 同一个词在多个片段中的一致性。
一款音色能自然地说出“你好”,并不能说明它能正确处理真实文稿。
现在测试音色时,我更倾向于先准备一个很小但足够困难的测试集。比如:
王师傅,请到中山路十二号取货。
这句话同时包含称呼、地名、数字和一个完整的行动指令。它比普通问候更容易暴露发音、节奏和停顿上的问题。
如果内容包含特定地域表达,还可以再增加一句真正会出现在作品里的话。测试时使用同一段文字连续比较两三款声音,一次只改变音色,不同时修改文稿和参数。
这样做看起来比随手输入“你好”多了一步,实际上更节省时间。因为越早发现问题,越不容易在生成完整文稿后返工。

选择方言,只是选择声音的第一层
“粤语”“吴语”或者“四川话”是方便用户查找的分类,却不能代表分类中的每一款声音都完全相同。
同一种地方语言可能存在明显的地域差异。即使地区相近,说话人的年龄感、语速、声音高低和表达风格也会影响最终效果。
使用场景同样重要:
- 景区讲解更看重清楚、耐听;
- 门店宣传通常需要利落、有精神;
- 短视频开场希望尽快抓住注意力;
- 人物对白可能更在意年龄感和亲近感;
- 公共播报则更强调稳定与辨识度。
因此,乡音阁没有把“选择方言”作为流程的终点,而是在方言分类下面继续提供具体音色。目前线上有 18 个方言分类和 63 个启用音色,实际可用内容会以后端返回的实时目录为准。
部分音色还支持语速、音调和音量调节,但我不建议一开始就同时修改三个参数。
更稳妥的方式是:
- 先使用默认参数生成一句代表性文案;
- 判断问题主要来自节奏、声音高低还是响度;
- 每次只调整一项;
- 使用同一句话重新比较;
- 确认短句效果后,再处理完整文稿。
调节参数可以改变听感,却不能修正不合适的地方用词,也不能消除音色自身的能力边界。
面对姓名、地名、地方文化内容和公开广告,我仍然建议找熟悉目标地区表达的人复听。方言分类解决的是选择范围问题,母语者复核解决的才是内容是否真正适合当地受众的问题。

短句不应该继续为旧计费方式买单
除了声音选择,做乡音阁时还有一个看起来与语音无关、实际上直接影响使用方式的问题:短句该怎样计费。
乡音阁早期以人民币余额记录账户价值,每次生成完成后,需要把字符数换算成金额,再以“分”为单位扣款。
当时标准价格与最小货币单位之间存在一个换算关系:50 个字符刚好对应 1 分钱。为了让账单和余额始终使用整数分,系统把每次生成的字符数按照 50 个字符向上计算。
对于批量生成长文的 API 场景,这个差异不算明显。但用在短句上,问题就出现了。
一条只有 8 个字符的提示语,也会按照 50 个字符扣除。用户为了“用满”一次生成,甚至可能把几个不相关的句子拼在一起。
后来,乡音阁从人民币余额改成了字符资源包。支付发生在购买资源包时,真正进入生成流程的已经是整数个字符,账户可以准确记录 8 个、17 个或者 123 个字符,不再需要用 50 字符对应 1 分钱。
底层计费方式改变以后,旧规则也失去了存在的理由。
现在使用内置音色时,系统按照实际输入字符计算。输入 8 个字符,就扣除 8 个字符。自定义音色仍然按照实际字符的两倍计算,但同样取消了 50 字符起扣。
这个变化看起来只是修改了一个计算方式,却改变了用户制作内容的节奏。
门店播报、导航提示、视频转场、片头片尾和客服提示音通常只有十几个字。按实际字符计算后,使用者可以按照真实的编辑单位逐句生成,不必为了计费规则人为拼接内容。

“试听”也不是一个没有成本的按钮
语音产品很容易在每张音色卡片旁边放一个“试听”按钮。用户点击一下,就能听到这款声音。
从界面上看,这很自然。但如果所谓试听是在点击后临时请求一次语音合成,它就不再只是一个播放按钮,而是一次真实的服务调用。
它会消耗上游资源,也可能产生费用。如果用户在音色列表中连续点击,系统就会在用户尚未输入正式文稿时发起多次合成。页面看起来更方便,背后的成本和滥用空间却同时增加了。
最后,我把动态语音合成收束到了一个明确动作:只有用户输入文本、选择音色并点击“生成语音”后,系统才发起 TTS 请求。
生成完成后,用户可以播放和下载结果。这样,“我正在选择音色”和“我决定生成这段内容”之间就有了清楚的边界。
这也是为什么我更建议准备一句短而困难的测试文案。用户仍然可以比较音色,但每次生成都有明确目的,不会因为浏览音色列表而产生一串自己并不需要的请求。
有些产品设计并不是功能越多越好。一个看似方便的按钮,如果让行为、成本和用户预期变得模糊,就需要重新考虑它是否真的应该存在。
我现在怎样生成一段方言语音
经过这些取舍,目前我更推荐下面这套流程。
先确定受众,而不是先选声音
先明确内容面向哪个地区、什么年龄和怎样的使用场景。“需要方言”不是一个足够具体的要求。
准备希望被直接读出的文本
系统不会自动完成地域表达改写。地方词和语气需要在生成前确定。
用困难短句测试
优先测试人名、地名、数字和地方词,不要先提交完整文稿。
使用同一句话比较声音
每次只改变一个变量。先换音色,再根据需要调整语速、音调或音量。
让熟悉当地表达的人复听
重要的公开内容不能只依赖工具名称或方言标签判断。
按句子或段落生成
每个片段只保留一个说话人和一个目的,方便发现问题和重新编辑。
最后再处理后期制作
时间轴、背景音乐、字幕、响度统一和最终拼接属于音视频编辑工具的工作,不应该被描述为文字转语音本身的能力。
如果这些步骤已经稳定,而且需要批量处理,才适合进一步通过 API 接入。API 解决的是重复执行问题,不会自动解决文稿、音色选择和质量复核问题。
乡音阁现在是什么
这些问题最后形成了乡音阁:一个专注中文地方音色的文字转语音工具。
目前线上提供粤语、四川话、东北话、闽南语、吴语、北京话等 18 个方言分类,共有 63 个当前启用音色。用户输入文稿并选择声音后,可以在线生成、试听和下载结果。无需注册可以体验 100 个字符,稳定的程序化需求也可以通过 REST API 接入。
它不会自动把普通话改写成方言,也不能代替当地使用者完成内容审核。它现在做的事情很直接:让用户更容易找到中文地方音色,用真实文稿完成一轮低成本测试,再决定是否继续制作。
项目地址:
如果你愿意,也欢迎告诉我:哪一句话最能让你听出自己的家乡?
