在优化语音输入、语音播放需求,需要整理一下音频的基本概念。
声音的原理
声音是振动产生的声波,通过介质(空气或固体、液体)传播并能被人或动物听觉器官所感知的波动现象。当物体振动时,同时伴随声音的产生。当振动体不再振动时,声音也随之停止。所以从生活的观察中可以归纳出:声音是由物体的振动所引起。
声音的频率一般会以赫兹表示,记为Hz,指每秒周期性震动的次数。
- 频率
音调越高,频率越大;音调越低,频率越小。(弦乐器中,越细的弦振动的频率越高,音调越高)
- 波长
音调越高,波长越短;音调越低,波长越长。(频率高波长短)
- 振幅
音量(响度)越大,振幅越大;音量越小,振幅越小。
人耳可以感知到的声音,其频率范围为20 Hz至20,000 Hz,在标准状况下的空气中,上述音波对应的波长从17 m至17 mm之间。
基本概念
PCM
PCM是脉冲编码调制,简单的说就是在录制音频是对连续音频信号抽样,以0和1的数字形式记录,所以PCM不是连续音频;
Sample
In signal processing, sampling is the reduction of a continuous-time signal to a discrete-time signal.
译文: 在信号处理中,采样就是将连续时间的信号减少成离散时间的信号。
数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音,和我们的视频一样,视频其实就是用图片不断的采样组合而成。
Sample Rate
Sample Rate is the number of samples of audio carried per second.
译文: 采样率就是每秒中对音频采样的次数。
采样率表示音频信号每秒的数字快照数。该速率决定了音频文件的频率范围。采样率越高,数字波形的形状越接近原始模拟波形。低采样率会限制可录制的频率范围,这可导致录音表现原始声音的效果不佳。
Channel
即声道数(1-8个),声道的个数可以理解为有多少个采样点采样,采样点越多表示越多的表达方式。
单声道在声音处理过程中只有单数据流,而立体声则需要左、右声道的两个数据流。显然,立体声的效果要好,但相应的数据量要比单声道的数据量加倍。
Audio bit depth
In digital audio using pulse-code modulation (PCM), bit depth is the number of bits of information in each sample, and it directly corresponds to the resolution of each sample.
译文 : 在使用脉冲编码调制(PCM)的数字音频中,bit depth是每个Sample(采样)点占用的位数,并且它直接对应于每个采样的分辨率。
Audio bit depth一般为16位,即采样时用16位来表示一个音频采样点.
Bit Rate
比特率是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,传送数据速度越快。声音中的比特率是指将模拟声音信号转换成数字声音信号后,单位时间内的二进制数据量,是间接衡量音频质量的一个指标。
Bit Rate(bps) = Sample Rate × Audio bit depth × Channel
即
比特率(bps) = 采样频率 × 采样位数 × 声道数
Frame
A frame is a collection of time-coincident samples. For instance, a linear PCM stereo sound file has two samples per frame, one for the left channel and one for the right channel.
译文 : frame 是离散采样的集合,例如,一个linear PCM stereo sound 文件有中每个frame中有两个采样,分别来自左声道和右声道。
frame是最小单位时间点包含的一个或多个声音采样,最小单位时间点取决于声音采样设备,是一个时间点多个采样的集合。
Packet
A packet is a collection of one or more contiguous frames. A packet defines the smallest meaningful set of frames for a given audio data format, and is the smallest data unit for which time can be measured. In linear PCM audio, a packet holds a single frame. In compressed formats, it typically holds more; in some formats, the number of frames per packet varies.
译文: Packet是一个或者多个连续frame的集合。对于一个给定的音频数据格式,Packet定义了定义了最小有意义的frame集合,并且是最小的可测量时间单位。
下图展示了Packet、Frame和Sample的关系。
在未压缩的音频中,一个Packet只有一个frame;
在压缩的音频中,一个Packet是不可在分割的压缩数据块,例如在一个AAC格式的Packet中就包含了1024个采样帧;
iOS录音基本单位
在微信项目中有大量场景使用到CoreAudio,基本概念先围绕基本的数据类型介绍
AudioStreamBasicDescription是在使用AudioQueue进行语音录音时要传给AudioQueueNewInput方法的结构体。
该结构体封装了一个音频流所有的基本描述信息,该数据结构对描述一个不同声道相同且恒定bitrate的音频格式是足够的,所以在微信中我们一般使用这个结构来描述。
1 | struct AudioStreamBasicDescription |
我对其中定义的数据进行了如下注释。
- mFormatID
一般用kAudioFormatLinearPCM,Linear-PCM是PCM的一种,具备比普通CD音频中的PCM数码流更高的位深和采样率,音质好很多。
- mSampleRate
The number of sample frames per second of the data in the stream.
- mChannelsPerFrame
The number of channels in each frame of data.
- mBytesPerFrame
The number of bytes in a single sample frame of data.
- mFramesPerPacket
The number of sample frames in each packet of data.
- mBytesPerPacket
The number of bytes in a packet of data.
结合日常录音开发中其中使用的设置。
Property | Definition | Example |
---|---|---|
mSampleRate | 采样率 | 16000 |
mFormatID | 格式 | kAudioFormatLinearPCM |
mFormatFlags | 标签格式 | kLinearPCMFormatFlagIsSignedInteger kLinearPCMFormatFlagIsPacked |
mBitsPerChannel | 语音每采样点占用位数 | [8/16/24/32] |
mChannelsPerFrame | 声道数 | 1:单声道;2:立体声 |
mBytesPerFrame | 每帧的byte数 | mBitsPerChannel * mChannelsPerFrame / 8 |
mFramesPerPacket | 每个Packet的帧数量 | 1 |
mBytesPerPacket | 每个Packet的Bytes数量 | mBytesPerFrame * mFramesPerPacket |