iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python利用不到一百行代码实现一个小siri
  • 119
分享到

python利用不到一百行代码实现一个小siri

代码python一百行 2022-06-04 18:06:45 119人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

前言 如果想要容易理解核心的特征计算的话建议先去看看我之前的听歌识曲的文章,传送门:Http://www.lsjlt.com/article/97305.htm 本文主要是实现了一个简单的命令词识别程序,算

前言

如果想要容易理解核心的特征计算的话建议先去看看我之前的听歌识曲的文章,传送门:Http://www.lsjlt.com/article/97305.htm

本文主要是实现了一个简单的命令词识别程序,算法核心一是提取音频特征,二是用DTW算法进行匹配。当然,这样的代码肯定不能用于商业化,大家做出来玩玩娱乐一下还是不错的。

设计思路

就算是个小东西,我们也要先明确思路再做。音频识别,困难不小,其中提取特征的难度在我听歌识曲那篇文章里能看得出来。而语音识别难度更大,因为音乐总是固定的,而人类说话常常是变化的。比如说一个“芝麻开门”,有的人就会说成“芝麻开门”,有的人会说成“芝麻开门”。而且在录音时说话的时间也不一样,可能很紧迫的一开始录音就说话了,也可能不紧不慢的快要录音结束了才把这四个字说出来。这样难度就大了。

算法流程:

查看图片

特征提取

和之前的听歌识曲一样,同样是将一秒钟分成40块,对每一块进行傅里叶变换,然后取模长。只是这不像之前听歌识曲中进一步进行提取峰值,而是直接当做特征值。

看不懂我在说什么的朋友可以看看下面的源代码,或者看听歌识曲那篇文章。

DTW算法

DTW,Dynamic Time Warping,动态时间归整。算法解决的问题是将不同发音长短和位置进行最适合的匹配。

算法输入两组音频的特征向量: A:[fp1,fp2,fp3,......,fpM1] B:[fp1,fp2,fp3,fp4,.....fpM2]
A组共有M1个特征,B组共有M2个音频。每个特征向量中的元素就是之前我们将每秒切成40块之后FFT求模长的向量。计算每对fp之间的代价采用的是欧氏距离。

设D(fpa,fpb)为两个特征的距离代价。

那么我们可以画出下面这样的图

查看图片

我们需要从(1,1)点走到(M1,M2)点,这会有很多种走法,而每种走法就是一种两个音频位置匹配的方式。但我们的目标是走的总过程中代价最小,这样可以保证这种对齐方式是使我们得到最接近的对齐方式。

我们这样走:首先两个坐标轴上的各个点都是可以直接计算累加代价和求出的。然后对于中间的点来说D(i,j) = Min{D(i-1,j)+D(fpi,fpj) , D(i,j-1)+D(fpi,fpj) , D(i-1,j-1) + 2 * D(fpi,fpj)}

为什么由(i-1,j-1)直接走到(i,j)这个点需要加上两倍的代价呢?因为别人走正方形的两个直角边,它走的是正方形的对角线啊

按照这个原理选择,一直算到D(M1,M2),这就是两个音频的距离。

查看图片

查看图片

查看图片

源代码和注释


# coding=utf8
import os
import wave
import dtw
import numpy as np
import pyaudio

def compute_distance_vec(vec1, vec2):
 return np.linalg.nORM(vec1 - vec2) #计算两个特征之间的欧氏距离

class record():
 def record(self, CHUNK=44100, FORMAT=pyaudio.paint16, CHANNELS=2, RATE=44100, RECORD_SECONDS=200,
    WAVE_OUTPUT_FILENAME="record.wav"):
  #录歌方法
  p = pyaudio.PyAudio()
  stream = p.open(format=FORMAT,
      channels=CHANNELS,
      rate=RATE,
      input=True,
      frames_per_buffer=CHUNK)
  frames = []
  for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
   data = stream.read(CHUNK)
   frames.append(data)
  stream.stop_stream()
  stream.close()
  p.terminate()
  wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
  wf.setnchannels(CHANNELS)
  wf.setsampwidth(p.get_sample_size(FORMAT))
  wf.setframerate(RATE)
  wf.writeframes(''.join(frames))
  wf.close()

class voice():
 def loaddata(self, filepath):
  try:
   f = wave.open(filepath, 'rb')
   params = f.getparams()
   self.nchannels, self.sampwidth, self.framerate, self.nframes = params[:4]
   str_data = f.readframes(self.nframes)
   self.wave_data = np.fromstring(str_data, dtype=np.short)
   self.wave_data.shape = -1, self.sampwidth
   self.wave_data = self.wave_data.T #存储歌曲原始数组
   f.close()
   self.name = os.path.basename(filepath) # 记录下文件名
   return True
  except:
   raise IOError, 'File Error'

 def fft(self, frames=40):
  self.fft_blocks = [] #将音频每秒分成40块,再对每块做傅里叶变换
  blocks_size = self.framerate / frames
  for i in xrange(0, len(self.wave_data[0]) - blocks_size, blocks_size):
   self.fft_blocks.append(np.abs(np.fft.fft(self.wave_data[0][i:i + blocks_size])))
 @staticmethod
 def play(filepath):
  chunk = 1024
  wf = wave.open(filepath, 'rb')
  p = pyaudio.PyAudio()
  # 播放音乐方法
  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
      channels=wf.getnchannels(),
      rate=wf.getframerate(),
      output=True)
  while True:
   data = wf.readframes(chunk)
   if data == "": break
   stream.write(data)
  stream.close()
  p.terminate()
if __name__ == '__main__':
 r = record()
 r.record(RECORD_SECONDS=3, WAVE_OUTPUT_FILENAME='record.wav')
 v = voice()
 v.loaddata('record.wav')
 v.fft()
 file_list = os.listdir(os.getcwd())
 res = []
 for i in file_list:
  if i.split('.')[1] == 'wav' and i.split('.')[0] != 'record':
   temp = voice()
   temp.loaddata(i)
   temp.fft()
   res.append((dtw.dtw(v.fft_blocks, temp.fft_blocks, compute_distance_vec)[0],i))
 res.sort()
 print res
 if res[0][1].find('open_qq') != -1:
  os.system('C:programTencentQQBinQQScLauncher.exe') #我的QQ路径
 elif res[0][1].find('zhimakaimen') != -1:
  os.system('chrome.exe')#浏览器的路径,之前已经被添加到了Path中了
 elif res[0][1].find('play_music') != -1:
  voice.play('C:datamusic\audio\audio\ (9).wav') #播放一段音乐
 # r = record()
 # r.record(RECORD_SECONDS=3,WAVE_OUTPUT_FILENAME='zhimakaimen_09.wav')

事先可以先用这里的record方法录制几段命令词,尝试用不同语气说,不同节奏说,这样可以提高准确度。然后设计好文件名,根据匹配到的最接近音频的文件名就可以知道是哪种命令,进而自定义执行不同的任务

这是一段演示视频:http://www.iqiyi.com/w_19ruisynsd.html

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

--结束END--

本文标题: python利用不到一百行代码实现一个小siri

本文链接: https://www.lsjlt.com/news/13625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言用八百行代码实现一个JSON解析器
    目录前言实现原理词法分析提前检查生成 JSONObject 树总结前言 之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,...
    99+
    2024-04-02
  • Python一行代码实现一个文件服务器
    简述 Python有很多简单的工具库可用,其中有一个非常实用的工具库: SimpleHTTPServer 一行代码建立一个简单的python HTTP文件服务器 使用方法 $python -m SimpleHTTPServer S...
    99+
    2023-01-31
    代码 文件服务器 Python
  • 一百多行代码实现react拖拽hooks
    前言 源码总共也就一百多行,看完这个大致可以理解一些成熟的react拖拽库的实现思路,比如react-dnd,然后你上手这些库的时候就非常快了。 使用hooks实现的大致效果动图如...
    99+
    2024-04-02
  • 一行 Python 代码实现并行
    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。...
    99+
    2023-05-14
    Python
  • 如何利用一行python代码实现灰度图抠图
    这篇“如何利用一行python代码实现灰度图抠图”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何利用一行python代码实...
    99+
    2023-06-30
  • 百闻不如一码!手把手教你用Python搭一个Transformer
    大数据文摘出品编译:林安安、钱天培与基于RNN的方法相比,Transformer 不需要循环,主要是由Attention 机制组成,因而可以充分利用python的高效线性代数函数库,大量节省训练时间。可是,文摘菌却经常听到同学抱怨,Tran...
    99+
    2023-06-02
  • 用pycharm怎么运行一个python代码
    在 pycharm 中运行 python 代码需要以下步骤:确保 pycharm 和 python 解释器已正确设置。打开要运行的代码文件。选择用于运行代码的运行配置。通过“运行文件”或...
    99+
    2024-04-17
    python pycharm
  • 利用Java代码写一个并行调用模板
    目录前言:1. 一个串行调用的例子2. CompletionService实现并行调用3. 抽取通用的并行调用方法4. 代码思考以及设计模式应用5. 思考总结前言: 本文主要介绍内容...
    99+
    2024-04-02
  • 怎么用一行代码实现Python并行处理
    今天小编给大家分享一下怎么用一行代码实现Python并行处理的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。传统的例子简单搜索...
    99+
    2023-06-27
  • python图像处理-利用一行代码实现灰度图抠图
    目录一行代码实现灰度图抠图Python抠图程序源码准备程序构思完整代码截图如下,每条语句均有功能注释一行代码实现灰度图抠图 抠图是ps的最基本技能,利用python可以实现用一行代码...
    99+
    2024-04-02
  • 又一个Python神器,不写一行代码,就可以调用Matplotlib绘图!
    sviewgui介绍sviewgui是一个基于 PyQt 的 GUI,用于 csv 文件或 Pandas 的 DataFrame 的数据可视化。此 GUI 基于 matplotlib,您可以通过多种方式可视化您的 csv 文件。主要特点:Ⅰ...
    99+
    2023-05-14
    代码 Python Matplotlib
  • Python实际案例演示:一行 Python代码实现并行
    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常...
    99+
    2023-06-01
  • Python爬虫教程:200行代码实现一个滑动验证码
    Python爬虫教程:教你用200行代码实现一个滑动验证码做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动、点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个...
    99+
    2023-06-02
  • 用python实现一个让人戒不掉的百变款消消乐
    导语 每日游戏更新系列——今天带大家解锁消消乐小游戏! 一天深夜,我像往常一样快乐地遨游在互联网的海洋里,猝不及防地接到了一个电话。 屏幕上一个触目惊心的大字:妈。 ​ ...
    99+
    2024-04-02
  • 怎么使用Python一行代码实现AI换脸
    本文小编为大家详细介绍“怎么使用Python一行代码实现AI换脸”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Python一行代码实现AI换脸”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。AI换脸,1行...
    99+
    2023-07-05
  • Java怎么利用反射实现动态运行一行或多行代码
    这篇文章主要介绍“Java怎么利用反射实现动态运行一行或多行代码”,在日常操作中,相信很多人在Java怎么利用反射实现动态运行一行或多行代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么利用反射实...
    99+
    2023-07-05
  • 关于Java利用反射实现动态运行一行或多行代码
    Talk is cheap, show me the code! 先来看代码: public class TestEval { public static void main(St...
    99+
    2023-05-14
    Java反射 反射实现动态运行 动态运行代码
  • 70行Python代码实现一个桌面自动翻译工具
    目录PySimpleGUI是什么?使用步骤引入库构建爬虫url构建翻译函数GUI搭建逻辑执行语句界面效果总结工作上经常需要与外国友人邮件沟通,奈何工作电脑没有安装有道词典一类的翻译软...
    99+
    2024-04-02
  • Python:一行代码实现的好玩的东西
    1.小浪漫() print('\n'.join([''.join([('lovelovelove'[(x-y)%12]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3&l...
    99+
    2023-01-31
    好玩 东西 代码
  • 教你用一行Python代码实现GUI图形界面
    目录一、选择文件夹二、选择文件三、选择日期四、输入文本五、弹窗无按钮六、弹窗无标题七、弹窗只有OK按钮八、弹窗只有Error按钮(红色)九、显示通知窗口十、弹窗选择十一、自定义弹窗实...
    99+
    2023-01-03
    Python GUI图形界面 Python 图形界面
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作