初めに
初心者がPythonで遊んだ備忘録。
Pythonも音声解析もなんもわからん…。
モチベーション
最近、広告でIG証券が株価を音楽にしているのを見て(聞いて)、確かに株価も音声も一次元配列でいけるし、似てるな~と思い遊んでみたくなりました。
さらに軽く調べたところ、「NumpyのarrayからPydubのAudioSegmentを作成する」という記事から、Numpyのarrayから音声変換がお手軽にできそうということもわかりました。
書いてみる
株価データはこちら
より、2019年度のファーストリテイリング(9983)の株価を使用し、
音声データはこちら
より、スーパーマリオ64のウォーターランドを使用しました。
また、作業はGoogleColabで行いました。
pydybを確認しつつ、音声を眺めてみる
まずはドライブをマウントして、作業ディレクトリへ移動。
必要そうなライブラリをインポート。
from pydub import AudioSegment
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
pydubがないと怒られたのでインストール
pip install pydub
手始めに「NumpyのarrayからPydubのAudioSegmentを作成する」より、引用させていただいたコードで確認してみる。
#ファイル読み込み
sound = AudioSegment.from_file("data/ウォーターランド.m4a", "m4a")
#配列データ取り出し
samples = np.array(sound.get_array_of_samples())
#読み込んだ配列データから新しいAudioSegmentを作成
test = AudioSegment(
samples.astype("int16").tobytes(),
sample_width=sound.sample_width,
frame_rate=sound.frame_rate,
channels=sound.channels,
)
#保存
test.export("data/test.mp3", format="mp3")
確かに、m4aからmp3nに問題なく変換されていた。
気になったのでshapeとか波形とか見ちゃう。
print(samples.shape) #(4915072,)
plt.plot(samples)
plt.show()
plt.plot(samples[200:600])
plt.show()
plt.plot(samples[200:300])
plt.show()
株価データいじってみる
stock = pd.read_csv('data/9983_2019.csv', header=1, encoding='shift-jis')
print(stock.head())
print(stock.info())
#今回は終値を使ってみる
stock_close = stock["終値"] #shape -> (241, )
#それっぽい数値になるよう、平均だけ引いておく
stock_close = stock_close - stock_close.mean()
stock_close = stock_close.round().astype('int64')
#あとで音声変換にかけやすいようにひとまず240データにしておく
stock_close = stock_close.values[:-1]
適当に処理をして、
x = np.array(range(stock_close.shape[0]))
plt.plot(x, stock_close, -stock_close)
plt.show()
正負を逆転させた奴とともにプロットしてみる。
さらに、水増しをしつつ、この二つのデータをつないでみる。
#各点を200個水増し
stock_close_exten1 = np.array([])
for i in range(stock_close.shape[0]):
for j in range(200):
stock_close_exten1 = np.concatenate([stock_close_exten1, stock_close[[i]]])
stock_close_minus = -stock_close
stock_close_exten2 = np.array([])
for i in range(stock_close_minus.shape[0]):
for j in range(200):
stock_close_exten2 = np.concatenate([stock_close_exten2, stock_close_minus[[i]]])
#交互に結合
stock_close_exten3 = np.empty((stock_close_exten1.shape[0] + stock_close_exten2.shape[0]), dtype=int)
stock_close_exten3[::2] = stock_close_exten1
stock_close_exten3[1::2] = stock_close_exten2
どれどれ…
plt.plot(stock_close_exten3)
plt.show()
test = AudioSegment(
stock_close_exten3.astype("int16").tobytes(),
sample_width=2,
frame_rate=44100,
channels=2,
)
test.export("data/stock_wave.mp3", format="mp3")
んんん~~?
なんかゴーストのなきごえみたいなやつできた(平たく言えば雑音)
一応、株価から音声はできたので実験としてはよしとしましょう。
まとめ
ふと、株価を音楽にする広告が流れてきたので、pythonを学習しつつ遊びました。
株価のarrayをpydubを用いて変換してみました。
また、価格の上下動についてわかりにくいのかなと、処理方法を変えてみたりしましたが、ダメでした。
音声データの扱いについては何もわかっていないので、今後余力があればリベンジするかも?