首页 >> 电商 >> 老张让我用TensorFlow识别语音命令:前进、停止、下车、右转

老张让我用TensorFlow识别语音命令:前进、停止、下车、右转

2023-04-28 电商

o.read_file("datasets\go\1000.wav")audio, rate = tf.audio.decode_wav(contents=audio_binary)

可用tf.audio.decode_wav可以读自取和截自取压缩算法,返国压缩算法的数据库audio和编码器rate。

其之中,判别的数据库audio打印如下:

numpy=array([[-0.00238037], [-0.0038147 ], [-0.00335693], ..., [-0.00875854], [-0.00198364], [-0.00613403]], dtype=float32)>

上头的数据库,基本是[[x]]。这暗示,这段扬声器是单VCR(类比黑白照片)。x是VCR全都某一时刻基本的数值。实际上它是一个反转,我们可以把它画出来。

import matplotlib.pyplot as pltplt.plot(audio)plt.show()

这个雷的大小,就是推动你眼睛鼓膜的幅度。

上头的平面图是11146个采样点的圆形。一个大,我们打印10个点的圆形。这10个点就只不过是推了你眼睛10下。

import matplotlib.pyplot as pltplt.plot(audio[0:10])plt.show()

从此以后,我们可以看得出,扬声器实际上就是几组带有基因序列的数小字。

要比对扬声器,就得首先以比对扬声器数据库的基本特征。

2.2 扬声器的反转

每个个体都有自己的组转成转含有,他们是独一无二的。就像你一样。

但是,多个个体两者之间,也有相似性。就像我们都是程序员。于是,我们可以用一种叫“小曲”的东西来描绘一个事物。比如,辣子鸡的菜小曲。正是菜小曲描绘了放于多少辣椒,用哪个部位的肉,切转成什么圆形。这才让我们看得见转原料时,大喊一声:辣子鸡,而非糖醋鱼。

歌声也有“小曲”,一般用反转描绘。

歌声是振动频发的,这个振动的阈值是有小曲的。

把一段歌声比对出来包被含哪些通常阈值,就像是把佳肴比对出来由辣椒、肉、豆瓣酱组转成。如此一来通过比对新鲜,终究我们判断出来是什么菜品。

歌声也是一样,一段声雷可以比对出来它的阈值组转成。如果只想基本认识到“反转”的知识,我有一篇万小字粗大文《古今中外了傅内都叶叠沙》。看完所需半个同一时间。

我上头说是的,Google一些公司一些公司当初明白了。因此,他们在TensorFlow基本之中,当初外置了提供扬声器反转的变数。它采用的是间歇傅内都叶叠沙stft。

waveform = tf.squeeze(audio, axis=-1)spectrogram = tf.signal.stft(waveform, frame_length=255, frame_step=128)

我们上头通过tf.audio.decode_wav判别了压缩算法,它返国的数据库格式是[[-0.00238037][-0.0038147 ]]这种基本。

你显然好奇心,它为什么不是[-0.00238037, -0.0038147 ]这种基本,非要外头如此一来套一层。追忆一下,我们的粉红色平面图形的范例,一个平面图形点暗示为[[198, 102, 145]],这暗示RGB三个色值连接线描绘一个彩色平面图形。实际上,这内都也一样,是兼容了多VCR的基本情况。

但是,我们只要一个连接线就好。所以所需通过tf.squeeze(audio, axis=-1)对数据库进唯时降一个维度,把[[-0.00238037][-0.0038147 ]]变为[-0.00238037, -0.0038147 ]。这,才是一个纯粹的反转。嗯,这样才能交到傅内都叶先以生进唯时比对。

tf.signal.stft全都的参数,是指自取DEMO的规则。就是从总反转全都,每隔多久自取多少DEMO本进唯时比对。比对在此之后,我们也是可以像绘成反转一样,把比对的反转结果绘成出来的。

看不懂上头的平面图很难人关系,这很基本情况下,非常基本情况下,格外基本情况下。因为,我即便用了一万多小字,50多张平面图,的机构认真了基本的解读。但是直到今日,有20%左方右的听众还是不坚信。

不过,此时,你所需坚信,一段歌声的优点是可以通过生物学的作法得来出来的。这,就够了。

把优点得来出来在此之后,我们就交到机器学习基本去受训了。

2.3 扬声器数据库的格式化

上头,我们仍然转成功地提供到一段扬声器的重要灵魂:反转。

一个大,就该交到建模假设去受训了。

在同年交到假设早先,实际上还有一些格式化兼职要认真。比如,给它切一切毛边,叠一叠,整理转成同一个圆形。

正如计算机并不所需比对0和1,很多基本也是并不所需接收通常的构造化数据库。

举个最简单的范例,你在受训词作的时候,有五言的和古诗的。比如:“床之前明翌年光”和“一顿不吃饿得慌”两句。那么,终究都所需处理事件转成一样的可有。要么上头沙0,要么后边沙0,要么把粗大的依例短。总之,必须一样粗大度才唯。

床之前明翌年光〇〇一顿不吃饿得慌蜀道未足〇〇〇〇

那么,我们的扬声器数据库如何处理事件呢?我们的音雷数据库经过间歇傅内都叶叠沙在此之后,格式是这样的:

这是因为我们11146粗大度的扬声器,经过tf.signal.stft的frame_step=128切分在此之后,可以分转成86份。所以我们看得见shape=(86, 129, 1)。那么,如果扬声器的粗大度变动,那么这个构造也会变。这样不好。

因此,我们首先以要把扬声器的粗大度标准一下。因为编码器是16000,也就是1秒钟据信16000次扬声器数据库。那么,我们不妨就拿1秒扬声器,也就是16000个粗大度,为一个之比。过粗大的,我们就依例剪掉之前头的。过短的,我们就在之前头补上0。

我说是的这一系列操作者,反映到code上,就是一个大这样:

waveform = tf.squeeze(audio, axis=-1)input_len = 16000waveform = waveform[:input_len]zero_padding = tf.zeros([16000] - tf.shape(waveform),dtype=tf.float32)waveform = tf.cast(waveform, dtype=tf.float32)equal_length = tf.concat([waveform, zero_padding], 0)spectrogram = tf.signal.stft(equal_length, frame_length=255, frame_step=128)spectrogram = tf.abs(spectrogram)spectrogram = spectrogram[..., tf.newaxis]

这时候,如此一来来想到我们的反转数据库构造:

今日,不管你读所写任何可有的扬声器,终究它的反转都是shape=(124, 129, 1)。从平面图上我们也可以看得出,不足的就算之前头补0,也得凑转成个16000粗大度。

一个大,真的要开始构建建模了。

2.4 构建假设和受训

依照老张的敦促……我今日不让提他,因为我的双手被绿萝和光的还却是发兜。

依照敦促……他要四种号令,分别是:之前进、之中断、左方转、往北。那么,我就整天了四种扬声器,分别放于置也就是说是的注册表一个大。

从注册表读自取数据库、将IO除此以外、按照人口比例分出数据库集和验证集,以及把datasets区分为batch……这些操作者,在TensorFlow之中仍然很转早熟了。而且,随着旧特别版本的更新,越来越转早熟。体今日code上,就是小用字更少。此处我就不说是了,我会把原始code上传到github,供仰参考资料。

一个大,我中长期说是一下,本范例之中,借助于音调类群,它的建模的构造,以及假设受训的配置。

import tensorflow as tffrom tensorflow.keras import layersfrom tensorflow.keras import modelsmodel = models.Sequential([ layers.Input(shape= (124, 129, 1)), layers.Resizing(32, 32), layers.Normalization(), layers.Conv2D(32, 3, activation='relu'), layers.Conv2D(64, 3, activation='relu'), layers.MaxPooling2D(), layers.Dropout(0.25), layers.Flatten(), layers.Dense(128, activation='relu'), layers.Dropout(0.5), layers.Dense(4),])model.compile( optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])

实际上,我冲动机器学习应用本质的开发,格式化和后处理事件尤其未足。正之中间的假设都是都是有通常绝招的。

第1层layers.Input(shape= (124, 129, 1))叫读所写层,是受训样本的数据库构造。就是我们上一节凑转成16000在此之后,以求反转给出的(124, 129)这个构造。

最后一层layers.Dense(4),是读所写层。我们整天了“之前行”,“上回”,“左方”,“右”4个注册表类群,终究结果是4类,所以是4。

尾端基本通常后,这个基因序列Sequential就意味着:吃压缩算法,然后排出它是4个类群之中的哪一种。

那么正之中间我们就可以自己操作者了。Normalization是二阶。Conv2D是认真卷积。MaxPooling2D是认真池化。Dropout(0.25)是随机砍掉一定人口比例(此处是25%)的建模,以保证其健壮性。太快就此结束时,通过Flatten()将多维数据库拉平为线性数据库。之前头给个激活变数,收缩突触相沙,匆忙降落。最后,对送来Dense(4)。

这就借助于了,将上头16000个扬声器采样点,经过一系列转变成后,终究读所写为某个类群。

最后,进唯时受训和遗留假设。

model = create_model()cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath='model/model.ckpt', save_weights_only=True, save_best_only=True)history = model.fit( train_ds, validation_data=val_ds, epochs=50, callbacks=[cp_callback])

filepath='model/model.ckpt'暗示受训完转成后,读自取的偏移。save_weights_only=True只读自取权重数据库。save_best_only=True意为是只读自取极好的受训的结果。线程受训很最简单,线程model.fit,之中叶受训集、验证集、受训轮数、以及受训回退就可以啦。

2.5 沙载假设并预测

上一节之中,我们原则上了假设的遗留偏移,线程model.fit则会将结果遗留在也就是说是的偏移下。这就是我们终究要的产物:

我们可以沙载这些文档,这样就让我们的程序兼具了多年功力。可以现阶段来压缩算法认真预测。

model = create_model()if os.path.exists('model/model.ckpt.index'): model.load_weights('model/model.ckpt') labels = ['go', 'left', 'right', 'stop']# 压缩算法转码audio = get_audio_data('mysound.wav')audios = np.array([audio])predictions = model(audios)index = np.argmax(predictions[0])print(labels[index])

上头code之中,先以沙载了历史记录假设。然后,将我混音的一个mysound.wav文档进唯时格式化,方式就是上头说是的凑转成16000,然后通过间歇傅内都叶判别转成(124, 129)构造的反转数据库。这也是我们受训时的模样。

最后,把它读所写到假设。出于重力场,它会更进一步读所写这是'go'类群的音调指令。尽管这个假设,回事很难想到我这段美妙的声线。但是它也能比对出来,我警告了一个包被含'go'歌声优点的歌声。

以上,就是透过TensorFlow基本,借助于歌声类群的全过程。

如此一来次警告大家:敦促TensorFlow 2.6(2021年10在此之后特别版) + python 3.9。因为,全都用了很多新优点。旧旧特别版本是飞驰而今的,基本体今日TensorFlow各种找仅层。

扬声器类群这两项开源定址:

三、我们的合作

我带着转成果去找老张。老张呐喊了一会儿,不说是话。

我说是,老张啊,你就说是吧。你不说是话,我心内都没底,不明白会频发啥。

老张说是,外甥啊,实际上音调小车这个这两项,没啥创意。我昨天才明白,我们工人们老王,三年之前,自己一个人,就认真出来过了。说是完,老张又呐喊了。

我忍不住他说是,没人关系的。这个不唯,你就如此一来换回一个呗。

老张惊醒摇动头,眼睛之中闪着光,他说是:外甥,飞船方面的应用程序,你整天得定吗?!火星车也唯。

我不紧不忙地重新启动一站式,并把和光脑放于于包被内都。

我穿上鞋,然后拿上包被。打开门,回头跟老张说是了一句:外甥,三个翌年内,我们先以不联系了吧。

英特盐酸达泊西汀片效果怎么样
腱鞘炎怎么治疗
4岁儿童感冒能吃阿莫西林颗粒吗
感冒嗓子疼用什么消炎药
金笛新冠用药
友情链接