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付近)を選択的に強調することで、音声の聞き取りやすさを改善する。周波数特性のみの調整を行う。

主要技術

参考文献

[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('音声明瞭化システムを終了しました')