检信专注心理
用技术创新 做行业先驱
检信ALLEMOTION
  • 检信智能 Allemotion OS 介绍 语音识别技术的发展现状
    让机器听懂人声,这是人们长久以来的梦想。语音识别是一门交叉学科,涉及多学科研究领域。不同领域的研究成果为语音识别的发展做出了贡献。语音识别技术是一种高科技,它可以让机器通过识别和理解的过程将语音信号转换成相应的文本或命令。计算机语音识别过程与人类语音识别过程基本相同。当前主流的语音识别技术是基于统计模式识别的基本理论。一个完整的语音识别系统大致可以分为三个部分:(1)语音特征提取:目的是从语音波形中提取随时间变化的语音特征序列。(2)声学模型与模式匹配(识别算法):声学模型是识别系统的底层模型,也是语音识别系统中关键的部分。声学模型通常是从获得的语音特征中训练生成的,目的是为每个发音建立一个发音模板。在识别过程中,将未知语音特征与声学模型(模式)进行匹配和比较,计算未知语音的特征向量序列与每个发音模板的距离。声学模型的设计与语言发音的特点密切相关。声学模型单元大小对语音训练数据的大小、语音识别系统的识别率和灵活性有很大影响。(3)语义理解:计算机对语音识别结果的语法和语义进行分析。理解语言的含义,以便做出相应的反应。它通常是通过语言模型来实现的。语音识别技术的应用:语音识别过程实际上就是一个识别过程。就像人们在听语音时,不会将语音与语言的语法结构和语义结构分开,因为当语音的发音模糊时,人们可以利用这些知识来指导理解语言的过程。对于机器来说,语音识别系统也需要使用这些知识,但鉴于语音信号的可变性、动态性和瞬态性,语音识别技术与人脑仍有一定差距。因此,在语音识别技术的选择、应用模式和系统开发等方面都需要专业的设计和调试,以达到良好的应用效果。
    2021-09-27
  • 检信智能 Allemotion OS 对语音识别的简单介绍
    语言作为人类交流的基本方式,在几千年的历史长河中不断传承。近年来,随着语音识别技术的不断成熟,它在我们的生活中得到了广泛的应用,成为通过自然语言进行人机交互的重要方式之一。语音识别技术如何让机器“理解”人类语言?随着计算机技术的快速发展,人们对机器的依赖已经达到了一个非常高的水平。语音识别技术使人和机器通过自然语言进行交互成为可能。通过语音识别控制房间照明、空调温度和电视相关操作是很常见的。根据识别对象的不同,语音识别任务大致可以分为三类,即孤立词识别、关键词识别(或关键词检测)和连续语音识别。其中,孤立词识别的任务是识别先前已知的孤立词,如“开放”和“封闭”。连续语音识别的任务是识别任何连续的语音,如句子或段落。连续语音流中的关键词检测针对的是连续语音,但它并不识别所有的文本,只检测一些已知关键词出现的位置。根据目标说话人,语音识别技术可以分为特定人语音识别和非特定人语音识别。前者只能识别一个或几个人的声音,而后者可以被任何人使用。显然,独立于人的语音识别系统更符合实际需求,但比识别特定的人要困难得多。此外,根据语音设备和渠道,可分为桌面(PC)语音识别、电话语音识别和嵌入式设备(手机、PDA等)语音识别。不同的采集通道会扭曲人类发音的声学特征,因此我们需要构建自己的识别系统。语音识别应用广泛。常见的应用系统包括:语音输入系统,比键盘输入更符合人们的日常习惯,也更自然;语音控制系统,即使用语音识别控制设备比手动控制更快更方便,可应用于工业控制、语音拨号系统、智能家电、声控智能玩具等诸多领域。
    2021-09-24
  • Tensorboard可视化:基于LeNet5进行面部表情分类
    面部表情分类面部表情是面部肌肉的一个或多个动作或状态的结果。这些运动表达了个体对观察者的情绪状态。面部表情是非语言交际的一种形式。它是表达人类之间的社会信息的主要手段,不过也发生在大多数其他哺乳动物和其他一些动物物种中。人类的面部表情至少有21种,除了常见的高兴、吃惊、悲伤、愤怒、厌恶和恐惧6种,还有惊喜(高兴+吃惊)、悲愤(悲伤+愤怒)等15种可被区分的复合表情。面部表情识别技术主要的应用领域包括人机交互、智能控制、安全、医疗、通信等领域。网络架构LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。LeNet5的网络架构如下:但是因为我们要做的是面部表情分类,而且CK+数据集样本大小是48*48,因此需要对LeNet5网络进行微调。网络架构如下: 网络结构如下:计算图如下:代码实现预处理数据集加载,并进行预处理,同时将测试集的前225张样本拼接成15张*15张的大图片,用于Tensorboard可视化。%matplotlib inlineimport matplotlib.pyplot as pltimport osimport cv2import numpy as npfrom tensorflow import name_scope as namespacefrom tensorflow.contrib.tensorboard.plugins import projectorNUM_PIC_SHOW=225base_filedir='D:/CV/datasets/facial_exp/CK+'dict_str2int={'anger':0,'contempt':1,'disgust':2,'fear':3,'happy':4,'sadness':5,'surprise':6}labels=[]data=[]#读取图片并将其保存至datafor expdir in os.listdir(base_filedir): base_expdir=os.path.join(base_filedir,expdir) for name in os.listdir(base_expdir): labels.append(dict_str2int[expdir]) path=os.path.join(base_expdir,name) path=path.replace('\\','/') #将\替换为/ img = cv2.imread(path,0) data.append(img)data=np.array(data)labels=np.array(labels)#将data打乱permutation = np.random.permutation(data.shape[0])data = data[permutation,:,:]labels = labels[permutation]#取前225个图片拼成一张大图片,用于tensorboard可视化img_set=data[:NUM_PIC_SHOW]#前225的数据用于显示label_set=labels[:NUM_PIC_SHOW]big_pic=Noneindex=0for row in range(15): row_vector=img_set[index] index+=1 for col in range(1,15): img=img_set[index] row_vector=np.hstack([row_vector,img]) index+=1 if(row==0): big_pic=row_vector else: big_pic=np.vstack([big_pic,row_vector])plt.imshow(big_pic, cmap='gray')plt.show()#写入大图片cv2.imwrite(D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/data/faces.png,big_pic)#转换数据格式和形状data=data.reshape(-1,48*48).astype('float32')/255.0labels=labels.astype('float32')#0.3的比例测试scale=0.3test_data=data[:int(scale*data.shape[0])]test_labels=labels[:int(scale*data.shape[0])]train_data=data[int(scale*data.shape[0]):]train_labels=labels[int(scale*data.shape[0]):]print(train_data.shape)print(train_labels.shape)print(test_data.shape)print(test_labels.shape)#将标签one-hottrain_labels_onehot=np.zeros((train_labels.shape[0],7))test_labels_onehot=np.zeros((test_labels.shape[0],7))for i,label in enumerate(train_labels): train_labels_onehot[i,int(label)]=1for i,label in enumerate(test_labels): test_labels_onehot[i,int(label)]=1print(train_labels_onehot.shape)print(test_labels_onehot.shape)2.定义前向网络import tensorflow as tfIMAGE_SIZE=48 #图片大小NUM_CHANNELS=1 #图片通道CONV1_SIZE=5CONV1_KERNEL_NUM=32CONV2_SIZE=5CONV2_KERNEL_NUM=64FC_SIZE=512 #隐层大小OUTPUT_NODE=7 #输出大小#参数概要,用于tensorboard实时查看训练过程def variable_summaries(var): with namespace('summaries'): mean=tf.reduce_mean(var) tf.summary.scalar('mean',mean) #平均值 with namespace('stddev'): stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean))) tf.summary.scalar('stddev',stddev) #标准差 tf.summary.scalar('max',tf.reduce_max(var))#最大值 tf.summary.scalar('min',tf.reduce_min(var))#最小值 tf.summary.histogram('histogram',var)#直方图#获取权重def get_weight(shape,regularizer,name=None): w=tf.Variable(tf.truncated_normal(shape,stddev=0.1),name=name) #variable_summaries(w) if(regularizer!=None): tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w)) return w#获取偏置def get_bias(shape,name=None): b=tf.Variable(tf.zeros(shape),name=name) #variable_summaries(b) return b #定义前向网络def forward(x,train,regularizer): with tf.name_scope('layer'): #把输入reshape with namespace('reshape_input'): x_reshaped=tf.reshape(x,[-1,IMAGE_SIZE,IMAGE_SIZE,NUM_CHANNELS]) with tf.name_scope('conv1'): #定义两个卷积层 conv1_w=get_weight([CONV1_SIZE,CONV1_SIZE,NUM_CHANNELS,CONV1_KERNEL_NUM],regularizer=regularizer,name='conv1_w') conv1_b=get_bias([CONV1_KERNEL_NUM],name='conv1_b') conv1=tf.nn.conv2d(x_reshaped,conv1_w,strides=[1,1,1,1],padding='SAME') relu1=tf.nn.relu(tf.nn.bias_add(conv1,conv1_b)) pool1=tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.name_scope('conv2'): conv2_w=get_weight([CONV2_SIZE,CONV2_SIZE,CONV1_KERNEL_NUM,CONV2_KERNEL_NUM],regularizer=regularizer,name='conv2_w') conv2_b=get_bias([CONV2_KERNEL_NUM],name='conv2_b') conv2=tf.nn.conv2d(pool1,conv2_w,strides=[1,1,1,1],padding='SAME') relu2=tf.nn.relu(tf.nn.bias_add(conv2,conv2_b)) #对卷机后的输出添加偏置,并通过relu完成非线性激活 pool2=tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.name_scope('flatten'): #定义reshape层 pool_shape=pool2.get_shape().as_list() #获得张量的维度并转换为列表 nodes=pool_shape[1]*pool_shape[2]*pool_shape[3] #[0]为batch值,[1][2][3]分别为长宽和深度 #print(type(pool2)) reshaped=tf.reshape(pool2,[-1,nodes]) with tf.name_scope('fc1'): #定义两层全连接层 fc1_w=get_weight([nodes,FC_SIZE],regularizer,name='fc1_w') fc1_b=get_bias([FC_SIZE],name='fc1_b') fc1=tf.nn.relu(tf.matmul(reshaped,fc1_w)+fc1_b) if(train): fc1=tf.nn.dropout(fc1,0.5) with tf.name_scope('fc2'): fc2_w=get_weight([FC_SIZE,OUTPUT_NODE],regularizer,name='fc2_w') fc2_b=get_bias([OUTPUT_NODE],name='fc2_b') y=tf.matmul(fc1,fc2_w)+fc2_b return y3.定义反向传播 ,可视化设置,并进行训练,BATCH_SIZE=100 #每次样本数LEARNING_RATE_BASE=0.005 #基本学习率LEARNING_RATE_DECAY=0.99 #学习率衰减率REGULARIZER=0.0001 #正则化系数STEPS=2500 #训练次数MOVING_AVERAGE_DECAY=0.99 #滑动平均衰减系数SAVE_PATH='.\\facial_expression_cnn_projector\\' #参数保存路径data_len=train_data.shape[0]#将拼接为big_pic的测试样本保存至标量,用于训练过程可视化pic_stack=tf.stack(test_data[:NUM_PIC_SHOW]) #stack拼接图片张量embedding=tf.Variable(pic_stack,trainable=False,name='embedding')if(tf.gfile.Exists(os.path.join(SAVE_PATH,'projector'))==False): tf.gfile.MkDir(os.path.join(SAVE_PATH,'projector'))#创建metadata文件,存放可视化图片的labelif(tf.gfile.Exists(os.path.join(SAVE_PATH,'projector','metadata.tsv'))==True): tf.gfile.DeleteRecursively(os.path.join(SAVE_PATH,'projector')) tf.gfile.MkDir(os.path.join(SAVE_PATH,'projector'))#将可视化图片的标签写入with open(os.path.join(SAVE_PATH,'projector','metadata.tsv'),'w') as f: for i in range(NUM_PIC_SHOW): f.write(str(label_set[i])+'\n')with tf.Session() as sess: with tf.name_scope('input'): #x=tf.placeholder(tf.float32,[BATCH_SIZE,IMAGE_SIZE,IMAGE_SIZE,NUM_CHANNELS],name='x_input') x=tf.placeholder(tf.float32,[None,IMAGE_SIZE*IMAGE_SIZE*NUM_CHANNELS],name='x_input') y_=tf.placeholder(tf.float32,[None,OUTPUT_NODE],name='y_input') #reshape可视化图片 with namespace('input_reshape'): image_shaped_input=tf.reshape(x,[-1,IMAGE_SIZE,IMAGE_SIZE,1]) #把输入reshape tf.summary.image('input',image_shaped_input,7) #添加到tensorboard中显示 y=forward(x,True,REGULARIZER) global_step=tf.Variable(0,trainable=False) with namespace('loss'): #softmax并计算交叉熵 ce=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) cem=tf.reduce_mean(ce) #求每个样本的交叉熵 loss=cem+tf.add_n(tf.get_collection('losses')) tf.summary.scalar('loss',loss) #loss只有一个值,就直接输出 learning_rate=tf.train.exponential_decay( LEARNING_RATE_BASE, global_step, data_len/BATCH_SIZE, LEARNING_RATE_DECAY, staircase=True ) with namespace('train'): train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step) ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step) ema_op=ema.apply(tf.trainable_variables()) with namespace('accuracy'): correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) tf.summary.scalar('accuracy',accuracy) with tf.control_dependencies([train_step,ema_op]): train_op=tf.no_op(name='train') init_op=tf.global_variables_initializer() sess.run(init_op) #合并所有的summary merged=tf.summary.merge_all() #写入图结构 writer=tf.summary.FileWriter(os.path.join(SAVE_PATH,'projector'),sess.graph) saver=tf.train.Saver() #保存网络的模型 #配置可视化 config=projector.ProjectorConfig() #tensorboard配置对象 embed=config.embeddings.add() #增加一项 embed.tensor_name=embedding.name #指定可视化的变量 embed.metadata_path='D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/projector/metadata.tsv' #路径 embed.sprite.image_path='D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/data/faces.png' embed.sprite.single_image_dim.extend([IMAGE_SIZE,IMAGE_SIZE])#可视化图片大小 projector.visualize_embeddings(writer,config) #断点续训 #ckpt=tf.train.get_checkpoint_state(MODEL_SAVE_PATH) #if(ckpt and ckpt.model_checkpoint_path): # saver.restore(sess,ckpt.model_checkpoint_path) for i in range(STEPS): run_option=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata=tf.RunMetadata() start=(i*BATCH_SIZE)%(data_len-BATCH_SIZE) end=start+BATCH_SIZE summary,_,loss_value,step=sess.run([merged,train_op,loss,global_step], feed_dict={x:train_data[start:end],y_:train_labels_onehot[start:end]}, options=run_option, run_metadata=run_metadata) writer.add_run_metadata(run_metadata,'step%03d'%i) writer.add_summary(summary,i)#写summary和i到文件 if(i%100==0): acc=sess.run(accuracy,feed_dict={x:test_data,y_:test_labels_onehot}) print('%d %g'%(step,loss_value)) print('acc:%f'%(acc)) saver.save(sess,os.path.join(SAVE_PATH,'projector','model'),global_step=global_step) writer.close()可视化训练过程执行上面的代码,打开tensorboard,可以看到训练精度和交叉熵损失如下:由于只有六百多的训练样本,故得到曲线抖动很大,训练精度大概在百分之八九十多浮动,测试精度在百分之七八十浮动,可见精度不高。下面使用Tensorboard将训练过程可视化(图片是用Power Point录频然后用迅雷应用截取gif得到的): ————————————————版权声明:本文为CSDN博主「陈建驱」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    2021-09-20
  • 检信智能ALLEMOTION OS 语音情感识别——语音(声音的预处理)
    1. 语音信号(声音是什么)声音是由物体振动产生的声波,是通过介质(空气或固体、液体)传播并能被人或动物听觉器官所感知的波动现象,最初发出振动的物体叫声源。声音(语音消息)的基本模拟形式是一种称为语音信号的声学波。语音信号可以通过麦克风转化成电信号,转换成语音波形图,如下图为消息should we chase的波形图。横坐标表示时间,纵坐标表示振幅。文本should we chase按照发音可以表示成音素的形式[SH UH D - W IY - CH EY S],声波图中的每一段表示一个音素,在ARBAbet音素集中包含近64 = 2^6个符号。声音作为波的一种,频率(声源在一秒内振动的次数)和振幅是描述波的重要属性,频率的大小与我们通常所说的音高对应,而振幅影响声音的大小。声音可以被分解为不同频率不同强度正弦波的叠加,正弦波是频率成分最为单一的一种信号,任何复杂信号都可以看成由许许多多频率不同、大小不等的正弦波复合而成。这种变换(或分解)的过程,称为傅立叶变换,通过这种分解我们可以把时域图转为频域图。正弦信号表达式为y=Asin(ωx+φ)y=Asin⁡(ωx+φ)。其中A表示振幅。ω/2πω/2π表示频率。对于(空气中的)声振动而言,振幅是声压与静止压强之差的最大值。其中声压是声波在空气中传播时形成压缩和稀疏交替变化的压力增值。麦克风录制声音的原理就是将空气中的压力变动波转化成电信号的变动。而我们平常说的声音强度(响亮程度)就是由振幅决定的,声音强度的单位是分贝(dB),计算公式如下,用实测声压和参考声压之比的常用对数(常用对数lg以10为底,自然对数ln以e为底)的20倍来表示。下式中分母是参考值的声压,通常为20微帕,人类能听到的最小声压。分贝表示功率量之比时,等于功率强度之比的常用对数的10倍。分贝表示场量之比时,等于场强幅值之比的常用对数的20倍。语音链(声音是怎么发出的)从语音信号的产生到感知的过程称为语音链,如下图所示:2 下面是语音信号产生的四个步骤:文本:消息以某种形式出现在说话者的大脑中,消息携带的信息可认为有着不同的表示形式,例如最初可能以英语文本的形式表示。假设书面语有32个符号,也就是2^5,用5个bit表示一个符号。正常的平均说话速率为15个符号每秒。上图例子中有15个字母“should we chase”,持续了0.6秒,信息流的速率为15x5/0.6 = 125 bps。音素:为了说出这条消息,说话者隐式地将文本转换成对应口语形式的声音序列的符号表示,即文本符号转成音素符号,音素符号用来描述口语形式消息的基本声音及声音发生的方式(即语速和语调)。ARBAbet音素集中包含近64 = 2^6个符号,用6个bit表示一个音素,上图例子中有8个音素,持续了0.6秒,信息流的速率为8x6/0.6 = 80 bps,考虑描述信号韵律特征的额外信息(比如段长,音高,响度),文本信息编码成语音信号后,总信息速率需要再加上100bps。发音:神经肌肉系统以一种与产生口语形式消息及其语调相一致的方式,移动舌头,唇,牙齿,颌,软腭,使这些声道发声器官按规定的方式移动,进而发出期望的声音。刺激共振:声道系统产生物理生源和恰当的时变声道形状,产生上图所示的声学波形。前两个阶段的信息表示是离散的,用一些简单假设就可以估计信息流的速率。但是后两个阶段信息是连续的,以关节运动的形式发出,想要度量这些连续信息,需要进行恰当的采样和量化获得等效的数字信号,才能估计出数据的速率。事实上,因为连续的模拟信号容易收到噪声的影响,抗噪能力弱,通常会转为离散的数字信号。在第三阶段,进行采样和量化后得到的数据率约为2000bps。在最后一个阶段,数字语音波形的数据率可以从64kbps变化到700kbps。该数据是通过测量“表示语音信号时为达到想要的感知保真度”所需要的采样率和量化计算得到的。比如,“电话质量”的语音处理需要保证宽带为0~4kHz,这意味着采样率为8000个样本每秒(根据香农采样定理,为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍),每个样本可以量化成8比特,从而得到数据率64000bps。这种表示方式很容易听懂,但对于大多数倾听者来说,语音听起来与说话者发出的原始语音会有不同。另一方面,语音波形可以表示成“CD质量”,采用44100个样本每秒的采样率,每个样本16比特,总数据率为705600bps,此时复原的声学波听起来和原始信号几乎没有区别。现在在音乐app上下载歌曲的时一般有四种音乐品质选择,标准(128kbps),较高(192kbps),极高(320kbps),无损品质。将消息从文本表示转换成采样的语音波形时,数据率会增大10000倍。这些额外信息的一部分能够代表说话者的一些特征比如情绪状态,说话习惯等,但主要是由简单采样和对模拟信号进行精细量化的低效性导致的。因此,处于语音信号固有的低信息速率考虑,很多数字语音处理的重点是用更低的数据率对语音进行数字表示(通常希望数据率越低越好,同时保证重现语音信号的感知质量满足需要的水平)。3 语音信号中的Analog-Digital Converter,“模-数”变换(声音是怎么保存的)预滤波(反混叠滤波):语音信号在采样之前要进行预滤波处理。目的有两个,一是抑制输入信号各频率分量中频率超过fs/2的所有分量(fs为采样频率),以防止混叠干扰;二是抑制50Hz的电源工频干扰。1.采样:原始的语音信号是连续的模拟信号,需要对语音进行采样,转化为时间轴上离散的数据。采样后,模拟信号被等间隔地取样,这时信号在时间上就不再连续了,但在幅度上还是连续的。经过采样处理之后,模拟信号变成了离散时间信号。采样频率是指一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限(人耳一般可以感觉到20-20K Hz的声音,根据香农采样定理,采样频率应该不小于最高频率的两倍,所以40KHz是能够将人耳听见的声音进行很好的还原的一个数值,于是CD公司把采样率定为44.1KHz),48KHz则更加精确一些。对于高于48KHz的采样频率人耳已无法辨别出来了,所以在电脑上没有多少使用价值。2.量化:进行分级量化,将信号采样的幅度划分成几个区段,把落在某区段的采样到的样品值归成一类,并给出相应的量化值。根据量化间隔是否均匀划分,又分为均匀量化和非均匀量化。均匀量化的特点为“大信号的信噪比大,小信号的信噪比小”。缺点为“为了保证信噪比要求,编码位数必须足够大,但是这样导致了信道利用率低,如果减少编码位数又不能满足信噪比的要求”(根据信噪比公式,编码位数越大,信噪比越大,通信质量越好)。通常对语音信号采用非均匀量化,基本方法是对大信号使用大的量化间隔,对小信号使用小的量化间隔。由于小信号时量化间隔变小,其相应的量化噪声功率也减小(根据量化噪声功率公式),从而使小信号时的量化信噪比增大,改善了小信号时的信噪比。量化后,信号不仅在时间上不再连续,在幅度上也不连续了。经过量化处理之后,离散时间信号变成了数字信号。3.编码:在量化之后信号已经变成了数字信号,需要将数字信号编码成二进制。“CD质量”的语音采用44100个样本每秒的采样率,每个样本16比特,这个16比特就是编码的位数。采样,量化,编码的过程称为A/D转换,如下图所示。反过程为D/A转换,因为A/D之前进行了预滤波,D/A转换后面还需要加一个平滑滤波器。A/D转换,D/A转换,滤波这些功能都可以用一块芯片来完成,在市面上能买到各种这样的芯片。4 语音信号的预处理(声音的预处理)语音信号的预处理一般包括预加重,分帧,加窗,端点检测。预加重:求语音信号频谱(频谱是指时域信号在频域下的表示方式,关于频域和时域的理解如下图所示),频率越高相应的成分越小,高频部分的频谱比低频部分的难求,为此要在预处理中进行预加重(Pre-emphasis)处理。预加重的目的是提高高频部分,使信号的频谱变得平坦,以便于频谱分析或者声道参数分析。预加重可在语音信号数字化时在反混叠滤波器之前进行,但一般是在语音信号数字化之后。短时分析:语音信号从整体来看是随时间变化的,是一个非平稳过程,不能用处理平稳信号的数字信号处理技术对其进行分析处理。但是,由于不同的语音是由人的口腔肌肉运动构成声道某种形状而产生的响应,这种运动对于语音频率来说是非常缓慢的,所以从另一方面看,虽然语音信号具有时变特性,但是在一个短时间范围内(一般认为在10-30ms)其特性基本保持相对稳定,即语音具有短时平稳性。所以任何语音信号的分析和处理必须建立在“短时”的基础上,即进行“短时分析”。分帧:为了进行短时分析,将语音信号分为一段一段,其中每一段称为一帧,一般取10-30ms,为了使帧与帧之间平滑过渡,保持连续性,使用交叠分段的方法,可以想成一个指针p从头开始,截取一段头为p,长度为帧长的片段,然后指针p移动,移动的步长就称为帧移,每移动一次都截取一段,这样就得到很多帧。加窗:加窗就是用一定的窗函数w(n)来乘s(n),从而形成加窗语音信号sw(n)=s(n)∗w(n),常用的窗函数是矩形窗和汉明窗,用矩形窗其实就是不加窗,窗函数中有个N,指的是窗口长度(样本点个数),对应一帧,通常在8kHz取样频率下,N折中选择为80-160(即10-20ms持续时间)。端点检测:从一段语音信号中准确地找出语音信号的起始点和结束点,它的目的是为了使有效的语音信号和无用的噪声信号得以分离。对于一些公共的语音数据集可以不做这步操作,因为这些语音的内容就是有效的语音信号(可以认为研究人员已经对数据做过端点检测)。语音信号的特征(声音的特征)特征的选取是语音处理的关键问题,特征的好坏直接影响到语音处理(比如语音识别)的精度。然而在语音领域中,没有一个所谓的标准特征集,不同的语音系统选取的特征组合不尽相同。语音的特征一般是由信号处理专家定义的,比较流行的特征是MFCC(梅尔频率倒谱系数)。5 语音情感识别算法常用的机器学习分类器:模式识别领域的诸多算法(传统)都曾用于语音情感识别的研究,比如GMM(高斯混合模型),SVM,KNN,HMM(隐马尔可夫模型)。用LLDs(low level descriptors)和HSFs(high level statistics functions)这些手工设计特征去训练。声谱图+CRNN:最近很多人用声谱图加上CNN,LSTM这些深度学习模型来做。还有手工特征加声谱图一起作为特征放进深度学习模型。也有人用DBN,但是不多。3.手工特征+CRNN:也有人用手工特征加CRNN做。————————————————版权声明:本文为CSDN博主「醒了的追梦人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2021-09-20
  • 检信智能ALLEMOTION OS推荐免费下载的语音情感数据库
    检信智能ALLEMOTION OS推荐免费下载的语音情感数据库计算机对从传感器采集来的信号进行分析和处理,得出对方正处在的情感状态,这种行为叫作情感识别。目前对于情感识别有两种方式,一种是检测生理信号如呼吸,心律和体温等,另一种是检测情感行为如面部表情识别,语音情感识别和姿态识别。语音情感数据集是研究语音情感识别的重要基础,按照情感描述类型可将数据集分为离散情感数据库和维度情感数据库,前者以离散的语言标签(如高兴,悲伤等)作为情感标注,后者以连续的实数坐标值表示情感。下面介绍一些离散语音情感数据集:Belfast英语情感数据库:40位录音者(20男20女,18-69岁),对五个段落(每个段落7-8个句子)进行演讲录制,演讲者按照五种情感倾向进行演讲:生气(anger),悲伤(sadness),高兴(happiniess),害怕(fear),中性(neutral)。柏林Emo-DB情感数据库:德国柏林工业大学录制,10位演员(5男5女),对10个德语语音进行表演,包含了七种情感:生气(anger),悲伤(sadness),高兴(happiniess),害怕(fear),中性(neutral),厌恶(disgust),无聊(boredom)。共包含800句语料(10 位演员 x10 句话 x7 种情感+100 条某些语句的二次版本),后经过筛选得到500多条,采样率为 48kHz (后压缩至 16kHz),16bit 量化。语料文本的选取遵从语义中性、无情感倾向的原则,且为日常口语化风格,无过多的书面语修饰。语音的录制在专业录音室中完成,要求演员在表演某个特定情感片段前通过回忆自身真实经历或体验进行情绪的酝酿,来增强情绪的真实感。FAU AIBO儿童德语情感数据库:2009年在Interspeech会议上举办Emotion Challenge评比中指定的语音情感数据库。通过儿童与索尼公司的AIBO机器狗进行自然交互,从而进行情感数据的采集。说话人由51名儿童组成,年龄段为10-13岁,其中30个为女性。语料库包含9.2小时的语音,48401个单词。采样频率为48kHz(后压缩至 16kHz),16比特量化。该数据库中情感数据的自然度高,数据量足够大,是较为流行的一个语音情感数据库。CASIA汉语情感数据库:中科院自动化所录制,两男两女录制500句不同的文本,通过演讲者不同的感情演讲得出,最后的语音又人工筛选,得到了大约9600条语句。分为六类情感。ACCorpus系列汉语情感数据库:清华大学和中科院心理研究所合作录制,相对于CASIA录制工作者更多,代表性更强。包含如下 5 个相关子库:ACCorpus_MM 多模态、多通道的情感数据库;ACCorpus_SR 情感语音识别数据库;ACCorpus_SA 汉语普通话情感分析数据库;ACCorpus_FV 人脸表情视频数据库;ACCorpus_FI 人脸表情图像数据库。以 ACCorpus_SR 为例,该子库是由 50 位录音人(25 男25女)对 5类情感(中性、高兴、生气、恐惧和悲伤)各自表演得到,16kHz 采样,16bit 量化。IEMOCAP: 南加利福尼亚大学录制的,10个演员,1男1女演绎一个session,共5个session。录制了将近12小时的数据,有视频,语音,人脸的变动捕捉和文本。包括即兴自发的和照着稿子念的。每个utterance至少三个人评估。包括9种情感(anger,happiness,excitement,sadness,frustration,fear,surprise,other和neural)的离散标签,以及三个维度的维度标签(valence, activation and dominance)。————————————————版权声明:本文为CSDN博主「醒了的追梦人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/qq_33472146/article/details/96433766
    2021-09-20
  • 检信智能ALLEMOTION OS 语义文本情感识别原理
    首先,当然是文本预处理输入文本,在将输入文本转化成向量之前,我们需要将标点符号、括号、问号等删去,只留下字母、数字和字符, 同时将大写字母转化为小写,去除停用词。效果如下图然后就是将文本转化为词向量(即汉字要转化为计算机能识别的数字类(矩阵啥的))在将深度学习运用于文本情感分析的过程中,我们需要考虑网络模型的输入数据的形式。在其他例子中,卷积神经网络(CNN)使用像素值作为输入,logistic回归使用一些可以量化的特征值作为输入,强化学习模型使用奖励信号来进行更新。通常的输入数据是需要被标记的标量值。当我们处理文本任务时,可能会想到利用这样的数据管道。但是,这样的处理方式存在着很多问题。我们不能像点积或者反向传播那样在一个字符串上执行普通的运算操作。所以在这里我们不能将字符串作为输入,而是需要将文本转换成计算机可识别的格式,由于计算机只能识别数字,因此我们可以将文本中的每一个词都转化为一个向量,也称作词向量。词向量是用一个向量的形式表示文本中的一个词,通过这种转化方式就能采用机器学习来把任何输入量化成我们需要的数值表示,然后就可以充分利用计算机的计算能力,计算得出最终想要的结果,保证了操作的可行性。如图所示,我们可以将上面的这段文本输入数据转化成一个 16*D 的输入矩阵。我们希望创建这种词向量的方式是可以表示单词及其在上下文中意义的。例如,我们希望单词 “love” 和 “adore” 这两个词在向量空间中是有一定的相关性的,因为他们的意思相似,而且都在类似的上下文中使用,因此他们的空间相距距离会相对较小。而“love”、“adore”这两个单词与单词“baseball”的意思有很大的不同,词性也不相同,那么“love”、“adore”这两个单词的向量与单词“baseball”的向量相距距离就会相对较大。单词的向量表示也被称之为词嵌入。特征提取:为了得到这些词嵌入,我们采用一个很著名的模型 “Word2Vec”。“Word2Vec”是近几年很火的算法,它通过神经网络机器学习算法来训练N-gram 语言模型,并在训练过程中求出word所对应的vector的方法。它是将词表征为实数值向量的一种高效的算法模型,其利用深度学习的思想,可以通过训练,把对文本内容的处理简化为 K 维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似。在这个模型中,每个词的词向量是根据上下文的语境来进行推断的,如果两个词在上下文的语境中可以被互换,那么这就表示这两个词的意思相似,词性相似,那么他们的词向量中相距距离就非常近。在自然语言中,上下文的语境对分析词语的意义是非常重要的。简单来说,Word2Vec这个模型的作用就是从一大堆句子(以 Wikipedia 为例)中为每个独一无二的单词进行建模,并且输出一个唯一的向量,Word2Vec 模型的输出被称为一个嵌入矩阵。该嵌入矩阵将包含训练语料库中每个不同单词的向量。 传统上,嵌入矩阵可以包含超过300万个单词向量。Word2Vec模型是通过对数据集中的每个句子进行训练,在其上滑动一个固定大小的窗口,并试图预测窗口的中心词,给出其他词。使用损失函数和优化程序,该模型为每个唯一字生成向量。这个训练过程的细节可能会变得有点复杂,所以我们现在要跳过细节,但这里主要的一点是,任何深度学习方法对于NLP任务的输入可能都会有单词向量作为输入。后面特征提取这一块,应该会将用word2vec提取的方式改为用doc2vec来提取,不过具体修改时间待定,得看我啥时候能将这一操作学会(哈哈哒)。Google 已经帮助我们在大规模数据集上训练出来了 Word2Vec 模型,它包括 1000 亿个不同的词,在这个模型中,谷歌能创建300万个词向量,每个向量维度为 300。在理想情况下,我们将使用这些向量来构建模型,但是因为这个单词向量矩阵太大了(3.6G),因此在此次研究中我们将使用一个更加易于管理的矩阵,该矩阵由 GloVe 进行训练得到。矩阵将包含 400000 个词向量,每个向量的维数为 50。这里有用到一些.npy文件,是通过glove已经转好的,存为了npy文件。我们将导入两个不同的数据结构,一个是包含 400000 个单词的 Python 列表,一个是包含所有单词向量值的 400000*50 维的嵌入矩阵。结果对比:CNN网络层数包括:卷积层,池化层,全连接层。CNN神经网络模型运用于文本情感分析时效果不如LSTM神经网络模型效果好,经典的CNN模型在文本情感分析正确率只有71.2%,而对经典进行改进之后,增加了卷积层和池化层,CNN模型的正确率得到了提高,但正确率也是只有77.25%,仍然比不上只用了一层LSTM网络的正确率高。从结果对比中我们可以知道,CNN不光可以应用于图像处理领域,也能成功有效地对文本信息进行分析,但LSTM在解决文本情感分析的问题时效果要比CNN好。下面是一些运行结果:训练数据集的结果嗯…,训练了800多个数据,发现最高的时候准确率在百分之七十几,但是绝大多数稳定在百分之五十左右,这个准确度还是有点低的,后面加强学习,改进代码,应该可以将准确度提高。(方法推荐:改改epoch可能会提高准确度,模型收敛+准确率)输出词列表的长度,词向量的维数维度的个数这个项目采用的数据集是IMDB数据集,这个数据集是一个关于电影评论的数据集,在这个数据集上做训练和测试。这个数据集包含 25000 条电影数据,其中 12500 条正向数据,12500 条负向数据。将其中的23000个文本评论作为训练集,将剩下的2000个文本评论作为测试集。下面为正面评价文本和负面评价文本示例总结:将CNN与LSTM两种神经网络模型应用到了文本情感分析的问题当中,使用Word2Vec模型及它的子矩阵GloVe来将文本信息进行预处理,转换成了词向量及向量矩阵,使用了IMDB数据集来对模型进行训练,并用TensorFlow进行建模、训练。版权声明:本文为CSDN博主「醒了的追梦人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2021-09-20