Python pydubで音響効果を追加: エコー、リバーブ、ピッチシフトの実装

## はじめに

音声編集において、エコー、リバーブ、ピッチシフトなどの音響効果は非常に重要です。これらの効果を適切に使用することで、音声や音楽に深みや臨場感を与えることができます。本記事では、Pythonのpydubライブラリを使用して、これらの音響効果を実装する方法を紹介します。

## 前提条件

この記事は、pydubの基本的な使い方を理解していることを前提としています。まだpydubをインストールしていない場合は、以下のコマンドでインストールしてください：

```bash
pip install pydub
```

また、一部の効果にはnumpyを使用するので、以下のコマンドでインストールしてください：

```bash
pip install numpy
```

## 1. エコー効果の実装

エコーは、元の音声が遅延して繰り返される効果です。pydubを使用して簡単なエコー効果を実装できます。

```python
from pydub import AudioSegment

def add_echo(sound, delay, num_echos, decay):
    echo = sound.fade_out(duration=decay)
    for i in range(num_echos):
        echo_delay = delay * (i + 1)
        echo_decay = decay * (num_echos - i)
        delayed_echo = AudioSegment.silent(duration=echo_delay) + echo.fade_out(duration=echo_decay)
        sound = sound.overlay(delayed_echo)
    return sound

# 音声ファイルを読み込む
audio = AudioSegment.from_file("input.mp3", format="mp3")

# エコー効果を追加
echo_audio = add_echo(audio, delay=500, num_echos=3, decay=1000)

# 結果を保存
echo_audio.export("echo_output.mp3", format="mp3")
```

このコードでは、`delay`はエコーの遅延時間（ミリ秒）、`num_echos`はエコーの繰り返し回数、`decay`はエコーの減衰時間（ミリ秒）を表します。

## 2. リバーブ効果の実装

リバーブは、音が空間内で反射して生じる残響効果です。完全なリバーブ効果の実装は複雑ですが、ここでは簡易的なリバーブ効果を作成します。

```python
from pydub import AudioSegment
import numpy as np

def add_reverb(sound, reverberance=50, damping=50, room_scale=75):
    # パラメータを正規化
    reverberance = max(0, min(100, reverberance)) / 100
    damping = max(0, min(100, damping)) / 100
    room_scale = max(0, min(100, room_scale)) / 100
    
    # 音声データを numpy 配列に変換
    samples = np.array(sound.get_array_of_samples())
    
    # リバーブのパラメータを設定
    delay_samples = int(sound.frame_rate * room_scale * 0.1)
    decay = 1 - damping
    
    # リバーブを適用
    reverb_samples = np.zeros_like(samples)
    for i in range(len(samples)):
        if i < delay_samples:
            reverb_samples[i] = samples[i]
        else:
            reverb_samples[i] = samples[i] + reverberance * decay * reverb_samples[i - delay_samples]
    
    # 結果を AudioSegment に戻す
    reverb_audio = sound._spawn(reverb_samples.tobytes())
    return reverb_audio

# 音声ファイルを読み込む
audio = AudioSegment.from_file("input.mp3", format="mp3")

# リバーブ効果を追加
reverb_audio = add_reverb(audio, reverberance=60, damping=40, room_scale=80)

# 結果を保存
reverb_audio.export("reverb_output.mp3", format="mp3")
```

この実装では、`reverberance`はリバーブの強さ、`damping`は高音の減衰具合、`room_scale`は仮想的な部屋の大きさを表します。

## 3. ピッチシフトの実装

ピッチシフトは音の高さを変更する効果です。pydubには直接的なピッチシフト機能がないため、librosaライブラリを使用して実装します。

まず、librosaをインストールしましょう：

```bash
pip install librosa
```

次に、ピッチシフト機能を実装します：

```python
from pydub import AudioSegment
import numpy as np
import librosa

def pitch_shift(sound, semitones):
    # 音声データを numpy 配列に変換
    samples = np.array(sound.get_array_of_samples()).astype(np.float32)
    
    # ステレオの場合は、チャンネルを分離
    if sound.channels == 2:
        samples = samples.reshape((-1, 2))
    
    # librosa でピッチシフト
    shifted = librosa.effects.pitch_shift(samples, sr=sound.frame_rate, n_steps=semitones)
    
    # 結果を AudioSegment に戻す
    shifted = (shifted * 32767).astype(np.int16)
    return sound._spawn(shifted.tobytes())

# 音声ファイルを読み込む
audio = AudioSegment.from_file("input.mp3", format="mp3")

# ピッチを2半音上げる
shifted_audio = pitch_shift(audio, 2)

# 結果を保存
shifted_audio.export("pitch_shifted_output.mp3", format="mp3")
```

この実装では、`semitones`パラメータで半音単位のピッチシフト量を指定します。正の値で音が高く、負の値で音が低くなります。

## 4. 効果を組み合わせる

これらの効果を組み合わせることで、より複雑で興味深い音響効果を作り出すことができます。

```python
# 音声ファイルを読み込む
audio = AudioSegment.from_file("input.mp3", format="mp3")

# エコーを追加
echo_audio = add_echo(audio, delay=500, num_echos=3, decay=1000)

# リバーブを追加
reverb_audio = add_reverb(echo_audio, reverberance=60, damping=40, room_scale=80)

# ピッチシフト
final_audio = pitch_shift(reverb_audio, -1)

# 結果を保存
final_audio.export("final_output.mp3", format="mp3")
```

このコードでは、エコー、リバーブ、ピッチシフトの効果を順番に適用しています。

## まとめ

本記事では、pydubを使用してエコー、リバーブ、ピッチシフトなどの音響効果を実装する方法を紹介しました。これらの基本的な効果を理解し、組み合わせることで、より複雑で興味深い音響処理が可能になります。

ここで紹介した実装は簡易的なものであり、プロフェッショナルな音楽制作ソフトウェアのような高品質な効果を得るには、さらに複雑なアルゴリズムが必要です。しかし、これらの基本的な実装を出発点として、自分だけの独自の音響効果を作り出すことができるでしょう。

音響処理の世界は深く、探求の余地が多くあります。ここで学んだ技術を基に、さらに高度な音響効果の実装に挑戦してみてください。

## 参考リンク

- [pydub公式ドキュメント](https://github.com/jiaaro/pydub)
- [librosa公式ドキュメント](https://librosa.org/doc/latest/index.html)
- [デジタル信号処理の基礎](https://www.dspguide.com/)