乙Py先生のプログラミング教室

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

今回は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
のご紹介でした。

それでは

このページのトップヘ