镀镍的英文译语怎么说-乡亲的拼音


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在线翻译读音