ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

TTS文字转语音底层拆解,看懂机器是怎么开口说话的

TTS文字转语音底层拆解,看懂机器是怎么开口说话的 文章目录前言1. 从文字到声音的四个步骤1.1 先把字读懂文本归一化与注音1.2 决定怎么念韵律预测1.3 画出声音的样子声学模型输出梅尔频谱1.4 图纸变成真声音声码器1.5 供应商那几个参数到底在调什么2. 合成与识别同一条路的两个方向3. 三代合成技术从拼接到模仿3.1 第一代拼接式3.2 第二代参数式3.3 第三代神经网络与音色克隆4. 流式合成为什么按句切4.1 按句切分的理由4.2 音频和文字走不同的通道P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看 传送门https://blog.csdn.net/qq_34419312前言先说明一下今天不整虚的就聊聊我把文字转语音TTS从头到尾捋了一遍之后的感受。捋完才发现这玩意儿拆开看跟播音员上班的流程一模一样区别只是播音员要化妆它不用。早年的机器朗读你一听就知道不是人字与字之间顿挫生硬语调平得像在念超市小票。现在你让语音助手读同一段话抑扬顿挫比部分真人主播还像人——我都怀疑它背着我偷偷报了播音班。这中间发生了什么不是多录了几吨音而是合成的做法换了个代。一句话变成声音机器要走四步跟播音员拿到稿子后的动作高度一致先弄清每个字念什么再定用什么语气然后在心里把这句话“听”一遍最后张嘴。1. 从文字到声音的四个步骤1.1 先把字读懂文本归一化与注音第一步完全不碰声音纯文字活跟考普通话之前先过一遍拼音一个性质。两件事。一是文本归一化把书面写法翻成读法2025 年要读成“二零二五年”3.14 要读成“三点一四”。你要是让机器按字面念春节晚会开场都能给你念出年代感。二是注音给每个字定读音。难点全在多音字重要读 zhòng重复读 chóng。选错一个后面全崩。你想想跟客户开会机器把“我们非常重视”念成“我们非常重zhóng视”会议室气氛能瞬间凝固到零下。同一个“重”字重庆读 chóng重量读 zhòng重口味还读 zhòng——一个字三种人生机器当场崩溃。顺便说个实战经验接入合成服务后第一件事一定是拿业务里的真实文案做一轮抽查。因为多音字和数字读法是合成翻车最集中的地方机器翻车的名场面一半都出在这。defnormalize_and_annotate(text):# 2025 - 二零二五3.14 - 三点一四textnormalize_number(text)# 重要 - zhòng重复 - chóngtextpick_polyphone(text)returntext1.2 决定怎么念韵律预测第二步叫韵律预测。通俗讲就是决定“怎么念”。每个字念多长、音高多少、哪里加重、哪里停顿、句末升调还是降调全在这一步。同样一句“你好吗”念法不同能差出十万八千里平淡的“你好吗”是打招呼句末一抬的“你好吗”是质问再压一点“你好吗……”是你欠他钱。机器要是分不清客服机器人能把“亲你好吗”念出讨债的味道。你试试让机器带感情念“我恨你”它可能给你念成“我恨你”像极了分手时还想着把话说得委婉一点。这一步做得好合成音像人做不好像人形读卡机。1.3 画出声音的样子声学模型输出梅尔频谱第三步交给声学模型产出的是梅尔频谱。注意走到这步声音依然没出现。得到的只是一张图哪一刻高、哪一刻低、哪一刻响。相当于设计师先出了张效果图客户看完效果图就以为房子已经能住进去了。1.4 图纸变成真声音声码器第四步把频谱还原成真正的波形干活的叫声码器。频谱这张图纸只写了“该有什么声音”没写空气具体怎么震。差的这半边由模型补出来补完才是喇叭能播的波形。补得好声音干净补不好发闷带金属感像在铁皮罐头里说话。这里有个排查经验很值钱合成音发闷、有金属感问题基本在声码器环节跟前面的文本处理和韵律没关系。你疯狂调语速调语调调出火星子也没用——就像菜咸了你去调电视音量方向从一开始就是错的。1.5 供应商那几个参数到底在调什么识别服务开放的那几个参数其实分别落在这四步上。理解四步你就知道每个参数在调什么参数对应步骤实际在调什么voice第三步声学模型是拿谁的录音训练的音色speed / pitch / volume第二步韵律sample_rate / format第四步声码器输出规格一句话总结你以为你在调音量其实你在调韵律你以为你在选音色其实你在选“这是谁的声音”。2. 合成与识别同一条路的两个方向理解语音合成有条捷径它跟语音识别是同一条路只是方向相反。识别波形 → 梅尔频谱 → 文字。先把声音压成频谱再从频谱认出字。合成文字 → 梅尔频谱 → 波形。先从字画出频谱再把频谱还原成声音。两头对调中间那站不变。梅尔频谱是两套系统共用的中间表示它描述声音在各个频率上的能量分布既能从波形算出来也能反过来还原成波形。打个比方梅尔频谱就是个快递驿站。识别是有人来送货合成是有人来取货货长什么样都得先过这一站。注意一个坑这种对称只在数据表示层面成立两个方向的模型并不能互换使用各自要单独训练。别指望拿个识别模型反过来就能念稿——那跟把方向盘拆下来装后排当座椅是一个道理看着像同一个件干的事完全不一样。3. 三代合成技术从拼接到模仿合成音为什么越来越像人因为三代技术解决的是同一个问题的不同层面先去掉接缝再去掉机器味最后学会某个具体的人怎么说话。3.1 第一代拼接式做法很朴素先录一大堆音节片段用的时候按需拼起来。问题出在接缝。片段之间衔接不上一顿一顿换个语气还没素材可用因为录制时只覆盖了有限的念法。早年那种明显机械感的朗读多半来自这一代。说白了就是语音界的拼多多素材全靠凑接缝全靠脑补。3.2 第二代参数式第二代改用规则和统计模型算出声音参数再据此合成波形。接缝问题消失了语流连贯了。但音色一听就是机器——就像客服热线里那句“为保证服务质量您的通话将被录音”你永远听不出它高兴还是不高兴因为它压根没有“高兴”这个选项。3.3 第三代神经网络与音色克隆第三代是端到端的神经网络方案也是当前的主流。做法拿某个人几十小时的录音让模型学这个人是怎么说话的。音色、语气、停顿习惯一起学不再把发音和音色拆开处理。正因为音色变成了可学习的参数音色克隆才成为可能给模型几秒到几十秒的参考音频它就能模仿这个人说出任意文字。MiniMax、ElevenLabs 那些声音克隆功能用的就是这一代技术。前两代做不到这件事它们的框架里音色由录音素材决定换一个人就得重录一整套语料。相当于换个说话的人整个录音棚都得拆了重建。4. 流式合成为什么按句切4.1 按句切分的理由实时对话里合成必须是流式的第一句合成完就开始播不等整段写完。这是首字延迟能压下来的关键。问题来了既然切得越细开播越早为什么不干脆按字切答案韵律要靠上下文。句末该降调、疑问句该升调、哪个字该重读只有知道整句才定得下来。举个例子“今天我很开心我一定要去打乒乓球”。最后半句语调要往上提模型得看到前面那半句才知道这是一件值得高兴的事。要是逐字合成“今-天-我-很-开-心”每个字都孤立语调被切得支离破碎——听起来像在念单字表还是那种考试不及格被罚抄的念法。所以粒度卡在句这一层短到能尽早开播长到韵律还成立。实现里就是攒够一句话才送合成。defstream_synthesize(text):forsentenceinsplit_by_sentence(text):audiosynthesize(sentence)# 攒够一句才送play(audio)# 边合成边播不等整段这里有个几乎零成本的优化让第一句尽量短。切句规则直接决定首字延迟第一句短了用户体感直接起飞。4.2 音频和文字走不同的通道合成完之后音频要送回用户端播放同时识别到的文字和模型生成的回复通常也要显示在屏幕上。这两类数据的传输要求不一样。音频对实时性和抗丢包要求高一般走 WebRTC。文字是小体积消息可选方案很多WebSocket、DataChannel、gRPC、SSE 都行。选哪种看项目现有技术栈音频已走 WebRTC就复用同一条连接上的 DataChannel 传文字省一套连接前端本来有 WebSocket直接复用也没毛病。记住文字通道的选择不影响音频实时性两者相互独立。别为了“统一”把音频硬塞进同一条消息通道——就像快递和外卖可以同时到但你不能让外卖小哥顺路帮你把冰箱也搬了。捋完一圈把链路再背一遍文本归一化与注音把字读懂韵律预测定下怎么念声学模型画出频谱声码器还原成波形这条路跟识别方向相反但中途相同都经过梅尔频谱这一站合成音越来越像人是因为神经网络把音色也纳入学习实时对话按句切是因为韵律在一字尺度上根本无从谈起。下次再有人吐槽“这语音助手听起来不像人”你可以淡定地回他问题多半出在声码器或者出在他家网速。反正不在我。P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/qq_34419312
返回列表