【3分で完成】Google Colab+Pythonで波形生成(Wavファイル作成)
Contents
はじめに
こんにちは。Tepoです。
今回は、Google ColabによるPythonの環境構築をご紹介したいと思います。
Pythonとは、人工知能(AI)やデータ分析など現在ホットな分野で多く用いられているプログラミング言語の1つです。
人工知能・データ分析と聞くと、「どうせ複雑な設定とか必要なんでしょ・・・」と思うかもしれませんが、私が考えるPythonの最大のメリットは「複雑なことが、めっちゃ簡単にできる」ことです。
本ブログで過去紹介させていただいた、周波数分析や波形合成(Wavファイル出力)も非常に簡単に行うことができます。
加えて、誰もが持っているGoogleアカウントで、Google Colabという非常に使いやすいPython開発環境を使うことができます。
しかも、このGoogle Colabは基本的に無料で使えます。(有料で高スペック版を使えますが、無料版でも十分使えます。)
今回は、以前こちらでちらっとご紹介した、Sin波やのこぎり波、矩形波を合成しWavファイルで出力するプログラムを実行してみます。
Google Colabで実行してみよう
まず、Googleアカウントを作成します。
作成方法については、他のブログ等で腐るほど記事があるので割愛します。
次に、Google Clab(こちら)にアクセスします。
画面右上のログインよりアカウントにログインします。(アカウント作成直後や既にGoogleアカウントにログインしている場合は、ログイン不要です)
「ファイル」のタブから「ノートブックを新規作成」をクリックします。
すると、下記の通り、プログラムを入力する画面が現れます。
左側の再生ボタンのようなものを押すとプログラムが実行されます。(まだ何も書いていないのでこのタイミングで押しても何も実行されません。)
プログラムを書くエリアという部分に、下記プログラムをコピペして実行ください。
プログラムの詳細は各行#の後に記載していますので、気になる方は読み解いてみてください。
気にならない方はとりあえず、コピペしてプログラムをまず動かしてみましょう。
#ライブラリインポート
import numpy as np #数値計算のためのライブラリ
import matplotlib.pyplot as plt #グラフ描画のためのライブラリ
import IPython.display #オーディオを表示させるのに必要なライブラリ
from scipy import signal #三角波や矩形波を生成するライブラリ
#変数設定
A = [0.5, 1, 0.6, 0.6, 0.3, 0.2] #合成する各波形の振幅を設定
f = [55/2, 55, 55*1.5, 55*2, 55*2.5, 55*3] #合成する各波形の周波数を設定(値は55Hzの倍音)
samplingrate_hz = 44100 #サンプリング周波数を設定
y =[0] #波形の数値を格納する変数を用意
t = np.arange(0, 2, 1 / samplingrate_hz) #時間軸を作成(0から2を1/samplingrate_hzの間隔で均等に割ったリスト)
#演算
for i in range(len(f)): #各波形の合成
y = y + A[i] * np.sin(2*np.pi*f[i]*t)
"""
【memo:正弦波だけではなく他の波も出力できる】
三角波・・・上記のnp.sinをsignal.sawtoothに変更
矩形波・・・上記のnp.sinをsignal.squareに変更
"""
#描画
plt.plot(t, y, label="Mix") #横軸t,縦軸y,グラフ名"Mix"に設定
plt.xlabel("time [s]") #横軸のラベル設定
plt.ylabel("amplitude") #縦軸のラベル設定
plt.legend(loc='upper right') #凡例(Mix)を右上(upper right)に表示
plt.xlim([0,0.1]) #表示させる横軸の範囲を0から0.1までに設定
plt.show() #描画(「いっけーーーーーーーい」)
#音声出力
IPython.display.Audio(y, rate = samplingrate_hz)
実行ボタンをクリックすると、上図のように実行結果が出てくると思います。
プログラムの実行結果を拡大してみてみましょう。
左側から再生ボタン、音量調節ボタン、ダウンロードボタンとなっています。
ダウンロードを押すと、wav形式でファイルが保存されます。
最後に、このファイルの保存しましょう。
「ファイル」から「保存」を選択するとこのプログラムが保存されます。
次回Google Colabに再度アクセスすると、続きを編集することが可能です。
プログラム解説(超ざっくり)
今回の目的は、Google Colabを導入することとまずは実行してみるということなので、既に目的は達成していますが、本プログラムを初心者の方向けに超ざっくりですが解説したいと思います。
ライブラリインポート
どのプログラムでも共通のことですが、プログラムの先頭では「お道具箱」を準備します。
人工知能(AI)を構築したいならAIのお道具箱を、データ分析したいならデータ分析用のお道具箱を、音楽関連の分析等をしたいなら音楽関連のお道具箱を用意します。
どこの幼稚園でも一緒です。
プログラミングの世界では、お道具箱のことを「ライブラリ」用意することを「インポート」といいます。かっこいいですね・・・
今回は、下記のライブラリをインポートします。
import numpy as np #数値計算のためのライブラリ
import matplotlib.pyplot as plt #グラフ描画のためのライブラリ
import IPython.display #オーディオを表示させるのに必要なライブラリ
from scipy import signal #三角波や矩形波を生成するライブラリ
変数設定
どのプログラムでも共通のことですが、プログラムの二番目あたりでは「変数」を準備します。
変数とは、中学校でやったxとかyとかです。
中学校で初めて変数を習った際に、みはじ?を思い出しましょう。
「太郎君は100kmの道のりを2時間で歩いて帰りました。太郎君の歩く速さはどのくらいでしょう?太郎君の歩く速さをxとして式を立てなさい」
・・・こんな感じだったかは定かではありませんが、大事なのは「太郎君の歩く速さをx」としているという点です。
これこそが変数を準備するということです。
今回は下記の通り変数を準備しました。
A = [0.5, 1, 0.6, 0.6, 0.3, 0.2] #合成する各波形の振幅を設定
f = [55/2, 55, 551.5, 552, 552.5, 553] #合成する各波形の周波数を設定(値は55Hzの倍音)
samplingrate_hz = 44100 #サンプリング周波数を設定
y =[0] #波形の数値を格納する変数を用意
t = np.arange(0, 2, 1 / samplingrate_hz) #時間軸を作成(0から2を1/samplingrate_hzの間隔で均等に割ったリスト)
演算
どのプログラムでも共通のことですが、ライブラリをインポートして変数を定義したら具体的な演算を行います。
今回は上記変数で用意した周波数や振幅から波形を合成しています。
そして、"""で囲んでいる個所は、プログラムとは関係ないメモです。
今回はsin波を合成して波形を作っていますが、他の波形(三角波や矩形波)も使うことができます。
for i in range(len(f)): #各波形の合成
y = y + A[i] * np.sin(2np.pif[i]*t)
“""
【memo:正弦波だけではなく他の波も出力できる】
三角波・・・上記のnp.sinをsignal.sawtoothに変更
矩形波・・・上記のnp.sinをsignal.squareに変更
“""
描画
どのプログラムでも共通のことですが、演算の後は描画(グラフを書く)を行います。
グラフを書くには、縦軸や横軸、ラベルを設定する必要があります。
今回は下記の通りグラフを書いています。
plt.plot(t, y, label="Mix") #横軸t,縦軸y,グラフ名"Mix"に設定
plt.xlabel(“time [s]") #横軸のラベル設定
plt.ylabel(“amplitude") #縦軸のラベル設定
plt.legend(loc=’upper right’) #凡例(Mix)を右上(upper right)に表示
plt.xlim([0,0.1]) #表示させる横軸の範囲を0から0.1までに設定
plt.show() #描画(「いっけーーーーーーーい」)
音声出力
どのプログラムでも共通のことですが、最後はデータの保存を行います。
今回は作成した波形を音声データ(wav形式)で保存します。
IPython.display.Audio(y, rate = samplingrate_hz)
まとめ
今回はGoogle ColabでPython環境構築し、波形合成(Wav形式)プログラムを実行しました。
結構簡単なのがおわかりいただけたのではないでしょうか?
Google Colab + Pythonはネットに多くの情報があるので、やりたいことをググると大体見つかりますし、今回のようにほぼコピペでできることがかなり多いです。
今後は、「プログラミングができる」というより「こんなことができたら人の役に立つんじゃないか」という構想を練れる人が求められるんじゃないかと個人的には思っています。
小学校で必修になったプログラミングですが、個人的にはプログラムを学習させるよりも、こんなことが実現したいという夢を思い描けるようになるような教育をした方が10年後は役立つのではないかと思う、元エンジニアの大学職員(二児の父親)でした。
ディスカッション
コメント一覧
まだ、コメントがありません