语音识别(一):特征抽取~1.1 抽样(sampling)和量化(quantization)

1. 采样(sampling):一个信号通过度量它在特定时刻的振幅来进行抽样。

  采样的目的是还原出声音的波形。在足够密集的采样频率下,人声的每个波形都能有多于两个的采样,这样的采样记录下说话人声音的频率和振幅(amplitude)。

  在高频声音波形下,每个波形可能只有2-3个采样;而在低频声音波形下,每个波形可能有5-6个采样,每个采样宽度范围设定好,如paInt16。这样就可以在采样率固定的情况下,体现出声音波形的高低频/音高、高低振幅/响度。

----拓展:

  • 波形图,即人说话的声波,横轴:时间;纵轴:振幅
  • 声谱图,横轴:频度,纵轴:振幅
  • 频谱图,横轴:时间,纵轴:频度

----拓展:声波特征:频度(frequency)和振幅(amplitude)

  • 频度(频率),又称为周(cycle):是1s之内完整波重复的次数,如:某段音频在0.11s之内有28个完整的波形,那波的频度是255hz或255周
  • 振幅,表示空气压力变化的大小。正轴表示该时刻空气压力比较高,0值表示空气压力正常,负值表示低于空气压力(我也不知道他们怎么测得)
  • 感知特性:音高(pitch)和响度(loudness)。音高与频度有关的感知特性;响度是与振幅有关的感知特性
    • ----[转]负分贝:声强小于2×10-5Pa的声音响度的都为负分贝数了。就像开尔文温标转化为摄氏温标一样,开尔文温标没有负数,摄氏温标就有负数了。例如,冬天哈尔滨室外温度-37℃,这个负数温度也是有温度的,只是温度低而已。有些人能够听到-10dB的声音呢!人耳就是天生的分贝转换器。潜水艇上的听音器可以听到水下100m外的一只虾吃食物的声音为-80dB,20英里外一个人的说话声为-30dB。所以,负分贝的声音是人耳听不到的,但是,它是客观存在的
  • 注意:实际音频中波形虽然完整连续,但他们不规则不均匀
  • 帧(frame):一般为10s-30ms,通常取20ms,在极短时间内,声音波形可以被认为是均匀的

----采样率(sampling rate):每秒提取的样本数目。常用的采样率有8000hz和16000hz

  • 根据奈奎斯特定理:采样频率不应低于声音信号最高频率的两倍,这样才能把以数字表达的声音还原成原来的声音。
  • 即:为了精确地测量声波,每周(每个声波)至少需要来嗯个采样:一个采样用于测来嗯声波的正侧部分,一个用于测量声波的负侧部分。如果每周的样本多于两个,将能够增加振幅的精确度,如果样本少于两个,声波就会遗漏部分频度
  • 即,可能测量到的最大频度的波九十那些频度等于采样率一般的波(因为每个波需要两个采样)
  • 如:人类语音的频度都低于10000hz,为了保证准确,必须有20000hz的抽样。注意:这里的10000hz是声波频度,而20000hz是采样次数频度,这两个虽然都是赫兹,但是别弄混了,一个是音频完整波形重复次数,一个是采样次数

2. 量化

量化就是用整形值存储采样测得的振幅值。在python~pyaudio中,有paInt8、16、32等采样位数,8比特bit采样能够给出的整形采样范围是-128~127,16位比特能够给出的整形范围是-32768~32767。

在pyaudio.stream录音采样过程中,

采样数sample_num=sample_rate * frame_duration_ms/1000   ;   采样字节大小/长度sample_size=sample_num * sample_width/8

采样宽度有8位、16位、32位,如果sample_width=paInt16,每个采样是两个字节,160个采样的sample_size是320,所以要注意frame_num和len(chunk),chunk = pyaudio.stream.read(frame_num)的长度。

参考:

  • Daniel Jurafsky, James H. Martin, 《speech and language processing》, 冯志伟, 译,《自然语言处理综论》,第七章--HMM与语音识别
  • https://blog.csdn.net/hh_1206/article/details/77540379

猜你喜欢

转载自blog.csdn.net/qq_33419476/article/details/81977989