人工智能程序设计 课件 第4章 基于语音合成技术的行程播报系统_第1页
人工智能程序设计 课件 第4章 基于语音合成技术的行程播报系统_第2页
人工智能程序设计 课件 第4章 基于语音合成技术的行程播报系统_第3页
人工智能程序设计 课件 第4章 基于语音合成技术的行程播报系统_第4页
人工智能程序设计 课件 第4章 基于语音合成技术的行程播报系统_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程表、出行建议与语音播报的系统设计与实现SpeechSynthesis-basedItineraryBroadcastSystem第四章——基于语音合成技术的行程播报系统INTELLIGENCEPROGRAMMING&SPEECHSYNTHESISSYSTEMS目录CONTENTS

01

02

03

04背景、需求与总体设计OpenVoice模型与音色转换课程表模块设计出行建议模块设计《人工智能程序设计》基于语音生成的行程播报系统

05语音合成模块

06系统集成与本章小结课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(一)语音合成背景系统建设目标《人工智能程序设计》基于语音生成的行程播报系统发展概述语音合成技术(TTS)经历了明显的技术演进。早期尝试:机械装置模仿人类发声器官。电子合成器时代:利用电子电路实现基础语音合成,但效果机械僵硬。后续方法:共振峰参数、基于规则的合成方法。机械装置电子生成器共振峰参数合成基于规则的合成机械结构模仿人类发声器官,实现初步发声。利用电子电路合成语音,但效果机械僵硬。基于语音学参数建模,提升语音自然度。依据语言规则与发音知识,生成语音逐步迈向更加自然的语音合成课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(一)语音合成背景《人工智能程序设计》基于语音生成的行程播报系统基于规则的合成发展延伸波形拼接语音合成:组合真实语音片段,提高自然度。统计参数语音合成:引入统计学习方法,使用HMM等模型提升灵活性和适应性。深度学习语音合成:成为主流,简化合成流程,提高语音质量和自然度。语音合成技术持续向更自然、更高质量的方向发展。波形拼接统计参数深度学习组合真实语音片段,提高语音自然度。引入统计学习方法,使用HMM等模型,提升灵活性和适应性。成为主流,简化合成流程,提高语音质量和自然度。自然度与灵活性持续提升课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(一)语音合成背景系统建设目标《人工智能程序设计》基于语音生成的行程播报系统应用价值语音合成改善人机交互方式。浏览器朗读功能可将网页文字朗读出来。对阅读障碍者有帮助。应用领域:无障碍服务、智能助手、语音导航、有声读物。语音合成技术提升了用户体验,并推动科技向更加人性化的方向发展。浏览器朗读无障碍服务语音导航有声读物

智能助手帮助阅读障碍者更便捷地获取信息。支持更加自然的人机语音交互。通过语音播报提供路线提示。将文本内容转化为可听化信息。应用范围持续拓展课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计系统建设目标《人工智能程序设计》基于语音生成的行程播报系统本章聚焦学生行程播报系统。目标:帮助同学们管理时间、制定计划、提升效率。系统根据用户输入的课程名称和课程时间信息运行。在课程开始前,系统定时播报当前天气信息和出行建议。系统目标输入信息课程名称课程时间学生行程播报系统天气信息出行建议语音播报课程开始前定时播报课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计系统建设目标《人工智能程序设计》基于语音生成的行程播报系统课程表模块出行建议模块语音合成模块存储课程名称与课程时间管理课程安排信息按课程时间调用其他模块调用天气网站接口获取当前天气信息对天气情况进行分析生成出行建议读取文本文档中的文字将文字转化为语音调用相关包播放语音该系统将被分成三个模块,分别是课程表模块、出行建议模块和语音合成模块,不同的模块负责实现不同的功能课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计系统建设目标《人工智能程序设计》基于语音生成的行程播报系统天气平台调用API返回JSON信息定向调用存储课程名称与课程时间按课程时间排序按时间调用其他模块调用天气平台API获取天气信息(JSON)生成出行建议将文本转化为语音结合参考音频进行合成输出目标合成音频参考音频语音生成参考音频语音播报合成目标音频出行建议模块课程表模块语音合成模块图4-2系统总体设计图课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计《人工智能程序设计》基于语音生成的行程播报系统01030204输入课程按时间排序定时遍历调用出行建议用户通过课程表模块输入课程名称和课程时间课程表模块实现定时器,对课程信息进行遍历课程表模块按课程时间排序定时器在课程开始前10分钟或更早调用出行建议模块课程表模块是系统流程的起点,通过定时驱动后续模块的执行。课程表模块职责课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计《人工智能程序设计》基于语音生成的行程播报系统数据获取关键信息提取天气平台调用API返回

JSON

数据出行建议模块调用天气平台

API。API返回JSON类型数据。JSON是轻量级数据存储和交换格式,类似字典键值对。提取影响出行的关键信息,并生成建议信息。体感温度降雨情况未来两小时每5分钟降水信息出行建议模块提取影响出行的关键信息:体感温度、降雨情况、未来两小时每5分钟降水信息。JSONAPI出行建议模块职责课程介绍近五年承担的国家级重大重点项目情况背景、需求与总体设计

01(二)系统需求与总体设计《人工智能程序设计》基于语音生成的行程播报系统语音合成模块职责文本建议平均音色语音目标音色语音播放播报出行建议模块生成文字建议OpenVoice先生成具有平均音色的语音片段使用音色转换器转化为目标音频音色使用音色转换器转化为目标音频音色语音合成模块将文字建议转化为可播放语音,实现从文本到语音播报的输出课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(一)OpenVoice模型《人工智能程序设计》基于语音生成的行程播报系统OpenVoice模型的作用OpenVoice模型旨在解决传统语音合成技术中存在的一些问题,例如机械感较强、情感表达不足以及难以适应多样化语音需求等。OpenVoice模型的组成OpenVoice包含两个模块:基础语音合成模块语音转换器文本输入基础语音合成模块语音转换器将音色转换为目标音色生成具有平均音色的语音片段目标音色参考音频输出语音课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(一)OpenVoice模型《人工智能程序设计》基于语音生成的行程播报系统文本内容音色提取器风格参数比如口音、情绪、语调......基础语音合成模型BaseSpeakerTTSModel编码器正向归一化流逆向归一化流解码器参考音频目标合成音频与国际音标(IPA)对齐的特征,去除单色信息,但保留了其他风格特性。图4-3OpenVoice模型图课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(二)OpenVoice模型的特点《人工智能程序设计》基于语音生成的行程播报系统课程表模块1.准确的音色克隆通过深度学习算法捕捉参考音频的细微差别。在不同语言的语音合成中复现这些特征。可以产生与特定人声极为相似的合成语音。参考音频音色特征提取合成语音深度学习算法捕捉音色细微差别在不同语言的语音合成中复现特征,生成相似人声课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(二)OpenVoice模型的特点《人工智能程序设计》基于语音生成的行程播报系统2.灵活的语音风格控制OpenVoice模型提供了语音风格控制选项。用户可以根据自己的需求调整语音的情感色彩和语速、停顿、语调等参数。以适应不同的语境和内容。生成个性化语音可调节的语音风格参数情感色彩停顿语调语速如:平静、开心、严肃等如:慢速、正常、快速等如:短停顿、正常、长停顿等如:低沉、正常、抑扬顿挫等课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(二)OpenVoice模型的特点《人工智能程序设计》基于语音生成的行程播报系统3.零样本跨语言语音克隆OpenVoice模型具备出色的泛化能力。能够在没有接触过的语言或方言中进行音色克隆。无需为每种语言单独进行训练。参考音色提供一段参考音频(任意语言)中文输出(保持相同音色)英文输出(保持相同音色)日文输出(保持相同音色)更多语言/方言(保持相同音色)中EN日...零样本跨语言语音克隆输出在未见过的语言或方言中也能克隆出与参考音色高度一致的语音。课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(三)基础语音合成模块的作用《人工智能程序设计》基于语音生成的行程播报系统基础语音合成模型可以控制风格参数。风格参数包括情绪、口音、停顿、语调等。OpenVoice默认基础语音合成模型是VITS模型。输入:一段文本文本内容情绪口音停顿语调基础语音合成模型风格参数(可控制)输出:平均音色语音带有拟使用语言平均音色的语音片段OpenVoice默认使用的基础语音合成模型该模块将文本和风格参数结合,生成具有平均音色、可控制风格的语音片段,为后续音色转换提供基础音频。课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(四)音色转换器的结构《人工智能程序设计》基于语音生成的行程播报系统音色转换器是编码器-解码器架构。编码器与解码器之间是可逆归一化流模型,可逆归一化流的变换是可逆的,每个变换都有反向变换。编码器输出经正向归一化流生成中间分布,再经过逆向归一化流变为解码器输入。可逆归一化流:每个变换都有反向变换。来自基础语音合成模块的语音特征编码器正向归一化流中间分布逆向归一化流解码器提取语音特征并输出潜在表示将潜在表示映射到中间分布空间中间潜在分布空间(易于采样和计算)将中间分布映射为解码器输入将潜在表示解码为目标音色特征目标音色语音输出音色转换器结构可逆归一化流:每个变换都有反向变换课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(五)逆向归一化流公式与变量含义《人工智能程序设计》基于语音生成的行程播报系统逆向归一化流公式书中给出逆向归一化流表达式:公式说明

变量含义:中间表示。:原始分布,如标准高斯分布。:流的逆变换。:流的雅可比矩阵,用于表达变换的影响。要点总结

课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(六)编码器与音色提取器的功能《人工智能程序设计》基于语音生成的行程播报系统音色转换器由两个关键部分组成:“编码器”和“音色提取器”。编码器处理来自基础语音合成模块的音频,提取内容相关特征。音色提取器处理参考音频,提取说话人音色相关特征。两者提取的特征在后续的可逆归一化流模型中进行融合与转换,从而实现音色转换。编码器(1DCNN)编码器是一维卷积神经网络(CNN)。将基础语音合成模型输出的原始音频作为输入,并输出特征图。原始音频(来自基础语音合成模型)1DCNN编码器特征图(内容相关特征)特征图是由一系列卷积核对输入进行卷积操作得到的结果。音色提取器(2DCNN)音色提取器是二维卷积神经网络。从参考音频中提取音色,并表示为特征向量。特征向量是一组用于描述样本特征或属性的数值。参考音频(目标说话人)2DCNN音色提取器特征向量(音色特征)特征向量是从原始数据中提取或构建的,用于表示样本(说话人)的音色特征。课程介绍近五年承担的国家级重大重点项目情况OpenVoice模型原理

02(七)音色转换的核心流程《人工智能程序设计》基于语音生成的形成播报系统阶段1:去除音色信息获取中间表示编码器输出正向归一化流中间特征表示去除音色信息保留其他风格信息阶段2:嵌入目标音色信息得到输出特征阶段3:解码生成目标音频中间特征表示参考音频音色特征(由音色提取器获得)输出特征(包含全部风格信息)解码器逆向归一化流目标音频正向归一化流以编码器输出和音色提取器输出为输入。输出一个中间特征表示,去除了音色信息,但保留了语速、语调、停顿等其他风格信息。将中间表示与参考音频的音色特征联合输入逆归一化流模型。逆归一化流将音色信息嵌入中间特征表示,得到包含全部风格信息的输出特征。解码器将包含全部风格信息的输出特征还原成最终目标音频。目标音频具有参考音频的音色以及原文本的其他风格信息。核心思想:先去除音色保留风格,再嵌入目标音色,最后解码生成目标音频。音色提取器输出(参考音色特征)课程介绍近五年承担的国家级重大重点项目情况课程表模块设计

03(一)课程表模块:整体框架与核心职责《人工智能程序设计》基于语音生成的行程播报系统课程表模块的核心是

Schedule类,负责课程信息的管理与定时触发。存储课程使用字典结构保存课程信息添加课程add_course

方法添加新课程课前提醒set_timers

方法课前10分钟触发按时间排序使用

OrderedDict按时间自动排序输出课程show_course

方法输出课程信息在合适时间调用gene_advice

函数调用

gene_adviceSchedule类课程表模块的核心管理课程并触发处理课程介绍近五年承担的国家级重大重点项目情况课程表模块设计

03(二)课程表模块:初始化与添加课程《人工智能程序设计》基于语音生成的行程播报系统add_course作用说明初始化字典__init__方法创建空字典self.schedule合并日期与时间使用bine得到完整datetime格式化时间字符串使用%H:%M格式化为时间字符串存储课程信息以嵌套字典形式保存课程名和课程时间按时间排序使用Order3edDict对字典按时间升序排序代码from

datetimeimport

datetime,timedeltafrom

collectionsimport

OrderedDict

class

Schedule:

def

__init__(self):

self.schedule=

{}

def

add_course(self,time,course_name):

#获取当前日期,并将时间转换为datetime对象

today=

datetime.today().date()

course_time=

bine(today,time)

#合并日期和时间

time_str=

course_time.strftime("%H:%M")

#格式化时间为字符串

#存储为字典,包含时间和课程名,字典嵌套字典

self.schedule[time_str]=

{

'course_name':course_name,

'time':course_time

}

#课程表按时间time_str排序

self.schedule=

OrderedDict(sorted(self.schedule.items()))课程介绍近五年承担的国家级重大重点项目情况课程表模块设计

03(三)课程表模块:set_timers定时提醒《人工智能程序设计》基于语音生成的行程播报系统代码set_timers执行流程import

threadingfrom

weatherimport

gene_advice

class

Schedule:

def

set_timers(self):

#获取当前时间

current_time

=

datetime.now()

#遍历课程表,为每节课设置定时器

for

time_str,course_info

in

self.schedule.items():

#从字典中获取课程时间

course_time

=

course_info['time']

#提前10分钟提醒,计算出提醒的时间点

reminder_time

=

course_time

-

timedelta(minutes=10)

#计算当前时间与提醒时间之间的时间差,单位是秒

delay_seconds

=

(reminder_time

-

current_time).total_seconds()

if

delay_seconds

>

0:

#如果距离提醒时间还有一段时间,则使用定时器延迟调用

threading.Timer(

delay_seconds,

gene_advice,

args=(course_info['course_name'],course_info['time'],)

).start()

else:

#如果距离上课小于10分钟,则直接调用

gene_advice(course_info['course_name'],course_info['time'],)

1.遍历课程表逐一处理每节课程2.取出课程时间3.计算课前10分钟4.计算延迟秒数5.判断并触发6.调用gene_advice遍历self.schedule.items()course_time计算提醒的时间点计算距离提醒时间还有多少秒到点触发出行建议处理进入下游模块生成建议获取该课程的上课时间生成出行建议课程介绍近五年承担的国家级重大重点项目情况课程表模块设计

03(五)课程表模块:课程输出与录入入口《人工智能程序设计》基于语音生成的行程播报系统输出课程信息show_course

方法遍历课程表,按时间顺序输出时间和课程名称。示例输出:09:00-高等数学创建对象并进入录入创建

Schedule

类对象

schedule_demo调用

init_course(schedule_demo)进入课程录入界面课程录入规则课程名称使用

strip()

去除前后空格输入quit

可以退出课程录入课程名为空时,提示重新输入class

Schedule:

def

show_course(self):

for

time_str,course_infoin

self.schedule.items():

print(f"{time_str}

-{course_info['course_name']}")

from

datetimeimport

datetime,timedeltafrom

courseimport

Schedulefrom

weatherimport

load_config,get_weather,generate_weather_advice

schedule_demo=Schedule()init_course(schedule_demo)

def

init_course(schedule):

#添加课程

while

True:

#输入课程名称,使用strip()去掉前后空格

course_name=input("输入课程名(输入quit退出):").strip()

if

course_name.lower()=='quit':

break

if

not

course_name:

print("课程名不能为空,请重新输入。")

continue代码课程介绍近五年承担的国家级重大重点项目情况课程表模块设计

03(五)课程表模块:时间校验与添加课程《人工智能程序设计》基于语音生成的行程播报系统

#时间格式不对的话需要一直输入,格式:18:30

while

True:

course_time_str=input("输入上课时间(小时:分钟,24小时制):")

try:

#将输入的时间字符串转换为时间对象

course_time=datetime.strptime(course_time_str,"%H:%M").time()

#获取当前时间

current_time=datetime.now().time()

min_time=(

bine(datetime.today(),current_time)

).time()

#判断输入的时间是否晚于当前时间

if

course_time<min_time:

print("输入的时间必须晚于当前时间,请重新输入。")

else:

break

except

ValueError:

print("时间格式不正确,请重新输入(使用小时:分钟格式)。")

#添加课程到课程表

schedule.add_course(course_time,course_name)

#显示课程表schedule_demo.show_course()课程时间处理流程1.输入课程时间用户按“小时:分钟”格式输入如18:302.格式转换使用

datetime.strptime()将字符串转为时间对象3.有效性判断判断输入时间是否晚于当前时间4.添加课程调用schedule.add_course()添加课程到课程表5.显示课程表调用

show_course()输出所有课程24小时制使用英文冒号格式错误则捕获

ValueError若不晚于当前时间提示重新输入按时间排序保存课程信息按时间顺序显示课程代码课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(一)出行建议模块:为什么需要天气API《人工智能程序设计》基于语音生成的行程播报系统模块作用与数据来源出行建议模块需要调用天气网站API获取JSON类型的天气信息。本项目使用“和风天气”的数据。调用“和风天气”的API需要申请免费项目并获取API_KEY。每次请求需要携带API_KEY验证身份。系统选取“实时天气”和“未来两小时每5分钟降水”两类信息。注册账号在和风天气官网注册个人账号。创建免费项目登录后创建免费项目。获取API_KEY在项目中获取专属API_KEY。请求天气数据每次请求API_

KEY,验证身份并获取天气数据。实时天气获取当前时间的天气状况信息。未来两小时每5分钟降水获取未来两小时内每5分钟的降水情况信息。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(二)出行模块建议:组织两个天气接口《人工智能程序设计》基于语音生成的行程播报系统def

get_weather(api_key,city=None,location=None):

#如果city和location都未提供,则抛出异常

if

not

cityand

not

location:

raise

ValueError("必须提供城市代码参数!")

#和风天气的基础API地址

base_url="/v7"

#定义需要查询的API地址

endpoints={

"weather_now":f"{base_url}/weather/now?location={city}&key={api_key}",

"minutely":f"{base_url}/minutely/5m?location={location}&key={api_key}"

if

locationelse

None

}

#遍历API端点,调用fetch_weather_data函数获取数据

results={

key:fetch_weather_data(url)

for

key,urlin

endpoints.items()

if

url

}

#返回包含查询结果的字典

return

results代码get_weather函数作用说明接收api_key、city、location参数若city和location都为空,则抛出异常weather_now接口基于城市代码minutely接口基于经纬度通过字典推导式调用fetch_weather_data获取结果weather_nowminutely课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(二)出行模块建议:api_key、city、location《人工智能程序设计》基于语音生成的行程播报系统用于验证身份,请求天气接口时必须携带通常从配置文件读取api_keycity城市代码例如:大连=101070201用于获取实时天气可从配置文件读取location经纬度信息例如:121.52,38.8用于更准确的分钟级降水查询通常从配置文件读取实时天气主要依赖

city城市代码获取当前天气情况分钟级降水更依赖location经纬度获取未来两小时每5分钟降水信息由于分钟级降水对位置更敏感,因此需要更准确的经纬度信息。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(三)出行建议模块:发送请求与异常捕获《人工智能程序设计》基于语音生成的行程播报系统

代码import

requests

def

fetch_weather_data(url):

try:

#发起HTTPGET请求

response=requests.get(url)

#检查响应状态码是不是200,如果是错误状态码则抛出异常

response.raise_for_status()

#解析并返回响应的JSON数据

return

response.json()

except

requests.exceptions.RequestExceptionas

e:

#捕获请求异常,并打印错误信息

print(f"请求失败:{e}")

return

None

#在请求失败的情况下返回None1.发起请求使用requests.get(url)发起HTTPGet请求2.检查状态码使用raise_for_status()检查响应状态码3.返回JSON请求成功时返回JSON数据4.异常处理请求异常时打印错误并返回None课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(四)出行建议模块:实时天气JSON结构《人工智能程序设计》基于语音生成的行程播报系统{

"code":"200",

"updateTime":"2020-06-30T22:00+08:00",

"now":{

"obsTime":"2020-06-30T21:40+08:00",

"temp":"24",

"feelsLike":"26",

"text":"多云",

"windDir":"东南风",

"windScale":"1",

"humidity":"72",

"precip":"0.0"

}}

JSON实时天气返回结构顶层字段code:状态码updateTime:更新时间now:当前天气信息now字段中的关键信息obsTime:数据观测时间

temp:温度feelsLike:体感温度text:天气描述windDir:风向windScale:风力humidity:湿度precip:降水量后续建议主要关注text→

用于雨雪判断feelsLike→用于温度建议后续建议生成主要依据体感温度与天气现象。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(五)分钟级降水JSON结构《人工智能程序设计》基于语音生成的行程播报系统

JSON分钟级降水返回结构顶层字段code:状态码updateTime:更新时间summary:整体降水概述minutely:逐5分钟降水列表minutely

列表中的关键字段fxTime:预报时间precip:降水量type:降水类型后续建议主要关注minutely→

逐5分钟降水列表summary→

总体降水趋势{

"code":"200",

"updateTime":"2021-12-16T18:55+08:00",

"summary":"95分钟后雨就停了",

"minutely":[

{

"fxTime":"2021-12-16T18:55+08:00",

"precip":"0.15",

"type":"rain"

}

]}系统遍历minutely列表,判断未来两小时内是否有雨雪,并提取对应的预报时间。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(六)JSON解析目标:从天气数据到出行建议《人工智能程序设计》基于语音生成的行程播报系统API返回的JSON不能直接用于后续播报。需要提取影响用户出行的参数。主要参数:体感温度、当前天气文字描述、未来两小时降水信息。输出结果:文字说明和出行建议。1.JSON原始数据API返回的天气数据为JSON格式2.关键信息提取体感温度(feelsLike)当前天气文字描述未来两小时降水信息3.判断规则根据提取的信息匹配出行建议规则4.建议文本输出生成文字说明与出行建议,供播报使用(minutely)(text)课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(七)出行建议模块:体感温度判断《人工智能程序设计》基于语音生成的行程播报系统def

generate_weather_advice(data,course):

#提取当前温度和天气信息

feels_like=data['weather_now']['now']['feelsLike']

#温度建议

temp_advice=""

if

int(feels_like)<8:

temp_advice=f"当前体感温度为{format_temperature(feels_like)}摄氏度,气温较低,请注意保暖。"

elif

int(feels_like)>28:

temp_advice=f"当前体感温度为{format_temperature(feels_like)}摄氏度,气温较高,请注意防暑。"

else:

temp_advice=f"当前体感温度为{format_temperature(feels_like)}摄氏度,气温适宜。"代码低温体感温度<8°C提示:气温较低,请注意保暖高温体感温度>28°C提示:气温较高,请注意防暑适宜8°C–28°C提示:气温适宜课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(八)出行建议模块:当前雨雪判断《人工智能程序设计》基于语音生成的行程播报系统

weather_text=data['weather_now']['now']['text']

#判断当前是否在下雨

weather_advice=""

#判断文字描述信息中有没有“雨”字

if

'雨'

in

weather_text:

weather_advice="当前天气正在下雨,请带伞。"

elif

'雪'

in

weather_text:

weather_advice="当前天气正在下雪,请带伞并穿多点衣服。"代码text字段当前天气文字描述文字描述中是否包含?包含“雨”包含“雪”当前正在下雨请带伞。当前正在下雪请带伞并多穿衣服。如果当前已有雨雪提醒,则后续分钟级降水可以不再处理。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(五)出行建议模块:查找未来雨雪《人工智能程序设计》基于语音生成的行程播报系统

rain_time=None

#存储第一个降水时间点

#找到第一个下雨或者下雪的时间点

for

minutein

data['minutely']['minutely']:

#如果降水量大于0且降水类型是雨或雪

if

float(minute['precip'])>0.00

and

\

(minute['type']=='rain'

or

minute['type']=='snow'):

rain_time=minute

break代码分钟级降水列表data['minutely']['minutely']判断降水量precip>0.00判断降水类型type为rain或snow找到第一个雨雪时间点rain_time=minutebreak(停止遍历)不满足条件继续遍历下一个分钟数据课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(九)出行建议模块:生成未来降水提醒《人工智能程序设计》基于语音生成的行程播报系统

#添加建议

if

rain_timeand

not

weather_advice:

#计算降水时间点与当前时间的差值(单位:分钟)

minutes_later=(

datetime.strptime(rain_time['fxTime'],"%Y-%m-%dT%H:%M:%S")

-datetime.now()

).total_seconds()/60

weather_advice+=(

f"{int(minutes_later)}分钟后可能会下"

f"{'雨'

if

rain_time['type']=='rain'

else

'雪'},请注意带伞。"

)代码判断处理条件rain_time存在且当前没有雨雪提醒解析

fxTime读取rain_time['fxTime']得到未来降水时间点计算minutes_later降水时间点-当前时间换算为分钟差值生成未来降水提醒根据type判断雨/雪,输出“多少分钟后可能会下雨/雪”只有实时天气没有雨雪提醒时,才会继续处理未来两小时降水信息。课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(十)出行建议模块:建议文本整合《人工智能程序设计》基于语音生成的行程播报系统#当前时间now=datetime.now()time_diff_minutes=int((course_time-now).total_seconds()/60)cur_time=(

f"当前时间为{now.strftime('%H点%M分')},"

f"{time_diff_minutes}分钟之后有{course}课。")#汇总所有建议advice=cur_time+temp_advice+weather_adviceif

not

weather_advice:

advice+="未来两小时没有降水,可以不用带伞。"with

open(os.path.join(output_dir,'weather.txt'),'w',encoding='utf-8')as

file:

file.write(advice)代码当前时间now课程倒计时time_diff_minutes温度建议temp_advice降水建议weather_advice建议文本advice写入文件weather.txt若

weather_advice

为空,补充说明:“未来两小时没有降水,可以不用带伞。”当前时间+课程倒计时+温度建议+降水建议=weather.txt课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(十一)yaml配置文件:统一管理API和模型参数《人工智能程序设计》基于语音生成的行程播报系统0#可以换成自己的api_keyapi_key:

"自己的api_key"

#可以添加多个城市,然后进行选择cities:

dalian:

city:

"101070201"

location:"121.52,38.88"

shuangliu:

city:

"101270106"

location:

"103.92,30.57"

#语音合成参数ckpt_base:

"checkpoints/base_speakers/ZH"ckpt_converter:

"checkpoints/converter"reference_speaker:

"resources/ly2.mp3"audio_dir:"outputs/advice.wav"

代码配置文件的作用项目中需要用户控制的参数较多。将参数保存在

yaml配置文件中,便于统一修改。yaml与JSON类似,属于键值对类型的数据格式。可集中管理天气接口与语音合成所需参数。主要配置内容api_key城市代码经纬度模型目录参考音色输出音频路径课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(十二)load_config函数:读取yaml配置《人工智能程序设计》基于语音生成的行程播报系统import

yamldef

load_config(filename):

#打开文件

with

open(filename,'r',encoding='utf-8')as

f:

return

yaml.safe_load(f)

#调用上面定义的函数config=load_config("config.yaml")

#从键值对中获取信息api_key=config["api_key"]city=config["cities"]["shuangliu"]["city"]location=config["cities"]["shuangliu"]["location"]代码config.yamlload_config(filename)api_key天气接口身份验证citylocation城市代码经纬度信息本页要点使用pyyaml读取yaml文件load_config返回字典对象从配置中读取api_key从城市配置中读取city和location课程介绍近五年承担的国家级重大重点项目情况出行建议模块设计

04(十三)出行建议模块:API到weather.txt《人工智能程序设计》基于语音生成的行程播报系统通过配置文件读取API_KEY、城市代码和经纬度。调用实时天气和分钟级降水两个API。使用

requests

请求接口并返回

JSON。提取体感温度、当前雨雪、未来雨雪时间点。生成完整出行建议文本。将建议写入weather.txt,交给语音合成模块。配置weather.txtconfig.yaml/api_key/city/locationAPI请求JSON返回温度判断降水判断实时天气+分钟级降水requests获取天气数据feelsLike→保暖/防暑/适宜当前雨雪+未来雨雪时间点生成完整出行建议文本后续语音合成天气请求→数据解析→规则判断→建议文本输出课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(一)语音合成模块:从weather.txt到语音播报《人工智能程序设计》基于语音生成的行程播报系统语音合成模块涉及深度学习内容,需要配置对应环境。语音合成模型将出行建议文本转化为音频信息。生成音频的音色会转化为用户给出的参考音频音色。本系统使用OpenVoice

预训练模型。这一模块是本章项目实现的重点。OpenVoice预训练模型深度学习环境本章重点weather.txt基础语音合成音色转换advice.wav播放参考音频(参考音色)文本输入→语音生成→音色转换→语音播报课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(二)语音合成模块:OpenVoice预训练模型与核心类《人工智能程序设计》基于语音生成的行程播报系统OpenVoiceBaseClassBaseSpeakerTTS和ToneColorConverter的父类父类子类子类BaseSpeakerTTS基础语音合成模块类ToneColorConverter音色转换模块类音色转换模块类SynthesizerTrn核心神经网络类定义神经网络模块实现基础语音合成实现音色转换函数底层核心支持(调用关系)底层核心支持(调用关系)OpenVoice预训练模型核心结构本模块主要涉及4个核心类,共同完成基础语音合成与音色转换。核心类协同完成:文本转语音音色转换课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(三)语音合成模块:SynthesizerTrn类与核心方法《人工智能程序设计》基于语音生成的行程播报系统SynthesizerTrn定义语音合成模型结构与核心模块编码器提取与编码语音特征流模型建模语音分布变换infer用于语音生成解码器生成目标语音输出残差耦合块支持特征变换与映射voice_conversion用于音色转换核心逻辑:模型结构定义语音生成音色转换课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(四)语音合成模块:infer方法流程《人工智能程序设计》基于语音生成的行程播报系统infer方法以文本为输入,生成基础语音片段该过程不涉及目标音色转换,仅输出通用音色的语音输出结果用于后续的音色转换或直接播放文本编码文本编码器对输入进行编码,得到预测特征和掩码时长预测随机时长预测器和时长预测器预测音频时长路径生成根据时长信息生成音频路径特征变换通过注意力机制对特征进行加权变换加入噪声加入噪声增加生成多样性流模型处理通过流模块处理潜在特征解码输出生成器输出基础语音片段课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(五)语音合成模块:infer文本编码与时长预测《人工智能程序设计》基于语音生成的行程播报系统def

infer(self,x,x_lengths,sid=None,noise_scale=1,

length_scale=1,noise_scale_w=1.,sdp_ratio=0.2,max_len=None):

#对文本进行编码

x,m_p,logs_p,x_mask=self.enc_p(x,x_lengths)

if

self.n_speakers>0:

g=self.emb_g(sid).unsqueeze(-1)

#[b,h,1]

else:

g=None

#预测时长

logw=self.sdp(

x,x_mask,g=g,reverse=True,

noise_scale=noise_scale_w

)*sdp_ratio+self.dp(x,x_mask,g=g)*(1

-sdp_ratio)代码输入文本文本编码器self.enc_p特征x、掩码x_mask(及其他中间量)编码输出说话人IDsid(可选)说话人嵌入self.emb_g(sid)→g([b,h,1])当存在说话人数量(n_speakers>0)时使用随机时长预测器self.sdp(随机性更强)时长预测器self.dp(确定性预测)加权组合预测时长logw=sdp_ratio*sdp+(1-sdp_ratio)*dp预测时长

logw(后续用于生成路径)课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(六)语音合成模块:infer路径生成与解码《人工智能程序设计》基于语音生成的行程播报系统

#计算时长和生成路径

w=torch.exp(logw)*x_mask*length_scale

w_ceil=torch.ceil(w)

y_lengths=torch.clamp_min(torch.sum(w_ceil,[1,2]),1).long()

y_mask=torch.unsqueeze(commons.sequence_mask(y_lengths,None),1).to(x_mask.dtype)

attn_mask=torch.unsqueeze(x_mask,2)*torch.unsqueeze(y_mask,-1)

attn=commons.generate_path(w_ceil,attn_mask)

#特征变换

m_p=torch.matmul(attn.squeeze(1),m_p.transpose(1,2)).transpose(1,2)

logs_p=torch.matmul(attn.squeeze(1),logs_p.transpose(1,2)).transpose(1,2)

#噪声加入

z_p=m_p+torch.randn_like(m_p)*torch.exp(logs_p)*noise_scale

#使用流模型进行处理

z=self.flow(z_p,y_mask,g=g,reverse=True)

#使用解码器解码成音频

o=self.dec((z*y_mask)[:,:,:max_len],g=g)

return

o,attn,y_mask,(z,z_p,m_p,logs_p)

代码时长计算w、w_ceil生成掩码y_mask、attn_mask路径生成commons.generate_path→attn

特征变换m_p、logs_p加权变换噪声加入得到z_p流模型处理self.flow解码输出self.dec→音频o课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(七)语音合成模块:voice_conversion流程《人工智能程序设计》基于语音生成的行程播报系统将infer生成的语音转换为参考音频的目标音色。输入:语音特征y、源音色sid_src、目标音色sid_tgt。通过归一化与逆向变换在不同音色空间之间映射。输出:目标音色语音特征o_hat,以及y_mask供后续解码对齐使用。源语音特征

y源音色

sid_src目标音色

sid_tgt编码编码源语音特征y_mask特征有效位置掩码z源音色归一化在源音色条件下进行归一化变换z_p目标音色逆变换在目标音色条件下进行逆向变换z_hat解码解码得到目标语音特征目标音色语音o_haty_mask

特征有效位置掩码隐变量流转:zz_pz_hat潜在表示归一化后潜在逆变换后潜在课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(八)语音合成模块:voice_conversion核心代码《人工智能程序设计》基于语音生成的行程播报系统def

voice_conversion(self,y,y_lengths,sid_src,sid_tgt,tau=1.0):

#sid_src为源音色信息,sid_tgt为参考音频音色信息

g_src=sid_src

g_tgt=sid_tgt

#编码源语音特征,提取潜在表示z,并计算其均值

m_q和对数方差logs_q

z,m_q,logs_q,y_mask=self.enc_q(

y,y_lengths,

g=g_srcif

not

self.zero_gelse

torch.zeros_like(g_src),

tau=tau

)

#在源音色条件下,使用流模型生成z_p

z_p=self.flow(z,y_mask,g=g_src)

#在目标音色条件下,使用流模型逆向变换生成z_hat

z_hat=self.flow(z_p,y_mask,g=g_tgt,reverse=True)

#使用解码器将z_hat转换为目标音色的语音特征

o_hat=self.dec(

z_hat*y_mask,

g=g_tgtif

not

self.zero_gelse

torch.zeros_like(g_tgt)

)

return

o_hat,y_mask,(z,z_p,z_hat)代码sid_src

(源音色)sid_tgt(目标音色)语音特征yenc_q编码提取潜在表示zy_mask(掩码)zflow(源音色条件)z_pflow(reverse=True)(目标音色条件)z_hatdec解码o_hat

目标音色特征

sid_src:源音色sid_tgt:目标音色enc_q:编码源语音特征dec:解码目标音色语音特征课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(九)语音合成模块:OpenVoiceBaseClass与模型加载《人工智能程序设计》基于语音生成的行程播报系统import

osimport

torchfrom

openvoiceimport

se_extractorfrom

openvoice.apiimport

BaseSpeakerTTS,ToneColorConverter

ckpt_base='checkpoints/base_speakers/ZH'ckpt_converter='checkpoints/converter'device="cuda:0"

if

torch.cuda.is_available()else

"cpu"output_dir='outputs'

base_speaker_tts=BaseSpeakerTTS(

f'{ckpt_base}/config.json',

device=device)base_speaker_tts.load_ckpt(f'{ckpt_base}/checkpoint.pth')

tone_color_converter=ToneColorConverter(

f'{ckpt_converter}/config.json',

device=device)tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')

os.makedirs(output_dir,exist_ok=True)代码基础语音合成模型(BaseSpeakerTTS)音色转换器(ToneColorConverter)checkpoints/base_speakers/ZHconfig.jsoncheckpoint.pth加载加载config.jsoncheckpoint.pthToneColor-Converter

对象BaseSpeaker-TTS对象生成音频等结果生成音频等结果outputs/输出目录课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(十)语音合成模块:get_text与文本张量化《人工智能程序设计》基于语音生成的行程播报系统def

get_text(text,hps,is_symbol):

#使用text_to_sequence将输入的文本转换为序列

text_norm=text_to_sequence(

text,

hps.symbols,

[]if

is_symbolelse

hps.data.text_cleaners

)

#如果配置中要求添加空白符,则在序列中间插入空白符

if

hps.data.add_blank:

text_norm=ersperse(text_norm,0)

#将文本序列转换为LongTensor类型,适用于PyTorch处理

text_norm=torch.LongTensor(text_norm)

#返回处理后的文本序列

return

text_norm代码输入文本

BaseSpeakerTTS文本输入标准序列

text_to_sequence转换为标准序列插入空白符若hps.data.add_blank则com-ersperse(text_norm,0

张量化输出

torch.LongTensor得到模型可处理张量课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(十一)语音合成模块:音频片段拼接与停顿《人工智能程序设计》基于语音生成的行程播报系统defaudio_numpy_concat(segment_data_list,sr,speed=1.):

#创建一个空列表,用于存储所有音频片段的数据

audio_segments=[]

#遍历每个音频片段,展平并将其添加到audio_segments列表中

forsegment_datainsegment_data_list:

audio_segments+=segment_data.reshape(-1).tolist()

#在音频片段后添加一个空白间隔,间隔时长为0.05秒

audio_segments+=[0]*int((sr*0.05)/speed)

#将列表转换为NumPy数组,并确保数据类型为float32

audio_segments=np.array(audio_segments).astype(np.float32)

#返回拼接后的音频数据

returnaudio_segments代码多个句子音频片段拼接示意句子1音频

静音0.05秒句子2音频

静音0.05秒句子N音频完整音频(拼接结果)1.展平为一维列表2.添加0.05秒静音3.转为NumPy数组课程介绍近五年承担的国家级重大重点项目情况语音合成模块

05(十二)语音合成模块:tts方法生成基础语音《人工智能程序设计》基于语音生成的行程播报系统tts是BaseSpeakerTTS的核心方法输入文本待播报建议文本语言标记根据指定语言获取标记符分句处理将长文本切分为短句get_text规范化并转为模型输入infer推理模型推理生成音频

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论