[Python] wavファイルの音量を変更する方法

Pythonでwavファイルの音量を変更するには、waveモジュールとnumpy、またはpydubライブラリを使用する方法があります。

waveモジュールを使う場合、wavファイルを読み込み、numpyで音声データを操作して音量を調整します。

具体的には、音声データをスケーリングすることで音量を変更できます。

pydubを使う場合は、AudioSegmentクラス+-演算子で音量を増減できます。

pydubはシンプルで使いやすい方法です。

この記事でわかること
  • PythonでWAVファイルを操作する方法
  • 音量調整のためのライブラリの使い方
  • 音量の自動正規化の実践例
  • 複数ファイルの一括処理の手法
  • 音質確認のための波形プロット方法

目次から探す

Pythonでwavファイルを操作するための準備

必要なライブラリのインストール

音声ファイルを操作するためには、いくつかのライブラリをインストールする必要があります。

以下に、必要なライブラリとそのインストール方法を示します。

スクロールできます
ライブラリ名インストール方法
waveモジュールPythonに標準で含まれているため、追加のインストールは不要です。
numpyライブラリpip install numpy
pydubライブラリpip install pydub

waveモジュール

waveモジュールは、Pythonに標準で含まれているライブラリで、WAVファイルの読み書きが可能です。

特別なインストールは必要ありません。

numpyライブラリ

numpyは数値計算を効率的に行うためのライブラリです。

音声データの処理において、配列操作が必要になるため、インストールしておくと便利です。

pip install numpy

pydubライブラリ

pydubは音声ファイルの操作を簡単に行うためのライブラリです。

音量調整やフォーマット変換など、さまざまな機能を提供しています。

pip install pydub

pydubを使用するためには、FFmpegまたはlibavが必要です。

ただ使うだけならプログラムと同じフォルダ(カレントディレクトリ)に配置するだけで構いません。

wavファイルの読み込みと書き込み

音声ファイルを操作するためには、まずファイルを読み込み、必要な処理を行った後に書き込む必要があります。

以下に、waveモジュールとpydubを使った基本的な操作方法を示します。

waveモジュールを使った基本操作

waveモジュールを使用してWAVファイルを読み込む方法は以下の通りです。

import wave
# WAVファイルを読み込む
with wave.open('input.wav', 'rb') as wav_file:
    params = wav_file.getparams()  # WAVファイルのパラメータを取得
    frames = wav_file.readframes(params.nframes)  # 音声データを読み込む
print(params)
Wave_read(channels=2, sampwidth=2, framerate=44100, nframes=100000, comptype='NONE', compname='not compressed')

このコードでは、WAVファイルのパラメータを取得し、音声データを読み込んでいます。

pydubを使った基本操作

pydubを使用すると、WAVファイルの読み込みがさらに簡単になります。

以下はその例です。

from pydub import AudioSegment
# WAVファイルを読み込む
audio = AudioSegment.from_wav('input.wav')
# 音声の長さを表示
print(len(audio))  # ミリ秒単位で表示
300000  # 例: 300秒

このコードでは、pydubを使ってWAVファイルを読み込み、その長さをミリ秒単位で表示しています。

pydubは音声データの操作を直感的に行えるため、非常に便利です。

waveモジュールとnumpyを使った音量調整

waveモジュールでwavファイルを読み込む

waveモジュールを使用してWAVファイルを読み込む方法は、前述の通りです。

ここでは、音声データをnumpy配列に変換するための準備を行います。

import wave
import numpy as np
# WAVファイルを読み込む
with wave.open('input.wav', 'rb') as wav_file:
    params = wav_file.getparams()  # WAVファイルのパラメータを取得
    frames = wav_file.readframes(params.nframes)  # 音声データを読み込む
# 音声データをnumpy配列に変換
audio_data = np.frombuffer(frames, dtype=np.int16)  # 16ビット整数として読み込む

このコードでは、WAVファイルを読み込み、音声データをnumpy配列に変換しています。

これにより、音声データの数値操作が可能になります。

numpyで音声データを操作する

numpyを使用して音声データを操作することで、音量調整が可能になります。

音声データは通常、-32768から32767の範囲の整数値で表現されます。

# 音声データの最大値を取得
max_value = np.max(np.abs(audio_data))
# 音声データの平均値を表示
average_value = np.mean(audio_data)
print(f'音声データの最大値: {max_value}, 平均値: {average_value}')
音声データの最大値: 30000, 平均値: 1000

このコードでは、音声データの最大値と平均値を計算し、表示しています。

これにより、音声データの特性を把握できます。

音量をスケーリングする方法

音量を調整するためには、音声データをスケーリングします。

スケーリングファクターを設定し、音声データに掛け算を行います。

# 音量を2倍にするスケーリングファクター
scaling_factor = 2.0
# 音声データをスケーリング
scaled_audio_data = audio_data * scaling_factor
# 音声データのクリッピングを防ぐために、範囲を制限
scaled_audio_data = np.clip(scaled_audio_data, -32768, 32767).astype(np.int16)

このコードでは、音量を2倍にするためのスケーリングファクターを設定し、音声データをスケーリングしています。

また、クリッピングを防ぐために、音声データの範囲を制限しています。

調整後のwavファイルを保存する

調整した音声データを新しいWAVファイルとして保存します。

waveモジュールを使用して、音声データを書き込む方法は以下の通りです。

# 調整後のWAVファイルを保存
with wave.open('output.wav', 'wb') as wav_file:
    wav_file.setparams(params)  # 元のパラメータを設定
    wav_file.writeframes(scaled_audio_data.tobytes())  # スケーリングした音声データを書き込む

このコードでは、調整後の音声データを新しいWAVファイルとして保存しています。

元のパラメータを設定することで、音質を保ったまま保存することができます。

pydubを使った簡単な音量調整

pydubのAudioSegmentクラスの使い方

pydubライブラリのAudioSegmentクラスを使用すると、音声ファイルの操作が非常に簡単になります。

まずは、WAVファイルを読み込む方法を見てみましょう。

from pydub import AudioSegment
# WAVファイルを読み込む
audio = AudioSegment.from_wav('input.wav')
# 音声の長さを表示
print(f'音声の長さ: {len(audio)} ミリ秒')
音声の長さ: 300000 ミリ秒

このコードでは、AudioSegment.from_wavメソッドを使用してWAVファイルを読み込み、音声の長さをミリ秒単位で表示しています。

音量を増減する方法

AudioSegmentクラスには、音量を簡単に調整するためのメソッドが用意されています。

音量を増減するには、+または-演算子を使用します。

以下は、音量を増加させる例です。

# 音量を10dB増加させる
increased_volume = audio + 10  # dB単位で指定
# 音量を10dB減少させる
decreased_volume = audio - 10  # dB単位で指定

このコードでは、音量を10デシベル(dB)増加させた音声データと、10dB減少させた音声データを作成しています。

dB単位での調整は、音量の感覚的な変化を反映します。

調整後のファイルをエクスポートする

音量を調整した後は、変更を保存するためにファイルをエクスポートします。

exportメソッドを使用して、WAVファイルとして保存することができます。

# 調整後の音声を新しいWAVファイルとして保存
increased_volume.export('output_increased.wav', format='wav')
decreased_volume.export('output_decreased.wav', format='wav')

このコードでは、音量を増加させた音声データと減少させた音声データをそれぞれ新しいWAVファイルとして保存しています。

format引数でファイル形式を指定することができます。

これにより、pydubを使用して簡単に音量調整を行い、結果をファイルとして保存することができます。

応用例:音量調整の実践的な活用

音量の自動正規化

音量の自動正規化は、音声ファイルの音量を一定の基準に合わせるプロセスです。

これにより、異なる音声ファイル間での音量のばらつきを減少させることができます。

以下は、pydubを使用して音量を自動的に正規化する方法の例です。

from pydub import AudioSegment
def normalize_audio(file_path):
    audio = AudioSegment.from_wav(file_path)
    # 音量を自動的に正規化
    normalized_audio = audio.normalize()
    return normalized_audio
# 使用例
normalized_audio = normalize_audio('input.wav')
normalized_audio.export('output_normalized.wav', format='wav')

このコードでは、音声ファイルを読み込み、normalizeメソッドを使用して音量を自動的に正規化しています。

複数のwavファイルの一括音量調整

複数のWAVファイルの音量を一括で調整することも可能です。

以下は、指定したフォルダ内のすべてのWAVファイルの音量を一括で増加させる例です。

import os
from pydub import AudioSegment
def batch_adjust_volume(folder_path, increase_db):
    for filename in os.listdir(folder_path):
        if filename.endswith('.wav'):
            audio = AudioSegment.from_wav(os.path.join(folder_path, filename))
            adjusted_audio = audio + increase_db
            adjusted_audio.export(os.path.join(folder_path, f'adjusted_{filename}'), format='wav')
# 使用例
batch_adjust_volume('wav_files', 5)  # 5dB増加

このコードでは、指定したフォルダ内のすべてのWAVファイルを読み込み、音量を5dB増加させた新しいファイルを保存しています。

音量調整と他の音声処理の組み合わせ

音量調整は、他の音声処理と組み合わせて使用することができます。

例えば、音声のフェードインやフェードアウトを追加することができます。

from pydub import AudioSegment
# WAVファイルを読み込む
audio = AudioSegment.from_wav('input.wav')
# 音量を増加させる
adjusted_audio = audio + 5
# フェードインとフェードアウトを追加
final_audio = adjusted_audio.fade_in(2000).fade_out(2000)  # 2秒のフェードインとフェードアウト
# 調整後の音声を保存
final_audio.export('output_with_fade.wav', format='wav')

このコードでは、音量を調整した後に、2秒間のフェードインとフェードアウトを追加しています。

音量調整の前後での音質の確認方法

音量調整の前後で音質を確認するためには、音声データの波形やスペクトルを視覚化することが有効です。

以下は、matplotlibを使用して音声データの波形をプロットする例です。

import matplotlib.pyplot as plt
import numpy as np
from pydub import AudioSegment
def plot_waveform(audio, title):
    samples = np.array(audio.get_array_of_samples())
    plt.figure(figsize=(10, 4))
    plt.plot(samples)
    plt.title(title)
    plt.xlabel('サンプル')
    plt.ylabel('振幅')
    plt.grid()
    plt.show()
# WAVファイルを読み込む
original_audio = AudioSegment.from_wav('input.wav')
adjusted_audio = original_audio + 5  # 音量を調整
# 音声の波形をプロット
plot_waveform(original_audio, '元の音声の波形')
plot_waveform(adjusted_audio, '調整後の音声の波形')

このコードでは、元の音声と調整後の音声の波形をプロットし、視覚的に音質の変化を確認しています。

音量調整の効果を確認するために、波形の変化を観察することができます。

よくある質問

音量を上げすぎると音が歪むのはなぜ?

音量を上げすぎると音が歪むのは、音声信号がデジタル音声の最大振幅を超えてしまうためです。

音声データは通常、-32768から32767の範囲の整数値で表現されます。

この範囲を超えると、クリッピングが発生し、音が歪んでしまいます。

クリッピングは、音の波形が平坦になり、元の音質が失われる原因となります。

音量を調整する際は、クリッピングを避けるために、音声データの範囲を適切に管理することが重要です。

音量調整後に音質が劣化することはある?

音量調整後に音質が劣化することはあります。

特に、音量を大幅に上げる場合や、音声データがすでに圧縮されている場合、音質が劣化する可能性があります。

また、音声データのダイナミックレンジが狭い場合、音量を上げることでノイズが目立つようになることもあります。

音質を保つためには、適切な音量調整を行い、必要に応じてノイズリダクションやEQ(イコライゼーション)などの処理を併用することが推奨されます。

pydubとwaveモジュールのどちらを使うべき?

pydubwaveモジュールは、それぞれ異なる用途に適しています。

waveモジュールは、WAVファイルの基本的な読み書きに特化しており、シンプルな操作が可能です。

一方、pydubは、音声処理のための高レベルなAPIを提供しており、音量調整、フェードイン・フェードアウト、フォーマット変換など、さまざまな機能を簡単に実行できます。

  • waveモジュール: 基本的なWAVファイルの操作に適している。
  • pydub: より多機能で、音声処理を簡単に行いたい場合に適している。

用途に応じて、どちらのライブラリを使用するかを選択すると良いでしょう。

まとめ

この記事では、Pythonを使用してWAVファイルの音量を調整する方法について詳しく解説しました。

具体的には、waveモジュールやnumpypydubを活用した音声データの読み込み、音量調整、そしてファイルの保存方法を紹介しました。

音量調整は、音声処理において非常に重要な技術であり、適切に行うことで音質を保ちながら、より良い音声体験を提供することが可能です。

これを機に、実際に音声ファイルを操作してみることで、音量調整の技術を自分のプロジェクトに活かしてみてください。

音声処理のスキルを磨くことで、さまざまな応用が広がることでしょう。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す