首页/新闻资讯/正文详情

PaddleSpeech 中 ERNIE-SAT 模型源码深度解析:跨语言语音合成与语音编辑的联合预训练实现

发布时间:2026/9/24 17:09:24 来源:云帆数科 栏目:资讯中心
PaddleSpeech 中 ERNIE-SAT 模型源码深度解析:跨语言语音合成与语音编辑的联合预训练实现
人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载本篇技术指南以 PaddleSpeech 仓库中paddlespeech.t2s.models.ernie_sat.ernie_sat模块为核心系统拆解 ERNIE-SATSpeech-text joint pretraining framework在 PaddleSpeech 中的完整实现从ErnieSAT网络结构MLM 编码器/解码器、掩码输入层、Postnet、双掩码训练范式与 MLM 损失到配套的 Updater/Evaluator 训练管线与 AISHELL-3 实战配置。读完本文你将能读懂 ERNIE-SAT 的核心源码调用链并掌握如何在 PaddleSpeech 中基于该模型完成跨语言多说话人语音合成与语音编辑任务。模块定位ERNIE-SAT 在 PaddleSpeech 中的角色docs/source/api/paddlespeech.t2s.models.ernie_sat.ernie_sat.rst是 PaddleSpeech 文档体系中针对ernie_sat模块生成的 API 文档入口其通过 Sphinx 的automodule指令将该模块的所有公开成员:members:、:undoc-members:、:show-inheritance:自动纳入文档。该 RST 本身只是一个文档指令占位符其技术实质全部落在对应的 Python 源码中模型网络实现约 740 行包含全部网络结构与推理逻辑训练/评估配套ErnieSATUpdater与ErnieSATEvaluator模块导出入口 __init__.py通过from .ernie_sat import *与from .ernie_sat_updater import *将上述类统一导出。根据 examples/aishell3/ernie_sat/README.md 的说明ERNIE-SAT 是一个 speech-text 联合预训练框架在跨语言多说话人语音合成与跨语言语音编辑任务上表现出色可应用于语音编辑Speech Editing、个性化语音合成Personalized Speech Synthesis与声音克隆Voice Cloning等场景。其两大核心创新点是预训练过程中使用中英文对应的音素作为输入实现跨语言与个性化的软音素映射soft phoneme mapping通过语音与文本的联合掩码学习joint mask learning of speech and text实现语音与文本的对齐。模块顶层类图一次看懂文件组织ernie_sat.py中定义的类形成了清晰的继承与组合关系这也是 RST 文档中:show-inheritance:所展示的结构类名父类职责mySequentialpaddle.nn.Sequential支持 tuple 输入逐层前向传播的序列容器MaskInputLayerpaddle.nn.Layer可学习掩码 token 的输入掩码层MLM 的核心MLMEncoderpaddle.nn.LayerConformer 结构编码器同时编码语音与文本MLMDecoderMLMEncoder复用编码器结构的解码器仅处理单一路径输入MLMpaddle.nn.LayerMLM 模型基类组装 encoder/decoder/sfc/postnetMLMEncAsDecoderMLM编码器即解码器变体text_maskingFalse时使用MLMDualMaksingMLM语音文本双重掩码变体text_maskingTrue时使用ErnieSATpaddle.nn.Layer顶层模型按配置组装 encoder、decoder 与模型变体ErnieSATInferencepaddle.nn.Layer推理包装层负责特征反归一化其中ErnieSAT.__init__中有一行关键代码决定了模型变体model_class MLMDualMaksing if text_masking else MLMEncAsDecoder即当开启text_masking时模型在重建掩码语音帧的同时还要通过text_sfc预测被掩码的文本 token从而形成语音文本双掩码的训练范式关闭时则退化为仅做语音掩码重建、编码器兼作解码器的结构。MaskInputLayer 与掩码机制MLM 的数据流起点class MaskInputLayer(nn.Layer): def __init__(self, out_features: int) - None: super().__init__() self.mask_feature paddle.create_parameter( shape(1, 1, out_features), dtypepaddle.float32, default_initializerpaddle.nn.initializer.Assign( paddle.normal(shape(1, 1, out_features)))) def forward(self, input: paddle.Tensor, masked_pos: paddle.TensorNone) - paddle.Tensor: masked_pos paddle.expand_as(paddle.unsqueeze(masked_pos, -1), input) masked_input masked_fill(input, masked_pos, 0) masked_fill( paddle.expand_as(self.mask_feature, input), ~masked_pos, 0) return masked_input该层ernie_sat.py的行为可以这样理解维护一个形状为(1, 1, out_features)的可学习掩码特征用标准正态分布初始化前向时将masked_pos布尔掩码标记哪些帧需要被掩蔽广播到与输入相同的形状对被掩码位置masked_pos为 True将输入帧置零并加上可学习的mask_feature对未掩码位置保留原始输入。这样模型看到的输入序列中被掩码的语音帧被替换为统一的、可学习的掩码 token 表示网络需要依据上下文包括文本侧信息重建这些帧这正是掩码语言模型MLM, Mask Language Model思想在语音-文本联合建模中的应用。MLMEncoderConformer 编码器与五种输入嵌入方式MLMEncoderernie_sat.py是一个可配置的 Conformer encoder同时接收speech与text两个模态的输入。其构造函数通过大量参数控制网络结构核心配置维度包括输入嵌入层input_layer取值含义linearLinear LayerNorm Dropout ReLU 位置编码conv2dConv2dSubsampling2 倍时间下采样 ×2conv_subsampling_factor4embednn.Embedding适合纯文本输入需指定padding_idxmlm语音侧用MaskInputLayer Linear LayerNorm ReLU文本侧用Embeddingsega_mlm在mlm基础上增加可学习的segment_embnn.Embedding(500, ...)用于按音素分段对齐PaddleSpeech 官方 AISHELL-3 配置中编码器输入层为sega_mlmdefault.yaml。sega_mlm之所以能实现分段在于其引入了speech_seg_pos/text_seg_pos两个分段位置张量前向时通过self.segment_emb(speech_seg_pos)与self.segment_emb(text_seg_pos)得到分段嵌入并叠加到语音/文本表示上ernie_sat.py从而实现第 n 个音素对应的 mel 帧这种细粒度对齐信息注入。位置编码pos_enc_layer_type支持abs_pos绝对位置、scaled_abs_pos缩放绝对位置、rel_pos相对位置要求自注意力为rel_selfattn、legacy_rel_pos旧版相对位置要求自注意力为legacy_rel_selfattn。默认配置使用legacy_rel_poslegacy_rel_selfattn。自注意力、前馈与卷积模块自注意力MultiHeadedAttention/RelPositionMultiHeadedAttention/LegacyRelPositionMultiHeadedAttention前馈网络linearPositionwiseFeedForward、conv1dMultiLayeredConv1d、conv1d-linearConv1dLinear卷积模块ConvolutionModule由use_cnn_module开关控制cnn_module_kernel控制卷积核大小每个EncoderLayer按num_blocks重复堆叠支持macaron_styleMacaron 风格前馈、normalize_before先归一化与stochastic_depth_rate随机深度。pre_speech_layer语音预编码路径MLMEncoder支持pre_speech_layer参数当大于 0 时会先构造pre_speech_encoders对仅语音的序列单独进行若干层 Conformer 编码再进行语音-文本拼接后的联合编码ernie_sat.py。默认配置enc_pre_speech_layer: 0表示关闭该预编码路径。前向流程def forward(self, speech, text, masked_pos, speech_maskNone, text_maskNone, speech_seg_posNone, text_seg_posNone): # 1. 语音侧嵌入含掩码 speech self.speech_embed(speech, masked_pos) # 2. 文本侧嵌入 text self.text_embed(text) # 3. 叠加分段嵌入sega_mlm 路径 ... # 4. 可选语音预编码 speech, _ self.pre_speech_encoders(speech, speech_mask) # 5. 拼接语音与文本序列联合编码 xs paddle.concat([speech[0], text[0]], axis1) xs_pos_emb paddle.concat([speech[1], text[1]], axis1) masks paddle.concat([speech_mask, text_mask], axis-1) xs, masks self.encoders((xs, xs_pos_emb), masks) ... return xs, masks注意speech_embed返回的是(特征, 位置编码)的 tuplemySequential支持 tuple 穿透因此拼接时同时拼接特征与位置编码两部分这正是相对位置编码在mySequential中的传递方式——这也是模块顶部定义mySequential的原因普通nn.Sequential只能传单一输入而mySequential允许模块间传递(xs, xs_pos)二元组。MLMDecoder 与三种模型变体MLMDecoderMLMDecoder直接继承MLMEncoder并重写forwardernie_sat.py其输入是编码器输出的序列xs仅经过embed与encoders的再次编码后输出。当decoder_type ! no_decoder时ErnieSAT会构造一个独立的MLMDecoder此时input_layerNone、idim0对拼接后的联合表示进行二次建模。MLM 基类MLMernie_sat.py负责组装odim输出 mel 维度vocab_size从encoder.text_embed[0]._num_embeddings自动推导文本词表大小sfcnn.Linear(encoder._output_size, odim)将隐层映射回 mel 谱除非 decoder 自身已带output_layertext_sfc当text_maskingTrue时构造nn.Linear(embedding_dim, vocab_size)且权重与文本嵌入层共享weight_attrself.encoder.text_embed[0]._weight_attr用于从隐层预测被掩码的文本 tokenpostnet复用 Tacotron2 的Postnetpostnet_layers层、postnet_chans通道、postnet_filts卷积核大小、use_batch_normTrue、dropout_rate0.5用于对重建 mel 进行精修。MLM.inference是语音编辑能力的核心给定输入语音、文本、掩码位置masked_pos与编辑边界span_bdy一个[起始, 结束]的二元列表在use_teacher_forcingTrue时走完整前向拿到重建结果zs然后speech speech.squeeze(0) outs [speech[:span_bdy[0]]] # 编辑区之前保留原始语音 outs [zs[0][span_bdy[0]:span_bdy[1]]] # 编辑区内使用模型重建的 mel outs [speech[span_bdy[1]:]] # 编辑区之后保留原始语音也就是说编辑任务只重合成被掩码的片段其余部分保持原样——这正是语音编辑把音频中某段文字替换成新文本的模型级实现机制。MLMEncAsDecoder 与 MLMDualMaksing两者共享同一条主干encoder 输出 →可选decoder → 从zs中切出语音部分speech_hidden_states zs[:, :speech.shape[1], :]→sfc映射 →可选postnet精修得到(before_outs, after_outs, None)。区别在于MLMDualMaksingernie_sat.py额外切出文本部分text_hiddent_states经text_sfc得到text_outs形状(B, T, vocab_size)从而返回(before_outs, after_outs, text_outs)三元组——第三个输出即用于计算文本侧 MLM 损失。ErnieSAT 顶层类参数化组装ErnieSATernie_sat.py是用户在配置文件中直接实例化的网络。构造函数分为四组参数通用结构参数参数默认值说明idim-文本词表大小被作为MLMEncoder.vocab_sizeodim-mel 维度如 80postnet_layers/postnet_filts/postnet_chans5 / 5 / 256Postnet 结构use_scaled_pos_encFalse是否使用缩放位置编码encoder_type/decoder_typeconformer/conformer当前仅支持conformerdecoder_typeno_decoder可关闭解码器init_typexavier_uniform通过initialize(self, init_type)全局初始化编码器参数enc_前缀enc_input_layersega_mlm、enc_pre_speech_layer0、enc_cnn_module_kernel7、enc_attention_dim384、enc_attention_heads2、enc_linear_units1536、enc_num_blocks4、enc_dropout_rate0.2、enc_positional_dropout_rate0.2、enc_attention_dropout_rate0.2、enc_normalize_beforeTrue、enc_macaron_styleTrue、enc_use_cnn_moduleTrue、enc_selfattention_layer_typelegacy_rel_selfattn、enc_activation_typeswish、enc_pos_enc_layer_typelegacy_rel_pos、enc_positionwise_layer_typeconv1d、enc_positionwise_conv_kernel_size3。解码器参数dec_前缀dec_cnn_module_kernel31、dec_attention_dim384、dec_attention_heads2、dec_linear_units1536、dec_num_blocks4、dec_dropout_rate0.2等结构与编码器对齐默认dec_pos_enc_layer_typelegacy_rel_pos、dec_selfattention_layer_typelegacy_rel_selfattn。关键开关text_masking: boolFalse——控制模型变体MLMDualMaksingvsMLMEncAsDecoder以及是否构造text_sfc文本预测头。组装完成后ErnieSAT.forward将全部 7 个张量参数原样透传给self.modelErnieSAT.inference透传给self.model.inference。推理包装层 ErnieSATInference反归一化输出class ErnieSATInference(nn.Layer): def __init__(self, normalizer, model): super().__init__() self.normalizer normalizer self.acoustic_model modelernie_sat.py该层将normalizer训练时用于归一化 mel 的统计量与声学模型组合推理时对模型输出的归一化 mel 分别执行normalizer.inverse返回logmel_pre编辑区之前、logmel_masked编辑区重建、logmel_post编辑区之后三段真实 log-mel 谱供下游神经声码器如 HiFiGAN/PWGAN合成波形。这也解释了语音编辑三段式拼接的输出形态与前端流程的一致性。训练配套ErnieSATUpdater / ErnieSATEvaluator 与 MLMLoss训练管线ernie_sat_updater.py 中的ErnieSATUpdater继承StandardUpdater定义了单步训练逻辑从 batch 中取出speech、text、masked_pos、speech_mask、text_mask、speech_seg_pos、text_seg_pos前向得到(before_outs, after_outs, text_outs)调用MLMLoss计算mlm_loss与可选的text_mlm_loss总损失loss mlm_loss text_mlm_loss无文本掩码时仅mlm_lossclear_grad → backward → step → scheduler.step()并通过report()记录train/loss、train/mlm_loss、train/text_mlm_loss供日志与可视化。ErnieSATEvaluator的evaluate_core逻辑与训练一致仅在验证集上计算并上报eval/loss等指标。两者都会按dist.get_rank()将日志写入output_dir/worker_{rank}.log天然支持多卡训练。MLMLoss 细节MLMLoss定义在 losses.py当lsm_weight 50时使用MSELoss否则使用L1Loss(reductionnone)语音侧 MLM 损失将before_outs与after_outs若存在reshape 为(-1, odim)与目标speech计算 L1 距离再按masked_pos 0的位置求加权平均即只在被掩码的语音帧上计算重建损失文本侧 MLM 损失text_maskingTrue时对text_outs与text计算CrossEntropyLoss(ignore_index-1)同样只在text_masked_pos标记的位置上求平均。由此可以看出 ERNIE-SAT 训练目标的双重性既要在掩码帧上重建语音 mel又要在掩码位置预测文本 token二者共同驱动语音与文本表征的对齐。实战配置AISHELL-3 示例逐项解读官方示例 examples/aishell3/ernie_sat 提供了完整的中文多说话人训练与合成流程配置文件为 conf/default.yaml。特征提取配置参数值说明fs24000采样率n_fft2048FFT 大小n_shift300帧移 12.5mswin_length1200窗长 50mswindowhann窗函数fmin/fmax80 / 7600Mel 滤波器频率范围n_mels80Mel 维度即odim掩码与数据配置mean_phn_span: 8平均音素跨度mask 的 span 长度相关mlm_prob: 0.8掩码概率即训练时约 80% 的语音帧被掩码重建batch_size: 40、num_workers: 8该配置在 8 张 A10080GB上约需 3 天完成训练可自行调整。模型配置model段与ErnieSAT构造函数参数一一对应enc_input_layer: sega_mlm、enc_attention_dim: 384、enc_num_blocks: 4、enc_macaron_style: true、dec_num_blocks: 4、dec_cnn_module_kernel: 31、text_masking: false等详见上文参数表。优化器与训练设置scheduler_params.d_model: 384、warmup_steps: 4000Transformer 风格 warmup 学习率调度grad_clip: 1.0梯度裁剪max_epoch: 1500、num_snapshots: 50最大训练轮数与快照数量token_listAISHELL-3 的中文音素词表含blank、unk、sos/eos等特殊 token即ErnieSAT的idim。端到端流程run.sh 通过--stage/--stop-stage控制四个阶段stage 0./local/preprocess.sh数据预处理生成dump/{train,dev,test}/{raw,norm}目录与speech_stats.npy、metadata.jsonlstage 1./local/train.sh调用${BIN_DIR}/train.py开始训练checkpoint 输出到exp/default/checkpoints/stage 2./local/synthesize.sh从metadata.jsonl合成波形声码器为 HiFiGANstage 3./local/synthesize_e2e.sh同时支持语音合成与语音编辑——通过--wav_path、--old_str、--new_str指定源音频、原文本与新文本并依据--task_name决定任务类型AISHELL-3 训练的模型--source_lang与--target_lang均为zh。官方提供的预训练模型 erniesat_aishell3_ckpt_1.2.0.zip 在 8 GPU × 289500 步训练后eval/mlm_loss与eval/loss均为 51.723782。源码阅读地图与延伸模型核心ernie_sat.py本文全部网络类训练配套ernie_sat_updater.py损失函数losses.pyMLMLoss示例配置conf/default.yaml示例流程run.sh、README.md进阶建议若要开启text_masking双掩码训练需同步将配置中model.text_masking置为true此时ErnieSATUpdater与ErnieSATEvaluator的text_masking、vocab_size参数也要保持一致训练 batch 中须包含text_masked_pos字段模型将自动切换到MLMDualMaksing分支并额外计算文本侧 MLM 损失——这正是 ERNIE-SAT语音-文本联合掩码学习在工程实现上的落点。赞分享人工智能语音音频NLP媒体生成【免费下载链接】PaddleSpeechEasy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword Spotting. Won NAACL2022 Best Demo Award.项目地址https://gitcode.com/paddlepaddle/PaddleSpeech点击查看免费下载相关推荐PaddleSpeech ERNIE-SAT 语音-文本联合预训练模型实现解析从 MLM 掩码编码器到跨语种语音合成与编辑PaddleSpeech ERNIE SAT 语音 文本联合预训练模型实现解析从 MLM 掩码编码器到跨语种语音合成与编辑 导读 本文以 PaddleSpee人工智能语音音频PaddleSpeech ERNIE-SAT 端到端语音合成与语音编辑synthesize_e2e 模块深度解析PaddleSpeech ERNIE SAT 端到端语音合成与语音编辑synthesize_e2e 模块深度解析 导读 paddlespeech.t2s.ex人工智能语音音频NLP媒体生成Cloud Monitoring 仪表盘 Widget 生成从 PromQL / ListTimeSeries 查询到 SDUI textproto 的三阶段工作流Cloud Monitoring 仪表盘 Widget 生成从 PromQL / ListTimeSeries 查询到 SDUI textproto 的三阶段人工智能语音音频上一篇QQ空间备份 3 步搞定用 GetQzonehistory 完整导出历史说说下一篇音乐解锁工具 unlock-music在浏览器里免费解锁加密音乐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

nom 2.0 升级指南:从 nom 1.x 迁移的完整破坏性变更清单与修复方案
nom 2.0 升级指南:从 nom 1.x 迁移的完整破坏性变更清单与修复方案

nom 2.0 升级指南:从 nom 1.x 迁移的完整破坏性变更清单与修复方案 【免费下载链接】nom Rust parser combinator framework 项目地址: https://gitcode.com/gh_mirrors/no/nom 导读 本文基于 doc/archive/upgrading_to_nom_2.md 编写,是 nom 1.… · 2026/9/24 17:09:17

Dopamine 分布投影详解:深入解析 `project_distribution` 与 C51 算法 Eq7 的实现
Dopamine 分布投影详解:深入解析 `project_distribution` 与 C51 算法 Eq7 的实现

Dopamine 分布投影详解:深入解析 project_distribution 与 C51 算法 Eq7 的实现 【免费下载链接】dopamine Dopamine is a research framework for fast prototyping of reinforcement learning algorithms. 项目地址: https://gitcode.com/gh_mirrors/do/dopami… · 2026/9/24 17:09:17

SDRPlusPlus Android后端NDK编译:从3条命令到完整ARM64构建
SDRPlusPlus Android后端NDK编译:从3条命令到完整ARM64构建

SDRPlusPlus Android后端NDK编译:从3条命令到完整ARM64构建 【免费下载链接】SDRPlusPlus Cross-Platform SDR Software 项目地址: https://gitcode.com/GitHub_Trending/sd/SDRPlusPlus SDR是一款跨平台的软件定义无线电软件,把手机变成能接收、… · 2026/9/24 17:09:11

记录一次开源物联网平台thinglinks的docker部署步骤
记录一次开源物联网平台thinglinks的docker部署步骤

物联网平台thinglinks部署说明(docker) 由于官网的部署文档找不到内容,自己凭借经验部署并记录了一遍。 安装docker和docker-compose 1.1上传docker-20.10.9.tgz安装包并解压 # tar -zxvf docker-20.10.9.tgz # cp docker/* /usr/bin/… · 2026/9/24 17:51:48

零基础学SQL 19:报表累计求和总对不上?窗口函数 4 行搞定(附 3 个模板)
零基础学SQL 19:报表累计求和总对不上?窗口函数 4 行搞定(附 3 个模板)

做月度报表,绕不开这三个问题: 截至这个月,累计是多少?跟上个月比,涨了还是跌了?这个月占了整体的百分之多少? 不会窗口函数的人,一般有三条出路:导到 Excel 手动拉一列、… · 2026/9/24 17:51:48

【n8n】AI驱动的短视频全自动生成应用
【n8n】AI驱动的短视频全自动生成应用

短视频内容的生产速度和创意质量已成为社交平台竞争的核心。借助AI与自动化技术,短视频的生成方式正从依赖人工转向全流程自动化生产模式。 该工作流以AI模型与自动化节点协作实现从创意到成品的短视频生成,涵盖文案构思、画面渲染、视频合成及语音配音等环节,适合批量化、… · 2026/9/24 17:51:48

Spring AI (1) : 快速构建智能应用
Spring AI (1) : 快速构建智能应用

目录:一、为什么选择 Spring AI?二、环境准备三、基础配置3.1 网络代理配置3.2 API Key 配置四、核心功能实现4.1 基础文本对话4.2 流式输出4.3 图像生成4.4 语音能力4.5 多模态识别五、Function Calling:让 AI 调用外部能力5.1 工作流程5.2 … · 2026/9/24 17:51:39

【n8n】图片节点自定义字体
【n8n】图片节点自定义字体

自定义图片节点字体已成为提升n8n工作流视觉表达与品牌识别的常用方案。通过在图片节点配置专属字体,能够优化自动化生成图片的风格与专业感。 本文介绍在n8n中集成免费商用字体的方法,结合实际操作步骤,展示字体安装与配置过程,帮助实现工作流图片个性化。 文章目录 图片… · 2026/9/24 17:51:39

用AI生成一个sql管理工具
用AI生成一个sql管理工具

创建的项目:https://github.com/yinlamei/SqlAssistantWpf.git 1、创建项目 提示词: SqlAssistant.sln ├── SqlAssistant.UI.csproj # WPF 主项目:View ViewModel ├── SqlAssistant.Application.csproj # 应用服务层… · 2026/9/24 17:51:39

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码