语音识别与克隆算法(一)

简介: 语音识别与克隆算法(一)

百度语音简介


百度语音是百度AI开放平台提供的一个在线识别语音引擎。和前面介绍的图形识别一样,都是通过对API的引用,利用百度AI提供的接口进行实现。目前支持的语音包括普通话,粤语,四川话和英语等。利用百度语音进行在线识别的时候,需要上传完整的录音文件,而且语音文件市场不得超过60s。


百度语音提供两种识别模型:搜索模型与输入法模型。搜索模型实现效果如同百度搜索的语音输入,适合短语识别场景,中间有逗号。在应用普通话搜索模型时,也可识别简单的常用英语语句。


百度语音适用于目前追u的多种操作系统和多种编程语言,只要可以对百度语音服务器发起HTTP请求,均可以使用接口。其所支持的语言格式包括:PCM(不压缩),WAV(不压缩,PCM编码),AMR(压缩)。由于百度语音底层识别使用的是PCM编码,因此“.pcm”文件。如果上传文件为其他格式,则会在服务器端被转码为PCM格式,调用接口的耗时会增加。


获取Access Token


使用语音识别及合成的REST API需要获取Access Token。Access Token是用户身份验证和授权的凭证。获取Access Token需要用户在应用管理界面中新建应用,然后在应用列表中即可查看。


语音识别采用的是Client Credentials 授权方式,即应用公钥,密钥获取Access Token,适用于任何带Server类型的应用。通过此授权方式获取Access Token仅可访问平台授权类的接口。


选择HTTP POST亲求格式


如果你的音频文件在本地,可以以JSON和RAW两种格式提交,需要将音频数据放在body中。这两种提交方式,均不属于浏览器表单的提交。


若以JSON格式上传本地文件,则读取Base64编码的二进制音频文件内容,放在speech参数内。使用RAW格式,header:Content-Length的值即音频文件的大小。由于使用RAW方式,采样率和文件格式需要填写在Content-Type中,例如,Content-Type:audio/pcm;rate=16000.


以上两种提交方式都返回统一的结果,并采用JSON格式进行封装。如果识别成功,则识别结果放在JSON的“result”字段中。如果使用(url,callback)方式进行POST请求,百度服务器会回调用户服务器的callback地址。


百度语音识别返回的结果参数


参数

数据类型

是否必填

描述

err_no

int

错误码

err_msg

String

错误码描述

sn

String

语音数据唯一标识

result

Array([String,String,...])

识别结果数组,提供1~5个候选结果

百度语音识别


百度语音识别Python SDK


百度语音 识别Python SDK和REST API功能一致,需要联机在线调用HTTOP接口。前面我们已经介绍过如何创建应用,如何获取账号密钥,这里就不过多介绍了。下面我们介绍一下AipSpeech进行语音识别的示例代码:


from aip import AipSpeech
APP_ID='30847447'
APP_KEY='OEMasN3dTxtq2Pr55duK8qzw'
SECRET_KEY='n7gKdf7VMsz8QEfw0VBZCWG6xdX72qII'
client=AipSpeech(APP_ID,APP_KEY,SECRET_KEY)
def get_file_content(filepath):
    with open(filepath,'rb')as fp:
        return fp.read()
result=client.asr(get_file_content('./test.wav'),'wav',16000,{'dev_pid':1536})
print(result)
{'err_msg': 'request pv too much', 'err_no': 3305, 'sn': '204379690881677639467'}


该结果显示,示例语音识别成功。Python SDK语音识别函数原型为client.asr(speech,format,rate,cuid,dev_pid) ,其参数描述如下:

语音识别函数接口参数及其描述


参数

数据类型

是否必须

描述

speech

buffer

建立包含语音类容的Buffer对象,语音文件的格式为.wav,.pcm,.AMR.不区分大小。

format

string

语音文件的格式为.PCM,.WAV或者.AMR.不区分大小写。

rate

int

采样率,16000,固定值

cuid

string

用户唯一标识,用来区分用户,填写计算机MAC地址或IMEI码

dev_pid

int

默认为1537(普通话)

dev_pid参数及其描述


dev_pid

语言

模型

是否有标点

备注

1536

普通话(支持简单的语音识别)

搜索模型

支持自定义词库

1537

普通话(纯中文识别)

输入法模型

不支持自定义词库

1637

粤语  


不支持自定义词库

1737

英语


不支持自定义词库

1837

四川话


不支持自定义词库

1936

普通话远场

远场模型

不支持自定义词库

基于语音识别的视频文本提取


视频文本信息是视频内容的重要线索,他对视频分段,视频检索和信息摘要等视频自动化处理有着重要的意义。利用AipSpeech语音识别引擎,我们可以很方便地从一个给定的视频文件中提取出其中的语音信息并转化为对应的语言文本。对于音频格式,百度语音识别API对其参数,格式等几个方面有着明确的要求。


①参数:单声道,16000采样率,16bit深度。


②格式:PCM(不压缩),WAV(不压缩,PCM编码)以及AMR(压缩)。


③其他:完整语音文件,不得超过60秒。


视频文本的提取,主要包括视频转化为音频,音频切割分段,以及从音频中提取文本等几个主要步骤。


从视频转换为所需格式的音频可采用第三方软件来实现,例如,FFmpeg音视频转换软件。因百度API最多支持60s时常的语音识别,我们必须将时长为60s以上的音频文件进行分段,然后进行语音识别,在综合处理输出结果文本。其中,从音频中提取文本,可以利用AipSpeech语音识别引擎来实现。


12db36bc7062f1bc479b1156eb7f0001_15122d1092ae4a5fbec63c27b055fbad.png


在开始编写代码之前,我们需要安装准备好用于音视频转换以及音频分割以及音频分割等相关操作的辅助工具。FFmpeg工具。FFmpeg分为3个版本:Static,Shared和Dev。前两个版本可以直接在命令行中使用,包含3个可执行文件:ffmpeg.exe,ffplay.exe,ffprobe.exe。Static版本中的可执行文件较大,因为相关的动态链接库都已经编译进可执行文件中。Shared版本则小很多,因为在他们运行的时候,还需要相关的动态链接库中调用相应的功能。


下载过后,将其中的bin目录添加到系统变量中“Path”。然后打开控制台,输入ffmpeg命令来运行程序,若无出错信息,则表示配置成功。


那么在python中如何调用FFmpeg喃?


那就需要利用安装命令安装即可。


pip install ffmpy3


以下示例代码实现了从视频文件到指定格式音频文件的转换:


def Video2Audio(file):
    inputfile=file #输入的视频文件
    file_type=file.split('.')[-1]
    outputfile=inputfile.replace(file_type,'wav') #将原视频文件扩展为.wav作为文件名
    ff=FFmpeg(inputs={inputfile:None},global_options=['-y'], #全局参数,'-y'指的是允许覆盖已有文件
            outputs={outputfile:'-vn -ar 16000 -ac 1 -ab 192 -f wav'}  )
    ff.cmd  #打包FFmpeg命令
    ff.run() #执行FFmpeg命令
    return outputfile


获取指定格式的音频文件,需要对其进行音频分割以满足百度语音识别API的处理要求。音频分割的关键是找出每段音频的起始点和结束点。为此,我们需要先获取整个音频文件的总长度,然后以60s文件间隔进行切分,计算出每段音频开始和结束的秒数,并分割为不同的文件进行保存。


def AudioSplit(file):
    inputfile=file #输入文件
    path=os.path.dirname(file)+'./wavefiles/' #指定分割后音频文件的保存目录
    path='./wavefiles'
    print("Audio files segmented into",path)
    wav_len=int(float(mediainfo(inputfile)['duration'])) #获取音频文件时长
    wave=AudioSegment.from_mp3(inputfile)  #音频源文件加载
    seg_file_list=list()
    if wav_len>60:
        n=wav_len//60
        if n*60<wav_len:
            n+=1
    for i in range(n):
        start_time=i*60*1000+1
        END_TIME=(i+1)*60*1000
        if END_TIME>wav_len*1000:
            END_TIME=wav_len*1000
        seg=wave[start_time:END_TIME]
        seg_audio_filename='{}segaudio_{}.wav'.format(path,i)
        seg.export(seg_audio_filename,format='wav')
        seg_file_list.append(seg_audio_filename)
    return seg_file_list


音频分割文件完成后,我们将进入文本提取这个重要环节。l利用AipSpeech语音识别引擎,可轻松实现对语音文件进行文本提取。示例代码如下:


'''
音频撰文本函数
通过Baidu AI提供的ASR SDK对音频文件进行语音识别,并返回识别的文本。
'''
def Audio2Text(wavfile):
    #定义一个用于读取本地音频文件的函数
    def get_file_content(filepath):
        with open(filepath,'rb') as fp:
            return fp.read()
    APP_ID='30847447'
    APP_KEY='OEMasN3dTxtq2Pr55duK8qzw'
    SECRET_KEY='n7gKdf7VMsz8QEfw0VBZCWG6xdX72qII'
    client=AipSpeech(APP_ID,APP_KEY,SECRET_KEY)
    result=client.asr(get_file_content(wavfile),'wav',16000,{'dev_pid':1737})
    return result


对多个音频文件进行文本提取后需要合并得到最终结果。


def TextMerging():
    seg_audio_file_dir="./wavefiles/"
    files=os.listdir(seg_audio_file_dir) #遍历目录下的所有文件
    content=""
    for file in files:
        segaudiofile=seg_audio_file_dir+file
        txt=Audio2Text(segaudiofile)
        content+=str(txt)
    return content


运行该程序,除了少数的文本与原视频不同,但是 大多数都很准确。由于对音频分割时,会存在某一个读音被切分在相邻两端音频中的情况,从而在音频到文字的转换阶段产生一定的误差。采取按照语音停顿方式进行分割。


from pydub.silence import split_on_silence
chunks=split_on_silence(sound,min_silence_len=700,silence_thresh=-70)


上述代码中的silence_thresh为语音停顿识别阈值。通过该设定的阈值,我们可以将小于-70dBFS的音频信号是为静音(Silence),而且,当小于-70dBFS的信号超过700ms,则进行语音分割。

相关实践学习
达摩院智能语音交互 - 声纹识别技术
声纹识别是基于每个发音人的发音器官构造不同,识别当前发音人的身份。按照任务具体分为两种: 声纹辨认:从说话人集合中判别出测试语音所属的说话人,为多选一的问题 声纹确认:判断测试语音是否由目标说话人所说,是二选一的问题(是或者不是) 按照应用具体分为两种: 文本相关:要求使用者重复指定的话语,通常包含与训练信息相同的文本(精度较高,适合当前应用模式) 文本无关:对使用者发音内容和语言没有要求,受信道环境影响比较大,精度不高 本课程主要介绍声纹识别的原型技术、系统架构及应用案例等。 讲师介绍: 郑斯奇,达摩院算法专家,毕业于美国哈佛大学,研究方向包括声纹识别、性别、年龄、语种识别等。致力于推动端侧声纹与个性化技术的研究和大规模应用。
相关文章
|
4月前
|
机器学习/深度学习 算法 TensorFlow
【深度学习】深度学习语音识别算法的详细解析
深度学习语音识别算法是一种基于人工神经网络的语音识别技术,其核心在于利用深度神经网络(Deep Neural Network,DNN)自动从语音信号中学习有意义的特征,并生成高效的语音识别模型。以下是对深度学习语音识别算法的详细解析
202 5
|
4月前
|
机器学习/深度学习 人工智能 算法
【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系
深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例
57 4
|
4月前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
117 2
|
5月前
|
机器学习/深度学习 算法 数据可视化
Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战
Python基于librosa和人工神经网络实现语音识别分类模型(ANN算法)项目实战
|
机器学习/深度学习 存储 人工智能
语音识别与克隆算法(二)
语音识别与克隆算法(二)
312 0
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
116 80
|
1天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
23天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
9天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。
|
16天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。

热门文章

最新文章