【Day2】声音的一些基本介绍

声音这东西实在是太自然了,所以我们很少去思考这东西的本质到底是什麽

简单的来复习一下声音是什麽,你可以到维基百科上面看看,写的是相当清楚 ; 而我是这样子理解它的,声音它就是来自於物体的波(振)动,它每秒钟振动的次数就叫做「频率」,我们把每秒钟振动一次称做1赫兹(1Hz)。

人类的耳朵,可以听见 20Hz ~ 20000Hz 之间的声音,所以我们处理资料当然也是这个范围的。

人的声音就是从我们的声道发出来的,人的声带透过震动发出声音之後再经过喉咙舌头牙齿等等 (合在一起叫做声道),最後发出我们听到的声音,又因为每个人的声道都不一样,所以你是很难找到两个人的声音完全一模一样的。

看一下声带长怎样吧 ~~~

稍微了解一下之後,我们在 Python 上面稍微看一下之後要面对的资料吧!

import librosa
import numpy as np
import matplotlib.pyplot as plt
signal, sample_rate = librosa.load("test.wav")

上面使用了 librosa 来读进音档,实际上你还可以用 scipy.io 或是 soundfile 等其他不同的 library 读,不同的 library 读进来的格式不一样,sample rate 也不一样,在看别人训练的 code 时候需留意一下。

如上图,左边是 librosa 读进来的,右边是 scipy.io 读进来的,你可以看到 scipy 有些许的蓝色,那是因为它是读双声道的,而且值也不一样,librosa 的有正规化过。

题外话 - Sample Rate 是什麽 ?

因为我们的声音是类比讯号,像是大自然所听到的声音或看到的影像等等这类的都是,它是一个连续值,但电脑并不能够真的去处理这样子的讯号,电脑只看得懂 0 跟 1 所以我们必须把它转成数位讯号,它是不连续的值,并且只用 0 跟 1 表示。

Sample Rate 的意思就是每秒钟对这个声音讯号的取样几次,标准 CD 音质的 Sample Rate 是 44.1Khz,意思就是在一秒钟的声音讯号被取样了 44100 次。

前面我们提到,声音它是来自於物体的波(振)动,如果它是一个波,那一定会有一些特徵可以被观察到,像是三角波跟方波你一眼就可以说出他们的差异了,但看一看上面的图,其实你很难去说明他们哪里不一样,那是因为在时域上我们看到的是信号如何随着时间变化,但其实很多物理元件的特性是随着讯号的频率而改变,像电容在低频时阻抗会变大,声音也是一样要在频率下才比较能够观察到它的特徵。

频谱图

想要画出频谱图来观察声音,首先我们先看一下频谱怎麽算的,基本上就只是单纯的把信号做傅立叶变换再取 DB 而已

scipy 跟 matplotlib 也有提供 function 让你使用

你可以看到左边 scipy 取的是 10 * log10 (因为他没帮你算 DB),但其实也有人会取 20 * log10,这个不一定,要看作者怎麽去使用。

梅尔频率

如果只是使用一般的声音频率的话,并不能够很完美的符合人的听觉感受,因此在1980年由 S.B. Davis和 Paul Mermelstein 提出了一种叫做梅尔刻度的一种非线性刻度单位,用以表示人耳实际上对音高变化的感受

这是因为人类的听觉是非线性的,

定义是将 1000Hz,且高於 40 分贝以上的声音信号,定做 1000 mel。

而在频率 500Hz 以上时,人耳每感觉到等量的音高变化,所需要的频率变化随频率增加而愈来愈大,如下图所示。

转换公式如下:
m=2595\log _{{10}}\left(1+{\frac  {f}{700}}\right)

不一定数字要如同上面的公式一样,历史上也有一些人提出不同的参数,像是把 700 改成 1000。

小结

明日我们会专注在介绍更多 Feature,谢谢正在看这篇文章的你。

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  [Day2] 断词介绍

>>:  Docker - Docker 执行 Maven

DAY 19 『 连接 API 实作 - 天气 APP 』Part1

今天会分享如何连接 API 实作出天气 APP。 具体的说是 HTTP 请求天气站点的 API,取得...

【Day 23】- 想用个人的帐号在 Discord 自动留言? 爬虫能做到!(实战 Selenium 在 Discord 文字频道内留言)

前情提要 前一篇带各位实作了 Instagram 点选朋友的所有文章,并按赞,再锁定并点击关闭按钮。...

Day29 Swagger

年轻人不要看到标题就兴奋好吗? 以目前前後端分离的趋势,前端及後端工程师势必会由两个人以上来担任,那...

【Day 14】海绵宝宝的神奇海螺:对 AWS 发出 Support

tags: 铁人赛 AWS business support codepipeline codebu...

Day 27: KMS key建立、轮换/ Secrets Manager secret轮换设定

KMS key建立 先决条件 你的帐号必须要有几个IAM的Policy,包含kms:CreateKe...