实验3语音合成及语音对话机器人实验_第1页
实验3语音合成及语音对话机器人实验_第2页
实验3语音合成及语音对话机器人实验_第3页
实验3语音合成及语音对话机器人实验_第4页
实验3语音合成及语音对话机器人实验_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

实验3语音合成及语音对话机器人实验

目录

一、实验目的...........................................................1

二、实验原理...........................................................1

三、知识要点...........................................................1

四、实验步3聚...........................................................1

(1)环境配置........................................................1

(2)实验前准备......................................................2

⑶代码架构(关键API说明,参数,调用方法).........................3

五、将上述发音模块应用到人机对话机器人中.............................7

5.1发音模块简单应用到对话机器人中....................................7

5.2添加语音唤醒功能的对话机器人......................................8

7\>演示..............................................................11

一、实验目的

•调用科大讯飞语音合成接口将文本合成语音文件。

•将上述完成的发音模块整合到实验二中。

•实现语音唤醒的人机对话系统。

二、实验原理

三、知识要点

Python的request库可以发送网络请求,返回一个request对象,我们可以从这个对象

中获取所有我们想要的信息;

Python的simplaudio库为OSX、Windows和Linux上的Python3提供跨平台、无依赖性的音频

播放功能。

四、实验步骤

(1)环境配置

1.安装pyhton3以上版本。(参考实验环境安装教程文件夹)

2.安装python集成开发环境(IDE),pycharm>spyder都可以,本实验以pycharm为例。

(参考实验环境安装教程文件夹)

3.在该python环境下安装必要的调用库(本实验包括:requesl,simpleaudio)。(参考实

验环境安装教程文件夹)

(2)实验前准备

1.在科大讯飞开放平台()上注册账号;

2.在控制台上创建应用

|创建应用

◎应用管理

・应用名称,人

我的应用

创建应用・应用分类应用-通讯社交-聊天社交

AIUI餐能硬件

,应用功能板述实现语音转写

SDKT栽

©财务中心

账户

♦应用平台WebAPI

充值

优惠券

我已阅读并接受三飞下二次务法议

购物生

订单者理

3

同田a中心

3.将要添加的功能(如语音听写、在线语音合成)添加到刚创建的应用里,并将本地ip添

加到白名单。

APPID

开的9

webAPiI

5C78CO5201SO>01142141

应用・iRWH:社交

同请官听写国在线合成

O»®«9ifig。*号・]

今日mi*务量时拿•务量?亍《#■◊日女射・穷量***考量

••••第第IF宣•••••MMMt

IP臼宫・APiKeyAPiKey

用例行分4*个

ir.±M5tir,HU个-=

Ads(sms8k)■蠹smselGM

居加999*演:*3F9W&1«时1«刀然送行中了方举1

4.获得你的账号APPTD和应用APIKeyo

⑶代码架构(关键API说明,参数,调用方法)

代码解释

classttsPlayer():

XiaoXin='x_xiaoxin'

ZhiLin="x_zhilin'

XiaoWanZi='x_xiaowanzi'

XiaoYan='xiaoyan'

XiaoFang='x_xiaofang'

#发音人列表,可在在线语音合成功能里选择你想要的发音人。

def_init_(self,accountList=[{'APPID':'5c25dl70',,API_KEY,:Hbcfd3a9ee3

2bOcc5fd6f3e53fc()et73d")],speaker-xiaoyan'):

#以下是需要设置的信息,如你的账号信息,你所希望的发音人代号。

=""

#科大讯飞开放平台URL

="raw”

er=speaker

#可选择发音人

ntList=accountList

#你的科大讯飞开放平台的账号

le(ntList)

ntldx=0

=ntList[ntIdx]['APPID,]

_KEY=ntListlntldxJl'APLKEY']

defgetHeader(self):

#得到(URL,header,data)里面header信息。

curTime=str(int(()))

#ttp=ssml

param=++H\n,\nauf\n:\"audio/TJ6;rate=16000V1,Vvoice_nam

e\',:\,,"+er+"\'\\,'engine_type\":\nintp65\n)n

prinl(nparam:{}".format(param))

paramBase64=str(base64.b64cncode(e('utf-8,)),'utf-8')

print(nx_param:{}M.format(paramBase64))

m2-5()

m2.update((_KEY+curTime+paramBase64).encode('utf-8'))

checksum=m2.hexdigest()

print('checkSum:{I'.formatCcheckSum))

header={

'X-CurTimc':curTime,

'X-Param*:paramBase64,

'X-Appid,:,

'X-CheckSum':checksum,

'Content-Type':'application/x-www-form-urlencoded;charset=uif-8\

)

print(header)

returnheader

defgetBody(self,text):

#将文本数据转换成字典形式传入到()里。

data={'text':text|

returndata

defswitchAccount(self):

#添加多账号选择,可以提高功能调用次数。

ntldx=(ntldx+1)%len(ntList)

=ntListtntldxlfAPPID']

_KEY=ntList[ntIdx]['API_KEY']

defgetContent(self,text):

#通过向科大讯飞开放平台URL发送网络请求,返回requesi对象,对象里

包含我们需要的音频文件r.contento

content=b"

r=(,headers=ader(),data=dy(text))

#通过向科大讯飞开放平台URL发送网络请求,返回request对象,对象里

包含我们需要的音频文件r.conlenl

print(r)

contentType=r.headers['Content-Type']

print(r.headers)

ifcontentType==^audio/mpeg":

hAccount()

sid=r.headers[*sid']

if=="raw”:

returnr.content

else:

contentDict=eval(e(r.content))

if(contentDictf'desc']=='illegalparameter!illegaltextlength'):

sequences=(text;。')

sequences=[wordforwordinsequencesifword!-']

textl='o\join(sequences[:int(len(sequences)/2)])

text2='.join(sequences[int(len(sequences)/2):])

if(textI==u):

textl=text[:len(text)/2J

text2=text[len(text)/2:]

try:

content+=ntent(textl)

except:

print(*enor:whenprint\textl)

content+=ntent(text2)

except:

print('error:whenprint',text2)

print(r.contcnt)

returncontent

classmyThread(d):

#创建线程,这个线程来执行语音合成。

def—init_(self,threadlD,content):

d._init_(self)

dID=threadID

nt-content

defrun(self):

print("开始线程:”+)

sa.play_buffer(nt,I,2,16000)

#调用_bufTer来播放音频信息

print("退出线程:"+)

defttsPlay(self,text):

content=ntent(text)

(0.3)

printCcontent*,content)

if(content!="):

thread1=ead('Thrcad2,,content)

0

#调用线程

hAccount()

if—name—=="—main—”:

ttsp=ttsPlayer()

ay("我是机器人Alice")

(2)

表3.lttS—代码解析

五、将上述发音模块应用到人机对话机器人中

5.1发音模块简单应用到对话机器人中

首先,建立一个新的py文件,用来写人机对话的主要逻辑以及调用发音模块。

然后添加如下代码:

#实验三用语音输出代替文字输出

ttsplayer=tts_ayer(accountList=[{'APPID1:1',,API_KEY,:M")])

er=an

这里需要填入自己注册的科大讯飞语音库中的APPID和API_KEY(具体位置上一个

实验中已说明并使用过)。

完整代码演示及解释如下:

inportrecord

importspeach_recognize

importaiml

importos

importtts_Player

importtime

,实验一构建中文聊天机器人代码

mybot_path='./mybot'

os.chdir(mybot_path)

mybot=aiml.Kernel()

mybot.learn("std-startup.xml")

mybot.respond('loadaimlc')

,实验二用语音输入代替文字输入

myrecorder=record.reccrdor()*录音对象

#输入科大讯飞统一平台的APPID和对应语音识别的APIJCER

Isr=speach_recognize.speachRecognizer(

accountList-[('APPID*:'1,'API_KEY':'')])

,实验三用语音输出代替文字输出

ttsplayer=tts_Player.ttsPlayer(accountList=[('APPID':'','API_KEY':"")])

ttsplayer.speaker=ttsplayer.XiaoYan

AwhileTrue:

print「>>>请输入您的问题?输入回车键开始录音~\n”)

input()

myrecorder.save_reccrd()#开始录音持续大约10秒

sr.setAudiFile('audio.wav')#生成audio.wav录音文件

question-sr.getResponse()#调用科大讯飞的API识别audio.wav录音,转译成对应的文字

respond=mybot.respond(question[:-1])#聊天机器人进行回答

ttsplayer.ttsPlay(respond)

这样代码就实现了,点击程序运行,然后根据提示握下回车键开始录音,录音10秒后

自动停止。

5.2添加语音唤醒功能的对话机器人

语音唤醒原理

因为语音是一种空气机械振动波,在语音拾取器上表现为一维的语音信号,即随时

间变化的电平值,因此可以通过持续读取语音拾取器的电平数值来判断是否有有效的

语音输入,并以此作为是否启动语音识别的依据。如果语音信号强度值大于一定阈值,

则自进入语音识别阶段,从而实现语音唤醒功能C

首先写语音唤醒模块,编程程序一直检测当收到的电平达到15000的时候开始进

行录音(在程序中的THRESHOLD=15000可以自己设置)录音等待6秒结束,然后把

录音文件保存起来。

具体代码实现如下

defMonitor():

CHUNK=1024

FORMAT=pyaudio.palntl6

CHANNELS=1

RATE=8000

RECORD_SECONDS=1

WAVE_OUTPUT_FILENAME='monitor_tmp.wav'

THRESHOLD="15000|

p=pyaudio.PyAudio()

stream=p.open(format=FORMAT,

channels=CHANNELS,

rate=RATE,

input=True,

frames_per_buffer=CHUNK

)

print('start_to_play_buffer*)

frames=[]

whileTrue:

print('begin')

foriinrange(3):

data=stream.read(CHUNK)

frames.append(dat.a)

audio_data=np.fromstring(data,dtype=np.short)

large_sample_count=np.sum(audio_data>THRESHOLD)

temp=np.max(audio_data)

print(temp)

iftemp>THRESHOLD:

print('FINDSIGNAL!')

print('STRENGTH:',temp)

time.sleep(l)

break

stream.stop_stream()

stream.close()

p.terminate()

wf=wave.open(WAVE_OUTPUT_FILENAME,'wb')

wf.setnchannels(CHANNELS)

wf.setsampwidth(p.get_sample_size(FORMAT))

wf.setframerate(RATE)

wf.writeframes(b',.join(frames))

wf.close()

returnTrue

然后在原来实验二的基础上编写main函数逻辑,具体实现代码及解释如下:

if_name_=='_main_

#实验一构建中文聊天机器人代码

mybot_path="C:\\Users\\27379\Desktop\chatbot_can_do2'

os.chdir(mybot_path)

mybot=1()

温馨提示

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

评论

0/150

提交评论