于方军 贾刚
声音文件可以简单看是一组频率、响度、音色构成的数据,这些数据遵从一定的规律按照时间维度组织起来,就构成了音乐和语言,由于增加了时间维度,所以它不像图像那样用一张纸就能保存下来。在物理学中,关于声音的描述是它由物体振动产生的,振动的本质是位移关于时间的函数。在现实生活中,听到的声音信号都是随时间连续变化的,这种信号叫模拟信号,而计算机存储和使用的都是数字信号,所以需要把模拟信号转化成数字信号后才能在计算机中使用。
本文将以声音数据为核心,探寻如何对声音进行数字表示与处理,并通过开源硬件实验让学生体验音乐的构成。
● 声音编码:模拟声音的数字化过程
模拟声音转化为数字信号分为采样、量化、编码三个过程,如图1所示。在计算机上录音就是把模拟声音信号转换成数字信号,而播放时则是把数字信号还原成模拟信号输出,这两个过程一般通过计算机上配置的声卡来实现。采样过程是按照一定的时间间隔在连续的波上进行间隔取值,如图1取了10个样。1秒钟采样次数称为采样频率,常用采样频率有8kHz、11.025kHz、32kHz、44.1kHz、48kHz等,8kHz就是1秒钟采样8000次,采样频率越高,声音的还原就越真实越自然,但数据量就会越大。量化过程就是给纵坐标定一个刻度,记录每个采样的纵坐标值。编码过程是将每个量化后的样本值转换成二进制编码。而整个数字化过程就是将所有样本二进制编码连起来存储在计算机上,这样就把模拟信号转换成了数字信号。
● 声音读取:用程序读取一段音频文件
标准的Python包含Wave库,且支持wav格式的音频文件的读写,wav文件由头部信息和音频采样数据构成,前44个字节为头部信息,包括声道数、量化位数、采样频率、采样点数等信息,后部为音频采样数据。用Python读取Scratch图形化编程中的小猫叫文件Meow.wav的相关参数,如图2所示。
f.getparams()可以获取音频的属性参数,其中比较关键的是声道数(nchannels)、量化位数(sampwidth)、采样频率(framerate)、采样点数(nframes)等,本音频文件是1个声道,量化位数是2B(也就是用2个字节16位二进制数据表示声音纵坐标),采样频率为11025,一共采样6512个数据点。利用这些数据我们可以计算声音文件的一些信息,如用采样数据点数除以采样频率:6512/11025=0.5906,得到声音播放时长约为0.59秒。接着,用每个采样点的时间作为横坐标,每个时间点的声音数据作为纵坐标,就能做出声音波形,如图3所示。
● 声音修改:观察声音变化
可以用代码改变数组中某一段采样点数值,如1000~1500采样点值都改为0(如图4),重新绘制波形文件后会发现波形图像中间少了一段,重新生成wav文件播放,会听到中间有一段是没有声音的。
● 声音重写:用计算机数据方式生成音乐
下面,用wave库写一段音乐(歌曲《两只老虎》的第一句),如下页图5所示。
代码中先定义一个写音符函数,函数包含每个音符时长、音调、采样频率、文件、音量、量化位数6个参数。在写入lzlh.wav文件时,要把声道数、采样频率、量化位数规定好,写入文件头中,完成后可以用播放器打开生成文件试听效果。
● 声音交互:用掌控板做一个趣味钢琴
用掌控板模拟钢琴演奏,是通过触摸p、y、t、h、o、n按键,让蜂鸣器发出Do、Re、Mi、Fa、So、La的声音。如果要做得更有趣味性,可以在掌控板的OLED屏上显示模拟钢琴图片,并在钢琴键上显示提示音符。为了确定“钢琴”是否按下,按的是哪一个音符,可以在触摸按键时在对应位置显示模拟手指。
为了简化代码,我们只显示按键演奏对应音符部分代码,代码用mPython完成,如图6所示,通过对比图形化代码块和纯代码编程,学生更容易理解程序的逻辑构成,并发现每一个音符对应一组数据,如C4中音Do对应(262,500),代表该音符频率是262hz时长是500毫秒,完成后就可以用它弹奏简单乐曲。
至此,从读取、修改、重写三个维度展现了数据的编码、改写、仿真的过程,最后通過一个创客作品完成了声音交互的作品的设计,如图7所示。通过本案例实验,学生会发现声音文件的处理与图像文件的处理有着相同的方式,都需要把模拟信号转成计算机识别的数字信号,转换成相关的二进制编码。
数字技术的发展给我们提供了一种更好地处理信息的方式。把各种信息转换为二进制代码的形式会更方便保存和远距离传播;反之,进行模拟输出时还要经过一个数模转换的过程。理解了这两个过程,学生就会更好地理解基于计算机技术的人工智能是如何感知周围环境信息并做出反应的。这也是进一步理解语音识别相关技术的基础。