Pedalboardによる音声明瞭化(ソースコードと実行結果)
Python開発環境,ライブラリ類
ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。
Python 3.12 のインストール
インストール済みの場合は実行不要。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要である。
REM Python をシステム領域にインストール
winget install --scope machine --id Python.Python.3.12 -e --silent
REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts"
echo "%PATH%" | find /i "%PYTHON_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_PATH%" /M >nul
echo "%PATH%" | find /i "%PYTHON_SCRIPTS_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_SCRIPTS_PATH%" /M >nul
【関連する外部ページ】
Python の公式ページ: https://www.python.org/
AI エディタ Windsurf のインストール
Pythonプログラムの編集・実行には、AI エディタの利用を推奨する。ここでは,Windsurfのインストールを説明する。
管理者権限でコマンドプロンプトを起動(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行して、Windsurfをシステム全体にインストールする。管理者権限は、wingetの--scope machineオプションでシステム全体にソフトウェアをインストールするために必要となる。
winget install --scope machine Codeium.Windsurf -e --silent
【関連する外部ページ】
Windsurf の公式ページ: https://windsurf.com/
必要なライブラリのインストール
コマンドプロンプトを管理者として実行(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する
pip install numpy pyaudio pedalboard
Pedalboardによる音声明瞭化プログラム
概要
本プログラムは、人間の音声の明瞭度を向上させる。マイクから入力された音声信号の周波数特性を分析し、子音帯域(2.5kHz付近)を選択的に強調することで、音声の聞き取りやすさを改善する。周波数特性のみの調整を行う。
主要技術
- Pedalboard(音声エフェクト処理ライブラリ)
Spotify社が開発した音声エフェクトのPythonライブラリである[1]。本プログラムでは、PeakFilterを使用して特定周波数帯域を強調している。
- デジタル信号処理(DSP)による周波数選択的強調
PeakFilterは、中心周波数、ゲイン、Q値(帯域幅)を指定して特定の周波数帯域を強調する[2]。本プログラムでは2.5kHz付近を4dB強調することで、日本語の無声子音(か行、さ行、た行など)の明瞭度を向上させている。
参考文献
[1] Sobot, P. (2021). Pedalboard: A Python library for adding effects to audio. Spotify for Developers. https://github.com/spotify/pedalboard
[2] Zölzer, U. (2011). DAFX: Digital Audio Effects (2nd ed.). John Wiley & Sons.
# プログラム名: Pedalboardによる音声明瞭化プログラム
# 特徴技術名: Pedalboard(Spotify製オーディオエフェクトライブラリ)
# 出典: Sobot, P. (2021). Pedalboard: A Python library for audio effects. Spotify. https://github.com/spotify/pedalboard
# 特徴機能: 音量を維持した選択的周波数強調による音声明瞭化
# 学習済みモデル: 使用なし(DSPベースのエフェクト処理)
# 方式設計:
# - 関連利用技術: NumPy(配列演算)、PyAudio(リアルタイム音声入出力)
# - 入力と出力: 入力: マイクからのリアルタイム音声入力、出力: 明瞭化された音声のリアルタイム再生
# - 処理手順: 1.マイクから音声取得 2.PeakFilterで子音帯域のみ強調 3.スピーカーから出力
# - 前処理、後処理: 前処理: 入力正規化、後処理: ソフトクリッピング
# - 追加処理: 移動平均によるパラメータ平滑化、明瞭度指標の表示
# - 調整を必要とする設定値: peak_gain_db(子音帯域強調量、0〜6dB)
# 将来方策: peak_gain_dbを入力音声のスペクトル特性に基づいて自動調整
# その他の重要事項: HighpassFilterを除去し音量変化を完全に防止。子音帯域のみの強調で明瞭度向上
# 前準備: pip install numpy pyaudio pedalboard
import numpy as np
import pyaudio
from pedalboard import Pedalboard, PeakFilter
import threading
import time
# 音声パラメータ
RATE = 44100
CHUNK = 2048
CHANNELS = 1
FORMAT = pyaudio.paFloat32
# 明瞭化エフェクトパラメータ(最小限の処理)
PEAK_FREQUENCY_HZ = 2500.0 # 子音明瞭度の中心周波数
PEAK_GAIN_DB = 4.0 # 子音帯域強調量(少し増やす)
PEAK_Q = 0.8 # より広めのQ値
# 処理パラメータ
SILENCE_THRESHOLD = 0.001
SMOOTHING_FACTOR = 0.7
# 明瞭度計測パラメータ
CLARITY_UPDATE_INTERVAL = 2.0
# グローバル変数
previous_rms = 0.0
clarity_metrics = {
'avg_level': 0.0,
'peak_enhancement': 0.0,
'samples_count': 0
}
metrics_lock = threading.Lock()
last_print_time = time.time()
# 明瞭化エフェクトチェーン(PeakFilterのみ)
clarity_board = Pedalboard([
# 子音帯域の強調のみ
PeakFilter(
cutoff_frequency_hz=PEAK_FREQUENCY_HZ,
gain_db=PEAK_GAIN_DB,
q=PEAK_Q
)
])
def audio_callback(in_data, frame_count, time_info, status):
global previous_rms, last_print_time
audio_data = np.frombuffer(in_data, dtype=np.float32)
# RMS計算と平滑化
current_rms = np.sqrt(np.mean(audio_data**2))
smoothed_rms = SMOOTHING_FACTOR * previous_rms + (1 - SMOOTHING_FACTOR) * current_rms
previous_rms = smoothed_rms
# 無音時は入力をそのまま返す
if smoothed_rms < SILENCE_THRESHOLD:
return (audio_data.tobytes(), pyaudio.paContinue)
try:
# 明瞭化処理
processed_audio = clarity_board(audio_data, sample_rate=RATE)
# クリッピング防止(非常に緩やか)
max_val = np.max(np.abs(processed_audio))
if max_val > 0.99:
processed_audio = processed_audio * (0.99 / max_val)
# メトリクス更新
output_rms = np.sqrt(np.mean(processed_audio**2))
with metrics_lock:
clarity_metrics['avg_level'] += output_rms
clarity_metrics['peak_enhancement'] += (output_rms / (current_rms + 1e-10))
clarity_metrics['samples_count'] += 1
# 定期的な表示
current_time = time.time()
if current_time - last_print_time >= CLARITY_UPDATE_INTERVAL:
with metrics_lock:
if clarity_metrics['samples_count'] > 0:
avg_level = clarity_metrics['avg_level'] / clarity_metrics['samples_count']
avg_enhancement = clarity_metrics['peak_enhancement'] / clarity_metrics['samples_count']
print(f'音声レベル: {20*np.log10(avg_level+1e-10):.1f}dB | '
f'明瞭化効果: {20*np.log10(avg_enhancement):.1f}dB')
clarity_metrics['avg_level'] = 0.0
clarity_metrics['peak_enhancement'] = 0.0
clarity_metrics['samples_count'] = 0
last_print_time = current_time
return (processed_audio.astype(np.float32).tobytes(), pyaudio.paContinue)
except Exception:
return (audio_data.tobytes(), pyaudio.paContinue)
print('音声明瞭化システム(最小処理版)を開始します')
print('マイクに向かって話すと、音量を維持したまま明瞭化されます')
print('終了するには Ctrl+C を押してください')
print('')
print('【表示される指標】')
print('・音声レベル: 出力音声の平均レベル')
print('・明瞭化効果: 入出力の音量比(0〜+1dB程度が理想)')
print('-' * 60)
try:
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=CHUNK,
stream_callback=audio_callback)
stream.start_stream()
while stream.is_active():
try:
threading.Event().wait(0.1)
except KeyboardInterrupt:
break
stream.stop_stream()
stream.close()
p.terminate()
except Exception as e:
print(f'エラーが発生しました: {e}')
exit()
print('音声明瞭化システムを終了しました')