[python] pcm 파일 오디오 노이즈 제거 / 데시벨 그래프

2023. 9. 26. 13:58python

오디오 노이즈를 제거하기 위해서 파이썬 라이브러리 noisereduce 를 사용했다.

 

[라이브러리 설치]

!pip install noisereduce

[노이즈 제거]

pcm 형식 음성 파일을 사용했다.

pcm 파일이라면 형식에 따라 

sample_width, channels, frame_rate 값 조정해줘야함. 

from pydub import AudioSegment
from noisereduce import reduce_noise

# .pcm 파일 불러오기 (16 비트, 16 kHz, Mono)
sample_width = 2  # 16 비트
channels = 1      # Mono
frame_rate = 16000  # 16 kHz

audio = AudioSegment.from_file("파일명.pcm", format="s16le", sample_width=sample_width, channels=channels, frame_rate=frame_rate)

# 오디오를 numpy 배열로 변환
audio_data = audio.get_array_of_samples()

# 잡음 제거
reduced_audio_data = reduce_noise(y=audio_data, sr=frame_rate)

# 처리된 오디오를 PyDub 형식으로 변환
reduced_audio = AudioSegment(
    reduced_audio_data.tobytes(),
    frame_rate=frame_rate,
    sample_width=sample_width,
    channels=channels
)

# 오디오 저장
reduced_audio.export("cleaned_audio.wav", format="wav")

# 오디오 재생 (잡음이 줄어든 파일)
from IPython.display import Audio
Audio("cleaned_audio.wav")​

 

[파형 그래프]

무음 구간을 구하는게 목적이라 오디오 파형을 시각화해줬다.

 

 

import matplotlib.pyplot as plt
import numpy as np

# 오디오 파일 로드
cleaned_audio = AudioSegment.from_file("cleaned_audio.wav")

# 오디오 데이터 가져오기
audio_data = np.array(cleaned_audio.get_array_of_samples())

# 시간 범위 생성 (초 단위)
time = np.arange(0, len(audio_data)) / frame_rate

# 파형 그리기
plt.figure(figsize=(12, 4))
plt.plot(time, audio_data)
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")
plt.title("Audio Waveform")
plt.grid(True)
plt.show()

[데시벨 출력하기]

그래프 말고 정확한 데시벨 수치를 보고싶다하면 이 코드 사용하기

시간 간격을 줄이고 싶다면 interval 변수 조정해주면 됨.

나는 0.1로 해줬다.

import numpy as np

# 오디오 파일 로드
cleaned_audio = AudioSegment.from_file("cleaned_audio.wav")

# 오디오 데이터 가져오기
audio_data = np.array(cleaned_audio.get_array_of_samples())

# 데시벨 값 계산
amplitudes = np.abs(audio_data)
decibels = 20 * np.log10(amplitudes + 1e-9)  # +1e-9는 로그 함수의 분모가 0이 되지 않게 하기 위해 추가합니다.

# 시간 범위 생성 (초 단위)
time = np.arange(0, len(audio_data)) / frame_rate

# 간격 설정
interval = 0.1  # 0.1초 간격으로 출력

# 데시벨 값 출력
for t, dB in zip(time[::int(frame_rate*interval)], decibels[::int(frame_rate*interval)]):
    print(f"Time: {t:.2f} s, Decibels: {dB:.2f} dB")

 

음수에 가까울수록 소리가 감쇄하는 것.

사진과 같이 -180dB 인 경우는 아주 작은 소리, 무음에 가깝다고 볼 수 있다.

 

'python' 카테고리의 다른 글

Colab 환경 설치된 패키지 보기  (0) 2023.11.23
[STT] open api로 stt 해보기  (0) 2023.09.26
[python] pcm 파일 wav로 바꾸기  (0) 2023.09.26
[python]가상환경 생성하기  (0) 2023.09.26