質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

解決済

pythonでwavを再生しつつリアルタイムにスペクトラム(波形)描画をしたい。

dendenmushi
dendenmushi

総合スコア98

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

2回答

1リアクション

1クリップ

3506閲覧

投稿2020/09/06 01:02

前提・実現したいこと

pythonでwavのオーディオスペクトラム描画(波形描画)を行いたい。

環境

windows10
python3.7

参考にしたサイト

pythonで音に合わせて動く波形(オーディオスペクトラム)を作ってみる

行ったこと

①以下から音楽をダウンロードしました。
著作権フリー音源

②ffmpegを導入しました。
ffmpegwindowsインストール参考URL
ⅰ:64bit版 安定 static選択
ⅱ:zipダウンロード
ⅲ:環境変数設定

③mp3形式をwavに変更するためにコマンドプロンプト実行

cmd

D:\work_folder\music>ffmpeg -i "優しい気持ち.mp3" -vn -ac 2 -ar 44100 -acodec pcm_s16le -f wav "yasasi_output.wav"

イメージ説明

④下記該当ソースコードをpythonファイルにて実行(pip install必要です。)

cmd

pip install soundfile pip install pygame

cmd

D:\work_folder\music>python wav_spect.py

発生している問題・エラーメッセージ

波が常に加算されてしまい上げ下げ表示しない。
緑色の棒グラフがぐんぐん上がっていく。ピンクのグラフは動いている。
イメージ説明

該当のソースコード

python

#!/usr/bin/env python3 import wave import sys import pygame from pygame.locals import * import scipy.fftpack as spfft import soundfile as sf import pyaudio import numpy as np import pdb # -------------------------------------------------------------------- # パラメータ # -------------------- fn = "yasasi_output.wav" # 計算用 CHUNK = 1024 # pyaudioでストリームにチャンク単位で出力(何故1024かはよく知らない) start = 0 # サンプリング開始位置 N = 1024 # FFTのサンプル数 SHIFT = 1024 # 窓関数をずらすサンプル数 hammingWindow = np.hamming(N) # 窓関数 t = 0 # -------------------- # 描画用 SCREEN_SIZE = (854, 480) # ディスプレイのサイズ rectangle_list = [] # -------------------- # pygame画面初期設定 pygame.init() screen = pygame.display.set_mode(SCREEN_SIZE) pygame.display.set_caption("Pygame Audio Visualizer") # -------------------------------------------------------------------- # wavファイルを再生しつつ、後に定義する再描画関数redraw()を呼び出す関数 def play_wav_file(filename): try: wf = wave.open(filename, "r") except FileNotFoundError: # ファイルが存在しなかった場合 print("[Error 404] No such file or directory: " + filename) return 0 # ストリームを開く p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # 音声を再生 data = wf.readframes(CHUNK) while data != '': stream.write(data) data = wf.readframes(CHUNK) redraw() stream.close() p.terminate() # -------------------------------------------------------------------- # 「FFTかけて描画」を繰り返す. def redraw(): global start global screen global rectangle_list # -------------------- # 対象サンプル点のブロックにFFTをかけて振幅スペクトルを計算する windowedData = hammingWindow * x[start:start + N] # 窓関数をかけたデータブロック X = spfft.fft(windowedData) # FFT amplitudeSpectrum = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in X] # 振幅スペクトル # -------------------- # Pygameでの描画 screen.fill((240, 128, 128)) # 好きな色で初期化する rectangle_list.clear() # 四角形リスト初期化 # スペクトル描画 数値は実行して調整しながら for i in range(86): rectangle_list.append(pygame.draw.line(screen, (102, 205, 170), (1+i * 10, 350 + amplitudeSpectrum[i] * 10), (2+i * 10, 350 - amplitudeSpectrum[i] * 10), 4)) pygame.display.update(rectangle_list) # ディスプレイ更新 start += SHIFT # 窓関数をかける範囲をずらす if start + N > nframes: sys.exit() for event in pygame.event.get(): # 終了処理 if event.type == QUIT: sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: sys.exit() # -------------------------------------------------------------------- if __name__ == "__main__": # -------------------- # wavデータを取得 data, fs = sf.read(fn) # dataの形状は(フレーム数×チャンネル数) if data.ndim == 1: x = data # モノラルならそのまま使う if data.ndim == 2: x = data[:, 0] # ステレオならLチャンネルだけに絞って処理することに(Rなら0を1にしてください) nframes = x.size # フレーム数取得(FFTで窓関数をずらすときの終了条件に使います) # -------------------- # 再生と描画を開始 play_wav_file(fn)

試したこと

ディスプレイ更新の下にグラフを初期化するため下記コード追加

python

# グラフ初期化 rectangle_list = [] amplitudeSpectrum = [] pygame.display.update(rectangle_list) # ディスプレイ更新 pygame.display.__init__()

しかし変わりありませんでした。

気になった点

下の画像の赤枠のところにピンクでかなり細かく上下の表示がされているため、そこだけ表示するようにすれば叶うのかなと思っています。

イメージ説明

知見ある方アドバイス何かありましたら、どうかよろしくお願い致します。

teamikl👍を押しています

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。