加载中…
个人资料
du00cs
du00cs
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,743
  • 关注人气:27
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

魔兽世界自动钓鱼系统的设计与实现 - 鱼上钩声音事件的提取(2)

(2013-04-17 16:58:01)
标签:

python

魔兽世界

系统设计与实现

钓鱼

分类: 编程实战

上一篇介绍了系统调用录音的过程,这一部分介绍后续部分,也是难点所在。

声音事件的描述

这一部分对我来说太难了!虽然知道声音事件的识别可以用机器学习的方法来做,但是首先把我难倒的就是声音在计算机中的表示是什么,怎样对它们抽取特征?如果想用分类的方法来做的话,训练集又如何得到?想想这些直接头大了。幸运的是在Google Scholar上面经过几次关键字改进得到了两篇文章,看完这两篇文章,虽然我不一点都不懂他们方法的具体实现,但是我竟然有思路了!这两篇文章一个是做音频分割与分类[1],第二作者就是多媒体检索的创始人张宏江,是他2002年在微亚时候的工作;另一篇是做音乐描述子[2]的,第二作者是Sony的,用过Sony或者更早的Sony Ericsson的应该都知道Track ID这个软件,听到好听但是不知道歌名的歌是可以用这个软件搜出来的!

两篇文章中所提到的描述特征很多,有很多与我想做的也息息相关,但是基本上都没看到具体怎么做,只是知道概念以及作用。这里只说一个我觉得比较好的特征Zero Cross Rate:

http://s2/bmiddle/439371b54da8ac1d975c1&690鱼上钩声音事件的提取(2)" TITLE="魔兽世界自动钓鱼系统的设计与实现 鱼上钩声音事件的提取(2)" />

T是窗口的长度,看起来像II{A}的部分代表满足条件则这部分值为1,否则为0。从文章中的描述来看,这一特征是可以很好的反映音乐与背景、音乐与人声的差别的,在这里对我录制的一段从钓鱼到上钩的过程的进行波形和ZCR值进行对比,可以发现两者还是有一定关系的。为什么不直接用波形呢?波形的高低受播放声音大小影响,区分能力不强。

http://s5/mw690/439371b54da8abb3234a4&690鱼上钩声音事件的提取(2)" TITLE="魔兽世界自动钓鱼系统的设计与实现 鱼上钩声音事件的提取(2)" />

最后从图上我找了一个非常弱非常弱的判断准则:连续7个窗口zcr均值大于0.4,标准差小于0.02http://www/uc/myshow/blog/misc/gif/E___7398ZH00SIGG.gif鱼上钩声音事件的提取(2)" TITLE="魔兽世界自动钓鱼系统的设计与实现 鱼上钩声音事件的提取(2)" />剩下的工作就很简单了,将前面做的工作应用到音频流中,所有代码其实基本上已经结束了。

声音事件在音频流中的识别

将前期工作的代码拼接起来,就完成了最终代码,还没有铺垫的代码多……识别成功!成功率?有待测试

# -*- coding: utf-8 -*-
"""
Created on Wed Apr 17 15:09:56 2013

@author: du00
"""

import pyaudio
import numpy as np


FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
CHUNK = int(RATE / 10)
RECORD_SECONDS = 20

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
               channels=CHANNELS,
               rate=RATE,
               input=True,
               frames_per_buffer=CHUNK)

print("* recording")

buf = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
   data = stream.read(CHUNK)
   wave_data = np.fromstring(data, dtype=np.short)
   wave_data.shape = -1, 2
   wave_data = wave_data.T
   left = wave_data[0]
   zcr = sum(left[0:CHUNK-1] * left[1:CHUNK] < 0)/(CHUNK-1)
   if len(buf) == 7:
       if np.mean(buf)>0.4 and np.std(buf) < 0.2:
           break
       buf.pop(0)
   buf.append(zcr)

print('Got a Bite!')

stream.stop_stream()
stream.close()
p.terminate
()



 

[1] L. Lu, H.-J. Zhang, and H. Jiang, “Content analysis for audio classification and segmentation,” Ieee Trans. Speech Audio Process., vol. 10, no. 7, pp. 504–516, 2002.

[2] F. Gouyon, F. Pachet, and O. Delerue, “On the use of zero-crossing rate for an application of classification of percussive sounds,” in Proceedings of the COST G-6 conference on Digital Audio Effects (DAFX-00), Verona, Italy, 2000.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有