乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

今回は迷路の自販機を
再現するコードの実装です。

解説動画はこちら




迷路の自販機

先日、テレビで迷路の自販機なるものを
特集していました。


こんな感じのものですね

お金を入れるとその分の長さの
迷路が生成されて
プリントされるというものです。

高いほど長くなる仕組みの様です。

迷路を自動生成する事ができれば
これを再現する事ができるんじゃ
ないかなと思います。

早速コードを見てみましょう。


迷路作成コード

迷路を作成する部分と
画像を生成する部分です。
import random
import sys
from PIL import Image
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
sys.setrecursionlimit(10**6)

# 迷路を作成する
def make_maze(size):

    def make(ny, nx,tmp_maze):
        ar = list(range(4)) 
        random.shuffle(ar)
        for i in ar:
            if ny+dy[i][1]<1 or ny+dy[i][1]>=size[0]:
                continue
            if nx+dx[i][1]<1 or nx+dx[i][1]>=size[1]:
                continue
            if tmp_maze[ny+dy[i][1]][nx+dx[i][1]]==0:
                continue
            for j in range(2):
                tmp_maze[ny+dy[i][j]][nx+dx[i][j]]=0
            make(ny+dy[i][1], nx+dx[i][1],tmp_maze)
    
    tmp_maze = [[1]*size[1] for _ in range(size[0])]
    dx,dy = [(1,2), (-1,-2), (0,0), (0,0)],[(0,0), (0,0), (1,2), (-1,-2)]
    make(1, 1,tmp_maze)
    tmp_maze[1][1],tmp_maze[size[0]-2][size[1]-2] = 2,3
    return tmp_maze

# 画像を作成する
def create_image_from_maze(maze, file_path,pixel_size=20):
    # 色のマッピング
    colors = {
        0: (255, 255, 255),  # 白
        1: (0, 0, 0),        # 黒
        2: (0, 0, 255),      # 青
        3: (0, 255, 0)       # 緑
    }
    width = len(maze[0]) * pixel_size
    height = len(maze) * pixel_size
    image = Image.new("RGB", (width, height), "white")
    pixels = image.load()
    for y in range(len(maze)):
        for x in range(len(maze[0])):
            color = colors.get(maze[y][x], (255, 255, 255))
            for dy in range(pixel_size):
                for dx in range(pixel_size):
                    pixels[x * pixel_size + dx, y * pixel_size + dy] = color
    image.save(file_path)
    return image

実行する際はコレ
# 迷路を作成する
size = (31, 101) # height , width
maze = make_maze(size)

# 画像を生成
image = create_image_from_maze(maze,"image.png")
plt.figure(figsize=(16,10))
plt.imshow(image, cmap='gray')
plt.axis('off')
plt.show()
download

こんな感じで迷路が出来上がります。

黒が壁で、白が通路
青がスタート、緑がゴールです。

いい感じで横長の迷路が
出来ているんじゃないでしょうか

縦は31ピクセル固定として
横は100円分で
31ピクセルとかにすれば
いい感じに再現出来るんじゃないかと。

もっと大きな迷路も
作成は出来ると思うので
サイズ変更して試してみて下さい。

Google Colabなどで
実行できると思います。


今回は迷路の自販機を再現する
迷路作成のコードについてでした。

それでは。

今回はSpotifyの音声エフェクトライブラリ
Pedalboardを試してみました。

解説動画はこちら

 


Pedalboard

spotify pedalboard

Spotifyの開発した
音声用のエフェクトライブラリです。

本来のペダルボードは
ss_pedal

こんな感じのイメージで
ギタリストが良く使う
足踏みエフェクター群を
沢山置いた板(エフェクトセット)
という意味合いかと思います。

それを再現出来るライブラリということになります。

pedalboardの
中にはたくさんのエフェクターが
内包されています。


インストール方法

Google Colabでの使用方法ですが
一般PCも同じ方法でコマンド一発です。
!pip3 install pedalboard


ライブラリのインポート

pedalboardを使用するには
始めにたくさんのライブラリを
読み込んでおく必要があります。
import librosa
from pedalboard.io import AudioFile
from pedalboard import (
    Pedalboard,
    Gain,
    Chorus,
    Phaser,
    Reverb,
    Compressor,
    LadderFilter,
)
import IPython.display as display
from matplotlib import pyplot as plt
librosaは音声用のライブラリです。
matplotlibに関しては後ほど
音声波形の可視化に使用します。



エフェクターの種類

一般的な音声エフェクターと同じ
エフェクトが存在します。

Compressor:音を圧縮する
Gain 音量を上げる
Chorus:コーラスをつける(ちょっと厚みを付ける)
Phaser:位相を変え、うねりを付加する(シュワシュワさせる)
LadderFilter:フィルターをかける
Reverb:反響音をつける



サンプルコード


音声ファイルの読み込み

まずはじめに音声ファイルの読み込みを行います。

librosaのサンプル音声ファイルの「trumpet」
を使っていきます。
(サンプリングレート44.1KHz、モノラル、音の長さ5秒)
# サンプル音源を読み込む
audio, sr = librosa.load(librosa.example('trumpet', hq=True), sr=44100)
print(type(audio))
print(audio.size)

display.Audio(audio, rate=sr)

どんな音声になるかは
動画を見てみて下さいね。



エフェクトをかける

ライブラリで読み込んだ関数
Pedalboard を用いて音声を変換できます。
変換後の音声の変数 = Pedalboard([エフェクト関数 , ・・・])

Pedalboardの引数には
エフェクト関数をリストで渡します。

読み込みしたライブラリ のエフェクト関数が
それに該当します。


コンプレッサー
ゲイン
コーラスをかけるコードはこうなります。
# コンプレッサー、ゲイン、コーラス
board = Pedalboard([
    Compressor(threshold_db=-50, ratio=25),
    Gain(gain_db=30),
    Chorus(),
])
effected_audio = board(audio ,sr)

# エフェクトかけた音源を再生 display.Audio(effected_audio, rate=sr)

エフェクト関数にはそれぞれ
引数が指定できるものも有りますが
ここでは割愛しますので
細かく設定したい方はSpotifyの資料を
みてみて下さい。


オリジナル音声との波形の違い


オリジナルの音声と
エフェクトをかけた後の音声の違いを
可視化するコードはこちらです。
# オリジナル音源
plt.figure()
plt.subplot(2, 1, 1)
librosa.display.waveshow(audio, sr=sr, color='b')
plt.title('Original')

# エフェクトかけた音源
plt.subplot(2, 1, 2)
librosa.display.waveshow(effected_audio, sr=sr, color='r')
plt.title('Effected')

plt.tight_layout()
plt.show()
download

こんな感じで結果が見れます。


音声を保存する


Colabでも、エフェクトをかけた音声を保存できます。
# オーディオファイルの保存
with AudioFile('ファイル名.wav', 'w', sr, num_channels=1) as f:
    f.write(effected_audio)

指定したファイル置き場に音声ファイルが出力されます。



最後に

ギターは弾けませんが
BOSSのエフェクターとか結構好きで
あれを沢山集めるのって
すごく憧れが有るんですよねー

それをデジタル上で再現できてしまう
ライブラリになるので
色々遊んでみて下さい。

それでは。

今回はずんだもんなどのキャラクターの声を
音声合成できるソフトVOICEBOXを
Google Colabで使う方法についてです


解説動画はこちら



VOICEVOXとは

VOICEVOXは無料のテキスト読み上げソフトウェアで
ずんだもんなど、複数のキャラクターが存在する
音声合成ソフトです。

音声合成の精度もなかなかなものです。


インストール方法

下記のコマンドを貼り付けて実行です
!curl -sSfL https://raw.githubusercontent.com/VOICEVOX/voicevox_core/8cf307df4412dc0db0b03c6957b83b032770c31a/scripts/downloads/download.sh | bash -s
cd voicevox_core/
!wget https://github.com/VOICEVOX/voicevox_core/releases/download/0.14.1/voicevox_core-0.14.1+cpu-cp38-abi3-linux_x86_64.whl
!pip install voicevox_core-0.14.1+cpu-cp38-abi3-linux_x86_64.whl
!wget https://raw.githubusercontent.com/VOICEVOX/voicevox_core/406f6c41408836840b9a38489d0f670fb960f412/example/python/run.py



音声合成のコマンド

下記のコマンドで音声合成が行えます
主にテキストとスピーカーIDの部分を
変えるだけです。
dirs = './open_jtalk_dic_utf_8-1.11'
out_path = '../out.wav'
text = 'テキスト'
speaker_id = スピーカーID

!python ./run.py --dict-dir $dirs --text $text --out $out_path --speaker-id $speaker_id
out_pathで指定した場所に音声ファイルが出力されます。


スピーカーID

この指定で使えるIDは次のようになっているようです

キャラクター 口調 キャラクターID
四国めたん ノーマル 2
四国めたん あまあま 0
四国めたん ツンツン 6
四国めたん セクシー 4
四国めたん ささやき 36
四国めたん ヒソヒソ 37
ずんだもん ノーマル 3
ずんだもん あまあま 1
ずんだもん ツンツン 7
ずんだもん セクシー 5
ずんだもん ささやき 22
ずんだもん ヒソヒソ 38
春日部つむぎ ノーマル 8
雨晴はう ノーマル 10
波音リツ ノーマル 9
玄野武宏 ノーマル 11
玄野武宏 喜び 39
玄野武宏 ツンギレ 40
玄野武宏 悲しみ 41
白上虎太郎 ふつう 12
白上虎太郎 わーい 32
白上虎太郎 びくびく 33
白上虎太郎 おこ 34
白上虎太郎 びえーん 35
青山龍星 ノーマル 13
冥鳴ひまり ノーマル 14
九州そら ノーマル 16
九州そら あまあま 15
九州そら ツンツン 18
九州そら セクシー 17
九州そら ささやき 19
もち子さん ノーマル 20
剣崎雌雄 ノーマル 21
WhiteCUL ノーマル 23
WhiteCUL たのしい 24
WhiteCUL かなしい 25
WhiteCUL びえーん 26
後鬼 人間ver. 27
後鬼 ぬいぐるみver. 28
No.7 ノーマル 29
No.7 アナウンス 30
No.7 読み聞かせ 31
ちび式じい ノーマル 42
櫻歌ミコ ノーマル 43
櫻歌ミコ 第二形態 44
櫻歌ミコ ロリ 45
小夜/SAYO ノーマル 46
ナースロボ_タイプT ノーマル 47
ナースロボ_タイプT 楽々 48
ナースロボ_タイプT 恐怖 49
ナースロボ_タイプT 内緒話 50

IDを指定してキャラクターを変更できます。


試しにずんだもんで音声合成すると
こんなコードになります。
dirs = './open_jtalk_dic_utf_8-1.11'
out_path = '../out.wav'
text = 'どうも、ずんだもんです。よろしくね'
speaker_id = 1

!python ./run.py --dict-dir $dirs --text $text --out $out_path --speaker-id $speaker_id
from IPython.display import Audio
Audio('../out.wav', autoplay=True)

出来上がった音声は
動画の方で確認してみて下さいね

VOICEBOX自体は
UI付きのソフトウェアで提供されていますが
大量のテキストを自動で音声化させたりしたい場合は
プログラムを使ってやるのが楽ですねー

そういう用途に使いたい方は
是非参考にしてみて下さい。

それでは。

今回はワードクラウドの時系列変化を
アニメーション化する事ができるライブラリ
AnimatedWordCloudのご紹介です。


解説動画はこちら


ワードクラウドとは
データから単語を抜き出し
画像化したもののことです。

こんな感じのものです
2

単語の頻出数が文字の大きさになります。


このワードクラウドをアニメーション化する
ライブラリ「AnimatedWordCloud」を
リリースした方がいました。

Github


早速試してみましょう。
Google Colabで試せるコードになっています。


ライブラリのインストール
!pip install AnimatedWordCloudTimelapse==0.9.5

コマンドでインストールできますが
たまに失敗することもある様です。

Colabのバックエンドが
一定ではないためかと思いますが
何度か再起動してインストールすれば
成功すると思います。



ライブラリの読み込み

ワードクラウドの作成に必要な
ライブラリを全部読み込みします。
from AnimatedWordCloud import animate, Config
config = Config(output_path="/content/")

import pandas as pd
from datetime import datetime as dt
from sklearn.feature_extraction.text import CountVectorizer
configではアウトプット先の設定を行えます。
ワードクラウドに使用するデータの作成は
Pandasデータフレームを用いると楽です。

単語のカウント用に CountVectorizer を用います。



サンプルデータの読み込み


ここからは製作者様のコードを
一部引用させていただいています。

githubに付属されていた
イーロンマスクのツイートデータ(2012 - 2018)
の読み込みです。
df = pd.read_table("https://raw.githubusercontent.com/konbraphat51/AnimatedWordCloudExampleElon/main/elonmusk_tweets.csv",sep=",")

df["created_at"] = pd.to_datetime(df["created_at"])
df.head()

結果が出ていれば読み込み成功です。



ワードクラウド作成用のデータ構造


このライブラリでアニメーションワードクラウドを
作成するには、データ構造を合わせないといけません

このデータは次の様なデータ構造になっています。


[
(数値(年度),
 {'ワード' : 数値(回数) , ・・・ }
) , ・・・
]


2つの要素を持ったタプルが複数格納されたリストで
リストの要素のタプルは
1.数値型の時系列
2.キー:ワード , 値:回数の辞書
という構造になっています。

ちょっと複雑な構造体ですので
形に合わせる集計が必要になっています。


データの加工

こちらも元のコードを参考にしたコードとなります。
dfs_by_year = []
for year in range(2012, 2018):
    df_year = df[dt(year, 1, 1) <= df["created_at"] ]
    df_year = df_year[dt(year+1, 1, 1) > df_year["created_at"]]
    dfs_by_year.append(df_year)
    print(df_year.shape)

stopwords = ["the", "co", "http", "to", "of", "and", "on", "for", "just", "that", "with", "by", "is", "in", "at", "will"]

min_df = 10
counter = CountVectorizer(stop_words=stopwords)
dicts_by_year = []

for cnt in range(len(dfs_by_year)):
    np_year = counter.fit_transform(dfs_by_year[cnt]["text"]).toarray()
    df_year = pd.DataFrame(np_year, columns=counter.get_feature_names_out())
    sr_sum = df_year.sum(axis=0).sort_values(ascending=False)
    sr_sum = sr_sum[sr_sum >= min_df]

    #to dictionary
    dict_year = sr_sum.to_dict()
    dicts_by_year.append(dict_year)

wordvector_timelapse = []
for cnt in range(len(dicts_by_year)):
    year = 2012 + cnt
    wordvector_timelapse.append((year, dicts_by_year[cnt]))


ワードクラウドの作成

変数 = animate(データ, config) でワードクラウドの作成
configで指定したパスに
output.gif が保存される仕組みです
result = animate(wordvector_timelapse, config)



イメージの再生


出来上がったら見てみましょう。
from IPython.display import display, Image

with open('/content/output.gif','rb') as f:
    display(Image(data=f.read(), format='png',width=600))

2


ワードクラウドがアニメーション表示されると思います。

ツイートのデータなどは
良くワードクラウドで表現される事が多いかと思いますが
それを時系列でアニメーション化させる
表現手法は作成するのに結構手間がかかると思います。

それを少しのコードだけで
作成する事ができるのは
めちゃくちゃ便利だと思います。


このライブラリを公開された方のような人が
今後沢山出てきていただけると嬉しいですね。

今回は
アニメーションワードクラウドを
作成出来る
AnimatedWordCloud
のご紹介でした。

それでは

今回はデータでレースを行う
データレースを作る方法についてです。


解説動画はこちら



このデータレースというのは
良くYoutubeでも見かける
データを使ったレース動画のことで

時系列データを用いて
棒グラフの増減をレースの様に
見せる形式の動画のことです。

flourish

などで作成するのが有名かと思います。

今回はこれを
Python言語でやってみましょう。


Python言語では
bar_chart_race
というライブラリでこれを実現できます。



bar_chart_raceのインストール

Google Colab上では
こちらのコマンドでインストールが実行できます。
!pip install bar_chart_race
!pip install japanize-matplotlib

日本語を用いたデータレースを行いたい場合は
japanize-matplotlibも合わせて
インストールする必要があります。


ライブラリの読み込み

こちらのコードで
ライブラリ読み込みができます。
import pandas as pd
import bar_chart_race as bcr
import japanize_matplotlib

サンプルデータで試してみる

 
ライブラリには最初から
サンプルデータが付属しているようなので
これを読み込んでみます。
# サンプルデータ読み込み
df = bcr.load_dataset('covid19')

# データのサイズ
print(df.shape)
(52 , 20)


データ構造について

bar_chart_race
で使えるデータ構造は決まっていて
次の3つのデータが必要です。

・日付(インデックス)
・カテゴリ値(カラム名)
・値(数値)



動画の作成

次のコードで動画を作成できます。
# 動画の生成
bcr.bar_chart_race(
    df=df,
    filename='ファイル名.mp4',
)
作成した動画は
Colabのファイル置き場に保存されます。

再生するとこんな感じの
動画が出来るかと思います。

スクリーンショット 2024-01-13 17.11.49


設定できるパラメータ


bcr.bar_chart_raceの引数には
色々なパラメータを付与できます。
period_length : 動画の長さ
fixed_max : 最大値を固定するかどうか
fixed_order : 順位を固定するかどうか
n_bars : 表示する順位の個数
steps_per_period : 1stepあたりの数

この辺りを付ければ
自分の理想のレース動画が
出来ると思います。

詳しいパラメータ設定は
公式ドキュメントをご確認くださいね。


今回は少し古いネタですが
データレースの作り方をお伝えしました
それでは。


このページのトップヘ