人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载导读本文以 PaddleSpeech 仓库中的demos/TTSCppFrontend为对象系统讲解如何在 C 侧实现 TTS语音合成的文本前端Frontend即把中文文本经过繁简转换、分句、分词、文本正则化、音素映射、变调与儿化音处理后转换为声学模型可直接消费的音素序号数组。读者读完本文后将掌握该 demo 的编译环境准备、构建流程、词典下载、配置项详解、运行方式与输出含义并理解其底层ppspeech::FrontEngineInterface的完整调用链与实现原理为在自有 C TTS 服务中接入文本前端打下基础。一、TTSCppFrontend 是什么TTS 系统的完整链路通常包含「文本前端 → 声学模型 → 声码器」三大部分。其中文本前端负责将自然语言文本转换为声学模型能够理解的音素序列是决定合成音质与可懂度的第一步。PaddleSpeech 在demos/TTSCppFrontend目录下提供了一个纯 C 实现的 TTS 文本前端 demo其核心功能是 text-to-phoneme文本转音素转换。它复用了与 Python 侧 TTS 前端相同的处理策略并依赖 cppjieba 分词与一组词典文件完成全流程处理最终输出与 PaddleSpeech 的 FastSpeech2 / Speedyspeech 声学模型字典格式对齐的音素 id 数组phoneids与音调 id 数组toneids。当前版本存在一个明确的限制README 已注明仅支持中文输入任意英文单词会导致 demo 崩溃。因此在评测与使用时应只输入中文文本含中文标点。二、整体结构速览demos/TTSCppFrontend/ ├── CMakeLists.txt # 顶层构建脚本静态库 demo 可执行文件 ├── build.sh # 一键构建脚本 ├── clean.sh # 清理脚本 ├── download.sh # 下载词典与依赖 ├── run_front_demo.sh # 运行 demo ├── front_demo/ │ ├── front.conf # 前端配置文件jieba/词典路径等 │ ├── front_demo.cpp # demo 主程序入口 │ └── gentools/ # 字典生成工具genid.py 等 ├── src/ │ ├── base/type_conv.{h,cpp} # utf8/wstring 转换 │ └── front/ │ ├── front_interface.{h,cpp} # 前端引擎核心实现 │ └── text_normalize.{h,cpp} # 文本正则化 └── third-party/CMakeLists.txt # 第三方依赖gflags/glog/abseil/cppjieba/limonp其中代码核心是 front_interface.h 与 front_interface.cpp 中的ppspeech::FrontEngineInterface它继承自 text_normalize.h 中的TextNormalizer负责正则化并在此基础上叠加分词、音素映射与变调逻辑。三、安装构建工具构建需要 C17 编译环境与 CMakeREADME 给出了 Ubuntu 与 CentOS 两种安装方式# Ubuntu sudo apt install build-essential cmake pkg-config # CentOS sudo yum groupinstall Development Tools sudo yum install cmake如果系统的 cmake 版本过旧顶层 CMakeLists.txt 要求cmake_minimum_required(VERSION 3.10)可以到 cmake 官网下载预编译的新版本替代系统自带版本。四、构建流程与第三方依赖4.1 一键构建# 使用全部 CPU 核心并行构建 ./build.sh # 仅使用 1 个核心构建 ./build.sh -j1构建产物为build/tts_front_demo可执行文件。依赖库会自动下载到third-party/build目录。若下载速度过慢可打开 third-party/CMakeLists.txt 修改GIT_REPOSITORY为可访问的镜像地址。4.2 依赖清单与链接方式从 third-party/CMakeLists.txt 可以看到以下依赖依赖版本作用引入方式gflagsv2.2.2命令行参数解析pkg-config IMPORTED_TARGETglogv0.6.0日志输出pkg-config IMPORTED_TARGETabseil-cpp20230125.1字符串处理absl::StrSplit等pkg-config IMPORTED_TARGETcppjiebav5.0.3中文分词header-onlyinclude 头文件limonpv0.6.6基础工具库header-onlycppjieba 依赖include 头文件顶层 CMakeLists.txt 的关键点通过ENV{PKG_CONFIG_PATH}指向third-party/build下的 pkgconfig 目录并使用pkg_check_modules加载 gflags/glog/abseil将src/base/*.cpp与src/front/*.cpp编译为静态库paddlespeech_tts_frontCMAKE_CXX_STANDARD 17、POSITION_INDEPENDENT_CODE ON通过WITH_FRONT_DEMO默认 ON选项控制是否编译tts_front_demo可执行文件其源码来自front_demo/*.cpp并链接paddlespeech_tts_front。五、下载词典文件构建完成后需要下载前端运行所需的词典文件./download.sh从 download.sh 可以看到脚本会下载 4 个压缩包到front_demo/dict目录并通过 MD5 校验完整性文件已存在且 MD5 匹配时自动跳过压缩包内容MD5fastspeech2_nosil_baker_ckpt_0.4.tar.gzFastSpeech2 前端字典word2phone_fs2.dict、phone_id_map.txt 等7bf1bab1737375fa123c413eb429c573speedyspeech_nosil_baker_ckpt_0.5.tar.gzSpeedyspeech 前端字典word2phone.dict、tone_id_map.txt 等0b7754b21f324789aef469c61f4d5b8fjieba.tar.gzcppjieba 分词词典jieba.dict.utf8、hmm_model.utf8 等 5 个文件6d30f426bd8c0025110a483f051315catranditional_to_simplified.tar.gz繁转简字典trand2simp.txt258f5b59d5ebfe96d02007ca1d274a7f下载后的目录结构形如front_demo/dict/ ├── fastspeech2_nosil_baker_ckpt_0.4/ │ ├── word2phone_fs2.dict │ ├── phone_id_map.txt │ └── ... ├── speedyspeech_nosil_baker_ckpt_0.5/ │ ├── word2phone.dict │ ├── phone_id_map.txt │ ├── tone_id_map.txt │ └── ... ├── jieba/ │ ├── jieba.dict.utf8 │ ├── hmm_model.utf8 │ ├── user.dict.utf8 │ ├── idf.utf8 │ └── stop_words.utf8 └── tranditional_to_simplified/ └── trand2simp.txt注意download.sh使用wget若系统未安装 wget 需提前安装。六、运行 demo6.1 基本用法./run_front_demo.sh ./run_front_demo.sh --help ./run_front_demo.sh --sentence 这是语音合成服务的文本前端用于将文本转换为音素序号数组。 ./run_front_demo.sh --front_conf ./front_demo/front.conf --sentence 你还需要一个语音合成后端才能将其转换为实际的声音。run_front_demo.sh 内部逻辑很简单切换到脚本所在目录并执行./build/tts_front_demo $即把全部命令行参数透传给 demo 程序set -e保证出错即退出。6.2 命令行参数从 front_demo.cpp 的 gflags 定义可以看到 demo 支持两个参数参数默认值说明--sentence你好欢迎使用语音合成服务待合成的文本--front_conf./front_demo/front.conf前端配置文件路径--help由 gflags 自动提供ParseCommandLineFlags。6.3 输出说明demo 会把每个分句的原始文本、正则化后的文本、以及最终的 phoneids 与 toneids 通过 glog 打印到日志。例如处理分句后I... The phoneids of the sentence is: 67 45 12 10 ... 42 0 I... The toneids of the sentence is:其中 phoneids 是音素 id 数组FastSpeech2 模式toneids 在separate_tonefalseFastSpeech2时为空在separate_tonetrueSpeedyspeech时为音调 id 数组。标点会被映射为spFastSpeech2或sp0Speedyspeech静音音素其 id 也包含在输出中。这个数组即可作为声学模型如 FastSpeech2 / Speedyspeech的输入特征。七、配置文件 front.conf 详解配置文件 front.conf 是前端引擎的灵魂其读取逻辑位于FrontEngineInterface::ReadConfFile()front_interface.cpp逐行扫描以--开头的行按第一个拆分为 key/value 存入conf_map。因此新增配置项只需按同样格式追加一行。7.1 jieba 分词配置--jieba_dict_path./front_demo/dict/jieba/jieba.dict.utf8 --jieba_hmm_path./front_demo/dict/jieba/hmm_model.utf8 --jieba_user_dict_path./front_demo/dict/jieba/user.dict.utf8 --jieba_idf_path./front_demo/dict/jieba/idf.utf8 --jieba_stop_word_path./front_demo/dict/jieba/stop_words.utf8这 5 个路径按顺序对应 cppjieba::Jieba 构造函数的 5 个参数front_interface.cpp缺一不可。其中user.dict.utf8可用于加入自定义词汇如领域专有名词提升分词准确度。7.2 音素字典配置FastSpeech2 为例默认启用--separate_tonefalse --word2phone_path./front_demo/dict/fastspeech2_nosil_baker_ckpt_0.4/word2phone_fs2.dict --phone2id_path./front_demo/dict/fastspeech2_nosil_baker_ckpt_0.4/phone_id_map.txt --tone2id_path./front_demo/dict/fastspeech2_nosil_baker_ckpt_0.4/word2phone_fs2.dict7.3 音素字典配置Speedyspeech被注释按需启用#--separate_tonetrue #--word2phone_path./front_demo/dict/speedyspeech_nosil_baker_ckpt_0.5/word2phone.dict #--phone2id_path./front_demo/dict/speedyspeech_nosil_baker_ckpt_0.5/phone_id_map.txt #--tone2id_path./front_demo/dict/speedyspeech_nosil_baker_ckpt_0.5/tone_id_map.txt7.4 繁简转换配置--trand2simpd_path./front_demo/dict/tranditional_to_simplified/trand2simp.txt各配置项的作用与影响如下配置项必填说明jieba_dict_path等 5 项是cppjieba 词典路径缺任一文件初始化即失败separate_tone是true表示音调与音素分离输出Speedyspeech 风格toneids 非空false表示音素直接含调FastSpeech2 风格toneids 为空。注意tone2id_path仅在true时才会被加载见init()中if (_separate_tone true)分支word2phone_path是词→音素映射字典分词结果中未命中的词会退回jieba-CutAll全切分后逐词查表GetPhonephone2id_path是音素→音素 id 映射字典。README 提示可以改成你自己声学模型的phone_id_map.txt实现前端与自定义声学模型的对接tone2id_path仅 Speedyspeech音调→音调 id 映射trand2simpd_path是繁体→简体逐字映射字典用于Trand2Simp八、工作流程与源码级原理8.1 demo 主程序调用链front_demo.cpp 展示了完整的调用流程以--front_conf路径构造ppspeech::FrontEngineInterface构造函数内部自动调用init()Trand2Simp逐字符查繁简字典将繁体字替换为简体SplitByPunc按标点切分句子标点集合见init()中的_punc包含。、~, . ? ! : ; / \等_punc_omit中的引号类标点会被忽略对每个分句执行SentenceNormalize文本正则化来自父类TextNormalizerGetSentenceIds对分句分词并生成 phoneids/toneids打印最终的音素与音调 id 数组。8.2 音素 id 生成的核心逻辑GetSentenceIds→Cut→GetWordsIds的链路front_interface.cpp是文本前端的主干Cut分词_jieba-Tag(sentence, ...)得到「词 词性」结果再经MergeforModify对分词结果做 7 步合并处理MergeBu含“不”词合并→Mergeyi含“一”词合并→MergeReduplication叠词合并→MergeThreeTones/MergeThreeTones2连续第三声合并→MergeEr“儿”字与前词合并。这些合并是为了给后续变调规则提供正确的词边界。GetInitialsFinals通过GetPhone查word_phone_map得到词的音素串再按规则拆分为「声母列表 韵母列表」若词不在字典中则用_jieba-CutAll全切分后逐词查表拼接。ModifyTone变调依次执行BuSandi“不”的变调如不 四声 → bú、YiSandhi“一”的变调如四声前读二声、非四声前读四声、叠词间读轻声、NeuralSandhi轻声处理内置must_neural_tone_words/must_not_neural_tone_words两个词表覆盖量词、语气词、方位词、“的/地/得”、“了/着/过”、叠词名词动词等场景、ThreeSandhi三声变调双音节词前字变二声三/四字词按 21 或 12 切分后递归处理。MergeErhua儿化音对词尾为“儿”且前字非免儿化词内置must_erhua/not_erhua词表的情况在韵母中插入r如er2 → er2变为带卷舌色彩的韵母。Phone2Phoneid将音素串按空格切分逐项查phone_id_map得到 id。separate_tonetrue时按「音素本体 最后一个数字音调」拆分分别查phone_id_map与tone_id_map见 front_interface.cpp。标点处理标点统一映射为spFastSpeech2或sp0Speedyspeech静音音素再查 id 表。8.3 文本正则化TextNormalizer父类 text_normalize.h 中声明的SentenceNormalize及一系列Re*方法ReData日期、ReTime时间、RePercentage百分比、RePhone电话号码、ReMobilePhone手机号、ReFrac分数、ReRange范围、ReInterger整数、ReDecimalNum小数、ReTemperature温度、RePositiveQuantifiers量词等负责把数字、日期、时间等非文字符号展开为中文读音与 Python 侧 TTS 前端的文本正则化策略对齐。demo 会在GetSentenceIds前调用SentenceNormalize保证“2023年5月1日”之类的文本能被正确读音化。8.4 配置解析细节ReadConfFile只接受--keyvalue形式的行以#开头的注释行会被getline读到但因其不以--开头而被跳过这也是front.conf中用#注释 Speedyspeech 配置块的原因。加载顺序为jieba 5 项 → separate_tone → word2phone → phone2id → tone2id仅 separate_tonetrue 时→ trand2simpdfront_interface.cpp。九、对接自定义声学模型README 明确指出可以通过修改front.conf中的--phone2id_path指向你自己的声学模型的phone_id_map.txt让该前端输出的音素 id 直接匹配自定义模型。操作步骤下载并解压词典./download.sh将 front.conf 中的phone2id_path改为目标模型的phone_id_map.txt若目标模型为 Speedyspeech 风格音素与音调分离同时设置--separate_tonetrue并指定tone2id_path重新运行./run_front_demo.sh --sentence ...验证输出 id 是否在目标模型 id 空间内。若需按新字典生成 id 映射文件可参考front_demo/gentools/下的工具genid.py从phones.txt/tones.txt生成pad 0、unk 1起序的 id 字典文件word2phones.py与gen_dict_paddlespeech.py用于生成词到音素的映射字典。十、清理./clean.sh该命令会删除front_demo/dict、build与third-party/build三个目录即词典、构建产物与第三方依赖全部清除。清理后如需重新使用需重新执行./download.sh与./build.sh。十一、已知限制与使用建议仅支持中文README 明确提示任何英文单词都会导致 demo 崩溃实际使用时应先做语言过滤词典依赖外网下载download.sh使用 wget 从 bcebos CDN 下载网络受限环境可手动下载后按目录结构放置并核对 MD5音素字典对齐输出 id 的语义完全取决于phone2id_path所指字典对接不同声学模型前务必确认字典一致否则会出现「前端输出 id 与模型字典错位」的问题路径相对性front.conf中所有路径均为相对路径运行时需保持「脚本所在目录为工作目录」run_front_demo.sh已自动cd若直接执行build/tts_front_demo需自行保证路径正确。十二、小结PaddleSpeech 的demos/TTSCppFrontend提供了一个可独立编译、可复用的 C TTS 文本前端参考实现它完整覆盖了中文文本从繁简转换、分句、正则化、jieba 分词、音素查表、变调与儿化音处理到输出 phoneids/toneids 的全部环节且通过front.conf将词典路径与声学模型字典解耦便于对接 FastSpeech2 / Speedyspeech 乃至自定义声学模型。开发者可以以此为模板在自有 C TTS 服务中集成paddlespeech_tts_front静态库或将其中的变调、儿化音、文本正则化等规则移植到其他工程。赞分享人工智能语音音频【免费下载链接】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/gh_mirrors/pa/PaddleSpeech点击查看免费下载相关推荐FunASR 中文文本正则化Text Normalization完整指南从口语化数字到 TTS 前端文本FunASR 中文文本正则化Text Normalization完整指南从口语化数字到 TTS 前端文本 导读 本文以 FunASR 仓库中 fun_te语音音频人工智能大模型模型推理服务本地部署5分钟上手PaddleSpeech TTS从文本到语音的全流程实践指南5分钟上手PaddleSpeech TTS从文本到语音的全流程实践指南 你还在为开发语音交互功能时遇到的合成语音生硬、多语言支持不足、部署流程复杂等问题而困扰人工智能语音音频PaddleSpeech 文本转语音(TTS)功能详解与使用指南PaddleSpeech 文本转语音 TTS 功能详解与使用指南 一、文本转语音技术概述 文本转语音 Text to Speech, TTS 是一种将书面文字转人工智能语音音频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考