Speech Audio Band-pass Filter

Audio tracks may be full of noises. The noise may be caused by a bad mic, a bad mic isolation, wind, rain, etc.

Human voice frequency ranges from 300Hz to 3000Hz.


Figure 1:\colon Bandpass filter

A bandpass filter can be applied to isolate the human voice frequency from noise.
A bandpass filter cuts all the noises out and keep human voices

To do so we can use ffmpeg:\colon

ffmpeg -i <input_file> -af "highpass=f=300, lowpass=f=3000" <output_file>

實際程式碼

從raw_input_dir 取的audio file,依序把檔案丟入bp_filter_audio,裡面是調用ffmpeg library,來執行band-pass filter。

import os
import pandas as pd

cwd = os.getcwd() + '/'
root_dir = cwd.replace('/codes/','')
raw_input_dir = '{}/audio/raw/'.format(root_dir)
if not os.path.isdir(raw_input_dir):
    os.makedirs(raw_input_dir)
filter_output_dir = '{}/audio/bp_filtered/'.format(root_dir)
if not os.path.isdir(filter_output_dir):
    os.makedirs(filter_output_dir)
    os.makedirs(filter_output_dir + 'paragraph/')
    os.makedirs(filter_output_dir + 'question/')
    os.makedirs(filter_output_dir + 'choices/')

def bp_filter_audio(input_filepath, output_filepath, fl=300, fh=3000):
    print(os.path.isfile(input_filepath))
    os.system('ffmpeg -i {} -af "highpass=f={}, lowpass=f={}" {}'.format(input_filepath,fl, fh, output_filepath))

# read Kaggle答題-編號不連續-空白.csv
print('read Kaggle答題-編號不連續-空白.csv ...')
df = pd.read_csv('../Kaggle答題-編號不連續-空白.csv')

# create ID array
speech_id = df['ID'].values

for i in speech_id:
    format_id = '{:0>7d}'.format(i)
    print('id {} filtering ...'.format(format_id))
    paragrah_id_filepath = 'paragraph/' + 'A{}.wav'.format(format_id)
    question_id_filepath = 'question/'  + 'B{}.wav'.format(format_id)
    choice_id_filepath   = 'choices/'   + 'C{}.wav'.format(format_id)

    bp_filter_audio(raw_input_dir + paragrah_id_filepath, filter_output_dir + paragrah_id_filepath)
    bp_filter_audio(raw_input_dir + question_id_filepath, filter_output_dir + question_id_filepath)
    bp_filter_audio(raw_input_dir + choice_id_filepath  , filter_output_dir + choice_id_filepath)


print('Finish!!')

[realization]

[segmentation 圖加工]

results matching ""

    No results matching ""