はじめに
音声ファイルを処理し、それを文字に起こし、ベクトル化してRAGを構築する。このフローの中で、音声ファイルのノイズによるRAGの検索精度悪化を避けよう、というのが今回の実験のモチベーションです。
本記事では、音声ファイルに対して複数のノイズ除去手法を適用し、その聞こえ方と文字起こし時の精度にどのような違いが出るかを比較します。音声ファイルはwav形式で、文字起こしにはAssemblyAIを用いています。
比較対象としたのは、統計的手法のnoisereduce、STFTを用いたlibrosa処理、古典的なバンドパスフィルタ(scipy)、深層学習モデルのdemucsという4種類です。
比較・検証
まず、各手法について簡単に説明します。
- noisereduce
- Python製のシンプルなノイズリダクションライブラリで、音声信号から統計的にノイズ成分を除去
import noisereduce as nr
denoised = nr.reduce_noise(y=data.astype(np.float32), sr=rate)
- librosa
- librosaで音声を短時間フーリエ変換(STFT)し、周波数領域で不要な成分をマスキングして除去する手法
import librosa, numpy as np
y, sr = librosa.load("input.wav", sr=None)
mag, phase = np.abs(librosa.stft(y)), np.angle(librosa.stft(y))
noise = np.mean(mag[:, :30], axis=1, keepdims=True)
denoised = np.maximum(mag - noise, 0) * np.exp(1j * phase)
y_denoised = librosa.istft(denoised)
- バンドパスフィルタ(scipy)
- scipyの信号処理ツールを使って特定の周波数帯域のみを通し、それ以外を除去する古典的な方法
import soundfile as sf
from scipy.signal import butter, lfilter
y, sr = sf.read("input.wav")
b, a = butter(5, [300/(sr/2), 3400/(sr/2)], btype='band')
y_filtered = lfilter(b, a, y)
sf.write("output.wav", y_filtered, sr)
- demucs
- Meta(旧Facebook)が開発した深層学習ベースの音源分離モデル
import subprocess
subprocess.run([
"demucs",
"--two-stems", "vocals",
"--out", "output",
"input.wav"
], check=True)
各手法でのノイズ除去後の聞こえ方
4つのノイズ除去手法を適用した後の音声を比較したところ、noisereduceは最も耳あたりが良く、クリアに聞こえる結果となりました。ただし、demucs・librosa・バンドパスフィルタについては、明確な差はあまり見られず、いずれもノイズ除去によって聞き取りやすさは一定向上していました。
文字起こしの精度
以下は今回行った処理を擬似的に簡潔に再現したものです。
import assemblyai as aai
aai.settings.api_key = "YOUR_API_KEY"
transcriber = aai.Transcriber()
config = aai.TranscriptionConfig(speaker_labels=True, language_code="ja")
transcript = transcriber.transcribe("input.wav", config=config)
for u in transcript.utterances:
print(f"スピーカー {u.speaker}: {u.text}")
AssemblyAIのSTTを用いて、各手法でノイズ除去後の音声を文字起こしした結果、全体的な認識精度には大きな差は見られませんでした。一方で、話者分離(speaker diarization)の精度には差があり、librosaを用いた処理が最も正確に話者を区別できていました。逆に、noisereduceは音質こそ良好でしたが、話者分離が正しく行われないケースが多く見られました。
最後に
本記事では、4つの異なるノイズ除去手法を用いて音声処理を行い、それぞれの聞こえ方や文字起こし精度への影響を比較しました。その結果、音質が最もクリアだったのはnoisereduceでしたが、文字起こしにおいてはlibrosaによる前処理が最も安定した話者分離精度を示しました。
そのため、今回のプロジェクトでは最終的にlibrosaを用いた前処理を採用し、AssemblyAIでの文字起こしの前段階として組み込みました。
なお、今回の評価は主に音声の主観的な聞こえ方やSTT出力の見た目に基づく定性的な判断にとどまっています。今後より信頼性の高い比較を行うためには、以下のような定量的な評価指標の導入が有効です。
- SNR(Signal-to-Noise Ratio):ノイズ除去前後の信号の明瞭さを数値化
- WER(Word Error Rate):文字起こしの誤り率(正解テキストとの比較)
- SAR/SIR(音源分離評価指標):demucsなどの音源分離性能評価にも使用可能
こうした評価指標を今後の検証に取り入れることで、より客観的かつ再現性のある音声処理フローの最適化が可能になると考えています。