[python] pcm 파일 오디오 노이즈 제거 / 데시벨 그래프
2023. 9. 26. 13:58ㆍpython
오디오 노이즈를 제거하기 위해서 파이썬 라이브러리 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 |