镀镍的英文译语怎么说-乡亲的拼音
2023年3月31日发(作者:土豆网电视剧)
声纹识别开源框架python_GitHub-yeyupiaolingVoiceprintR。
。。
前⾔
本章介绍如何使⽤Tensorflow实现简单的声纹识别模型,⾸先你需要熟悉⾳频分类,没有了解的可以查看这篇⽂章《基于Tensorflow实现
声⾳分类》。基于这个知识基础之上,我们训练⼀个声纹识别模型,通过这个模型我们可以识别说话的⼈是谁,可以应⽤在⼀些需要⾳频验
证的项⽬。
环境准备
主要介绍libsora,PyAudio,pydub的安装,其他的依赖包根据需要⾃⾏安装。
Python3.7
Tensorflow2.0
安装libsora
最简单的⽅式就是使⽤pip命令安装,如下:
pipinstallpytest-runner
pipinstalllibrosa
pipinstallpytest-runner
tarxzflibrosa-.或者unziplibrosa-.
cdlibrosa-/
all
如果出现\':error0x7e错误,请指定安装版本0.6.3,如pipinstalllibrosa==0.6.3
安装PyAudio
使⽤pip安装命令,如下:
pipinstallpyaudio
安装pydub
使⽤pip命令安装,如下:
pipinstallpydub
创建数据
本教程笔者使⽤的是FreeSTChineseMandarinCorpus数据集,这个数据集⼀共有855个⼈的语⾳数据,有102600条语⾳数据。如果
读者有其他更好的数据集,可以混合在⼀起使⽤。
如何已经读过笔者《基于Tensorflow实现声⾳分类》这篇⽂章,应该知道语⾳数据⼩⽽多,最好的⽅法就是把这些⾳频⽂件⽣成
TFRecord,加快训练速度。所以创建create_⽤于⽣成TFRecord⽂件。
⾸先是创建⼀个数据列表,数据列表的格式为,创建这个列表主要是⽅便之后的读取,也是⽅便读取使⽤其他的语⾳数据集,不同的语⾳数
据集,可以通过编写对应的⽣成数据列表的函数,把这些数据集都写在同⼀个数据列表中,这样就可以在下⼀步直接⽣成TFRecord⽂件
了。
defget_data_list(audio_path,list_path):
files=r(audio_path)
f_train=open((list_path,\'train_\'),\'w\')
f_test=open((list_path,\'test_\'),\'w\')
sound_sum=0
s=set()
forfileinfiles:
if\'.wav\'notinfile:
continue
(file[:15])
sound_path=(audio_path,file)
ifsound_sum%100==0:
f_(\'%st%dn\'%(sound_e(\'\',\'/\'),len(s)-1))
else:
f_(\'%st%dn\'%(sound_e(\'\',\'/\'),len(s)-1))
sound_sum+=1
f_()
f_()
if__name__==\'__main__\':
get_data_list(\'dataset/ST-CMDS-20170001_1-OS\',\'dataset\')
有了上⾯创建的数据列表,就可以把语⾳数据转换成训练数据了,主要是把语⾳数据转换成梅尔频谱(MelSpectrogram),使⽤librosa可
以很⽅便得到⾳频的梅尔频谱,使⽤的API为ctrogram(),输出的是numpy值,可以直接⽤tensorflow训练和预
测。关于梅尔频谱具体信息读者可以⾃⾏了解,跟梅尔频谱同样很重要的梅尔倒谱(MFCCs)更多⽤于语⾳识别中,对应的API为
()。在转换过程中,笔者还使⽤了裁剪掉静⾳部分的⾳频,这样可以减少训练数据的噪声,提供
训练准确率。笔者⽬前默认每条语⾳的长度为2.04秒,这个读者可以根据⾃⼰的情况修改语⾳的长度,如果要修改训练语⾳的长度,需要
根据注释的提⽰修改相应的数据值。如果语⾳长度⽐较长的,程序会随机裁剪20次,以达到数据增强的效果。
#获取浮点数组
def_float_feature(value):
ifnotisinstance(value,list):
value=[value]
e(float_list=ist(value=value))
#获取整型数据
def_int64_feature(value):
ifnotisinstance(value,list):
value=[value]
e(int64_list=64List(value=value))
#把数据添加到TFRecord中
defdata_example(data,label):
feature={
\'data\':_float_feature(data),
\'label\':_int64_feature(label),
}
e(features=es(feature=feature))
#开始创建tfrecord数据
defcreate_data_tfrecord(data_list_path,save_path):
withopen(data_list_path,\'r\')asf:
data=nes()
rdWriter(save_path)aswriter:
fordintqdm(data):
try:
path,label=e(\'n\',\'\').split(\'t\')
wav,sr=(path,sr=16000)
intervals=(wav,top_db=20)
wav_output=[]
#[可能需要修改参数]⾳频长度16000*秒数
wav_len=int(16000*2.04)
forslicedinintervals:
wav_(wav[sliced[0]:sliced[1]])
foriinrange(20):
#裁剪过长的⾳频,过短的补0
iflen(wav_output)>wav_len:
l=len(wav_output)-wav_len
r=t(0,l)
wav_output=wav_output[r:wav_len+r]
else:
wav_((shape=[wav_len-len(wav_output)],dtype=32))
wav_output=(wav_output)
#转成梅尔频谱
ps=ctrogram(y=wav_output,sr=sr,hop_length=256).reshape(-1).tolist()
#[可能需要温庭筠菩萨蛮十四首 修改参数]梅尔频谱shape,ctrogram(y=wav_output,sr=sr,hop_length=256).shape
iflen(ps)!=128*128:continue
tf_example=data_example(ps,int(label))
(tf_izeToString())
iflen(wav_output)<=wav_len:
break
exceptExceptionase:
print(e)
if__name__==\'__main__\':
create_data_tfrecord(\'dataset/train_\',\'dataset/rd\')
create_data_tfrecord(\'dataset/test_\',\'dataset/rd\')
在上⾯已经创建了TFRecord⽂件,为了可以在训练中读取TFRecord⽂件,创建程序⽤于读取训练数据,如果读者已经修改了训
练数据的长度姆组词语 ,需要修改enFeature中的值。
def_parse_data_function(example):
#[可能需要修改参数】设置的梅尔频谱的shape相乘的值
data_feature_description={
\'data\':enFeature([16384],32),
\'label\':enFeature([],64),
}
_single_example(example,data_feature_description)
deftrain_reader_tfrecord(data_path,num_epochs,batch_size):
raw_dataset=rdDataset(data_path)
train_dataset=raw_(_parse_data_function)
train_dataset=train_e(buffer_size=1000)
.repeat(count=num_epochs)
.batch(batch_size=batch_size)
.prefetch(buffer_size=NE)
returntrain_dataset
deftest_reader_tfrecord(data_path,batch_size):
raw_dataset=rdDataset(data_path)
test_dataset=raw_(_parse_data_function)
test_dataset=test_(batch_size=batch_size)
returntest_dataset
训练模型
创建开始训练模型,搭建⼀个ResNet50分类模型,input_shape设置为(128,None,1))主要是为了适配其他⾳频长度的输⼊和预
测是任意⼤⼩的输⼊。class_dim为分类的总数,FreeSTChineseMandarinCorpus数据集⼀共有855个⼈的语⾳数据,所以这⾥分类
总数为855,可以使⽤之前训练过的权重初始化模型,下载看⽂章最后。
class_dim=855
EPOCHS=500
BATCH_SIZE=32
init_model=\"models/model_weights.h5\"
model=tial([
50V2(include_top=False,weights=None,input_shape=(128,None,1)),
tyRegularization(l2=0.5),
t(rate=0.5),
MaxPooling2D(),
(units=class_dim,activation=x)
])
y()
#定义优化⽅法
optimizer=(learning_rate=1e-3)
train_dataset=_reader_tfrecord(\'dataset/rd\',EPOCHS,batch_size=BATCH_SIZE)
test_dataset=_reader_tfrecord(\'dataset/rd\',batch_size=BATCH_SIZE)
ifinit_model:
_weights(init_model)
开始执⾏训练,要注意的是在创建TFRecord⽂件时,已经把⾳频数据的梅尔频谱转换为⼀维list了,所以在数据输⼊到模型前,需要把数据
reshape为之前的shape,操作⽅式为reshape((-1,128,128,1))。要注意的是如果读者使⽤了其他长度的⾳频,需要根据梅尔频谱的
shape修改,训练数据和测试数据都需要做同样的处理。每训练200个batch执⾏⼀次测试和保存模型,包括预测模型和⽹络权重。
forbatch_id,datainenumerate(train_dataset):
#[可能需要修改参数】设置的梅尔频谱的shape
sounds=data[\'data\'].numpy().reshape((-1,128,128,1))
labels=data[\'label\']
#执⾏训练
ntTape()astape:
predictions=model(sounds)
#获取损失值
train_loss=_categorical_crossentropy(labels,predictions)
train_loss=_mean(train_loss)
#获取准确率
train_accuracy=_c天涯流落思无穷 ategorical_accuracy(labels,predictions)
train_accuracy=(train_())/len(train_())
#更新梯度
gradients=nt(train_loss,ble_variables)
_gradients(zip(gradients,ble_variables))
ifbatch_id%20==0:
print(\"Batch%d,Loss%f,Accuracy%f\"%(batch_id,train_(),train_accuracy))
ifbat勃字组词 ch_id%200==0andbatch_id!=0:
test_losses=list()
test_accuracies=list()
fordintest_dataset:
#[可能需要修改参数】设置的梅尔频谱的shape
test_sounds=d[\'data\'].numpy().reshape((-1,128,128,1))
test_labels=d[\'label\']
test_result=model(test_sounds)
#获取损失值
test_loss=_categorical_crossentropy(test_labels,test_result)
test_loss=_mean(test_loss)
test_(test_loss)
#获取准确率
test_accuracy=_categorical_accuracy(test_labels,test_result)
test_accuracy=(test_())/len(test_())
test_(test_accuracy)
pr霜刃未曾试 int(\'=================================================\')
print(\"Test,Loss%f,Accuracy%f\"%(
sum(test_losses)/len(test_losses),sum(test_accuracies)/len(test_accuracies)))
print(\'=================================================\')
#保存模型
(filepath=\'models/resnet.h5\')
_weights(filepath=\'models/model_weights.h5\')
声纹对⽐
下⾯开始实现声纹对⽐,创建infer_程序,在加载模型时,不要直接加载整个模型,⽽是加载模型的最后分类层的上⼀层,这
样就可以获取到语⾳的特征数据。通过使⽤netron查看每⼀层的输⼊和输出的名称。
layer_name=\'global_max_pooling2d\'
model=_model(\'models/resnet.h5\')
intermediate_layer_model=Model(inputs=,outputs=_layer(layer_name).output)
然后编写两个函数,分类是加载数据和执⾏预测的函数,在这个加载数据函数中并没有限定输⼊⾳频的⼤⼩,只是不允许裁剪静⾳后的⾳频
不能⼩于0.5秒,这样就可以输⼊任意长度的⾳频。执⾏预测之后数据的是语⾳的特征值。
defload_data(data_path):
wav,sr=(data_path,sr=16000)
intervals=(wav,top_db=20)
wav_output=[]
forslicedinintervals:
wav_(wav[sliced[0]:sliced[1]])
assertlen(wav_output)>=8000譬组词和拼音 ,\"有效⾳频⼩于0.5s\"
wav_output=(wav_output)
ps=ctrogram(y=wav_output,sr=sr,hop_length=256).astype(32)
ps=ps[s,...,s]
returnps
definfer(audio_path):
data=load_data(audio_path)
feature=intermediate_layer_t(data)
returnfeature
有了上⾯两个函数,就可以做声纹识别了。我们输⼊两个语⾳,通过预测函数获取他们的特征数据,使⽤这个特征数据可以求他们的对⾓余
弦值,得到的结果可以作为他们相识度。对于这个相识度的阈值,读者可以根据⾃⼰项⽬的准确度要求进⾏修改。
if__name__==\'__main__\':
#要预测的两个⼈的⾳频⽂件
person1=\'dataset/ST-CMDS-20170001_1-OS/\'
person2=\'dataset/ST-CMDS-20170001_1-OS/\'
feature1=infer(person1)[0]
feature2=infer(person2)[0]
#对⾓余弦值
dist=(feature1,feature2)/((feature1)*(feature2))
ifdist>0.7:
print(\"%s和%s为同⼀个⼈,相似度为:%f\"%(person1,person2,dist))
else:
print(\"%s和%s不是同⼀个⼈,相似度为:%f\"%(person1,person2,dist))
声纹识别
在上⾯的声纹对⽐的基础上,我们创建infer_实现声纹识别。同样是使⽤上⾯声纹对⽐的数据加载函数和预测函数,通过这
两个同样获取语⾳的特征数据。
layer_name=\'global_max_pooling2d\'
model=_model(\'models/resnet.h5\')
intermediate_layer_model=Model(inputs=,outputs=_layer(layer_name).output)
person_feature=[]
person_name=[]
#读取⾳频数据
defload_data(data_path):
wav,sr=(data_path,sr=16000)
intervals=(wav,top_db=20)
wav_output=[]
forslicedinintervals:
wav_(wav[sliced[0]:sliced[1]])
iflen(wav_output)<8000:
raiseException(\"有效⾳频⼩于0.5s\")
wav_output=(wav_output)
ps=ctrogram(y=wav_output,sr=sr,hop_length=256).astype(32)
ps=ps[s,...,s]
returnps
definfer(audio_path):
data=load_data(audio_path)
feature=intermediate_layer_t(data)
returnfeature
不同的是笔者增加了load_audio_db中秋节象征团圆的诗句 ()和recognition(),第⼀个函数是加载语⾳库中的语⾳数据,这些⾳频就是相当于已经注册的⽤户,他
们注册的语⾳数据会存放在这⾥,如果有⽤户需要通过声纹登录,就需要拿到⽤户的语⾳和语⾳库中的语⾳进⾏声纹对⽐,如果对⽐成功,
那就相当于登录成功并且获取⽤户注册时的信息数据。完成识别的主要在recognition()函数中,这个函数就是将输⼊的语⾳和语⾳库中的
语⾳⼀⼀对⽐。
defload_audio_db(audio_db_path):
audios=r(audio_db_path)
foraudioinaudios:
path=(audio_db_path,audio)
name=audio[:-4]
feature=infer(path)
person_(name)
person_(feature)
print(\"Loaded%saudio.\"%name)
defrecognition(path):
name=\'\'
pro=0
feature=infer(path)
fori,person_finenumerate(person_feature):
dist=(feature,person_f)/((feature)*(person_f))
ifdist>pro:
pro=dist
name=person_name[i]
returnname,pro
有了上⾯的声纹识别的函数,读者可以根据⾃⼰项⽬的需求完成声纹识别的⽅式,例如笔者下⾯提供的是通过录⾳来完成声纹识别。⾸先必
须要加载语⾳库中的语⾳,语⾳库⽂件夹为audio_db,然后⽤户回车后录⾳3秒钟,然后程序会⾃动录⾳,并使⽤录⾳到的⾳频进⾏声纹识
别,去匹配语⾳库中的语⾳,获取⽤户的信息。通过这样⽅式,读者也可以修改成通过服务请求的⽅式完成声纹识别,例如提供⼀个API供
APP调⽤,⽤户在APP上通过声纹登录时,把录⾳到的语⾳发送到后端完成声纹识别,再把结果返回给APP,前提是⽤户已经使⽤语⾳注
册,并成功把语⾳数据存放在audio_db⽂件夹中。
if__name__==\'__main__\':
load_audio_db(\'audio_db\')
#录⾳参数
CHUNK=1024
FORMAT=16
CHANNELS=1
RATE=16000
RECORD_SECONDS=3
WAVE_OUTPUT_FILENAME=\"infer_\"
#打开录⾳
p=o()
stream=(format=FORMAT,
channels=CHAN书到用时方恨少全诗陆游 NELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
whileTrue:
try:
i=input(\"按下回车键开机录⾳,录⾳3秒中:\")
print(\"开始录⾳......\")
frames=[]
foriinrange(0,int(RATE/CHUNK*RECORD_SECONDS)):
data=(CHUNK)
(data)
print(\"录⾳已结束!\")
wf=(WAVE_OUTPUT_FILENAME,\'wb\')
annels(CHANNELS)
pwidth(_sample_size(FORMAT))
merate(RATE)
rames(b\'\'.join(frames))
()
#识别对⽐⾳频库的⾳频
name,p=recognition(WAVE_OUTPUT_FILENAME)
ifp>0.7:
print(\"识别说话的为:%s,相似度为:%f\"%(name,p))
else:
print(\"⾳频库没有该⽤户的语⾳\")
except:
pass
模型
模型名称
所⽤数据集
下载地址
⽹络权重
ST-CMDS-20170001_1-OS
⽹络预测模型
ST-CMDS-20170001_1-OS
⽹络预测模型
更⼤数据集
更多推荐
voiceprint是什么意思ceprint在线翻译读音
发布评论