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

Python

プログラミング未経験の方のための
プログラミング学習講座を作成しました

その名も
「1時間で学べるPythonプログラミング」


講義動画はこちら




この講座は初学者の方が
短時間でPython言語を学ぶことのできる
プログラミング学習用の講座です

プログラミングが分からないない方は
Python言語を通じて
プログラミングの基礎を学習できます

講座は動画に加えてGoogle Colabを用いて
手元でコードを動かすことのできます
コードがどう動くのかを確認をしながら
進めていってください

資料はここ:
Google Colabの資料


00:00 1.はじめに
02:13 2.導入方法
02:55 3.GoogleColaboratoryの操作方法
06:19 4.Pythonの計算の基礎
27:27 5.Pythonの制御文
42:14 6.Pythonのクラス
49:11 7.Pythonのその他構文
64:30 8.まとめ

なおPythonチートシートを作成しています。

コーディングに迷った際に役に立ち

WEB検索する時間を無くして

作業時間を効率化できます。

note
Pythonチートシート


 

今回はマイクロソフトの音声合成ソフトである
EdgeTTSを試してみました。

解説動画はこちら



Edge-TTSとは

Microsoftの音声合成ライブラリのことで
TTSとは(Text-to-Speech)の略です。

最新のAI技術が用いられているので
発話の精度が向上していて

無料で使える割に精度は良さそうなので
音声合成試したい方には丁度良いライブラリです。


Google Colabでのインストール方法

次のコマンドを実行するだけです。
!pip install edge-tts


声のリスト一覧を見る
!edge-tts --list-voices




日本語対応のvoice

日本語に対応しているのは
次の2種類の音声があります。

ja-JP-KeitaNeural : 男性の声
ja-JP-NanamiNeural : 女性の声




EdgeTTSの使い方

設定を行い、音声ファイルを作成するだけです。

・設定可能な項目
text : 文章
voice : 声(声優)
rate : 読み上げのスピード( + - でパーセンテージを指定)
name : 出力する音声ファイル名

サンプルコードを実行すると
ファイル置き場に出力されます。

サンプルコードではそのファイルを再生しています。


サンプルコード

英文の読み上げ
import edge_tts

TEXT = "My son is doing very well. I'm very energetic, especially in the morning."
VOICE = "en-GB-SoniaNeural"
OUTPUT_FILE = "test2.mp3"

communicate = edge_tts.Communicate(TEXT, VOICE)
await communicate.save(OUTPUT_FILE)

from IPython.display import Audio
Audio("test2.mp3")

日本語の読み上げ(女性)
import edge_tts

TEXT = """
太くて固い、立派な松茸です。
エリンギが如く、たくましくそそり立っています。
こんなに素晴らしいものは初めてです。
今夜は美味しく頂きます。
""".replace("\n"," ")

VOICE = "ja-JP-NanamiNeural"
RATE = "+20%"
OUTPUT_FILE = "test3.mp3"

communicate = edge_tts.Communicate(TEXT, VOICE,rate=RATE)
await communicate.save(OUTPUT_FILE)

from IPython.display import Audio
Audio(OUTPUT_FILE)


日本語の読み上げ(男性)
import edge_tts

TEXT = """
うわー、すごい綺麗なアワビです。
ねっとりと艶やかで、ほんのり湿っています。
真ん中を触ってみると、クネクネ動きますね。
こいつは大漁だーー。
""".replace("\n"," ")

VOICE = "ja-JP-KeitaNeural"
RATE = "-5%"
OUTPUT_FILE = "test4.mp3"

communicate = edge_tts.Communicate(TEXT, VOICE,rate=RATE)
await communicate.save(OUTPUT_FILE)

from IPython.display import Audio
Audio(OUTPUT_FILE)


まとめ

音声合成の精度も良く
音声ファイルの作成スピードも
かなり速いです。

無料で使える分には
過去一の性能かもしれません。

簡単な文章を音声ファイルにするニーズには
十分に答えられると思います。

昔紹介したWisperと組み合わせたら
文章化と音声化が両方捗ります

色々遊んでみて下さいね
それでは。

今回はGoogleColabの
うれしいアップデート情報です

解説動画はこちら


 
Google Colabのアップデート


Google Colabに
うれしいアップデートが発表されました
それが「シークレット機能」の追加です

Google ColabでSecretsが
管理できるようになりました

シークレット(Secrets)というのは
API キーやパスワードなど機密情報の断片のことで
外部に公開するとまずいことになる
環境変数などで指定する文字列のことです


今までは外部にコード共有する際などは
これらの文字列を気にする必要が有ったのですが
これからはColabの機能で管理できるので
コード側を書き換える必要が無くなります

ということで
早速使い方を見ていきましょう



Secrets機能の使い方

画面左側の「鍵」マークから
「Secrets」管理画面に移行できます
aaa1




画面上で新しい情報として
追加していく事ができます

スクリーンショット 2023-11-04 16.08.39


「目」のマークをクリックすると
値が見れる様になります



コード側でこの値を使用する際は
「google.colab」の「userdata」を用いて
読み込みしたい環境変数の文字列を指定します

from google.colab import userdata

api_key = userdata.get('API_KEY')

openaiのAPIキーなど
コード上で指定していたものは
シークレット機能側に入力しておけば
コード側はそれを読み取るだけで良いので
安全かつ楽になりました!!!


ますます便利になる「Google Colab」
生成AI系のコード試しが捗りますね


今回はここまでです
それでは

今回はPythonの使いやすさと
C言語のパフォーマンスを併せ持つ
新プログラミング言語「Mojo」が
Colabで使える様になったので試してみました

解説動画はこちら


 
Mojoについて

MojoはPythonのスーパーセットとなる
新しい言語で、Pythonに比べて
パフォーマンスとメモリの安全性が向上しています

コンパイル言語になるので
少しだけやることは増えますが
Pythonの構文はサポートされていて
慣れればPython言語と同じように
コードを書き進める事が
出来るんじゃないかと思います



MojoのSDKライセンス取得

Mojoを始めるにはライセンスが必要です

と言っても、メアドを登録するくらいです

「Get Started」から
Mojoのサイトからメールアドレス等で
登録を行います

Mojo



Mojoのインストール

ライセンス登録すると
インストールコマンドが記載された
ページに飛ばされます

WindowsやMacなど、環境ごとの
コマンドが記載されていますので
Google Colabで動かす場合は
「Linux」を選びましょう

次のコマンドがライブラリ取得のコマンドです
!curl https://get.modular.com | \
  MODULAR_AUTH= <自分のMODULAR_ID> \
  sh -

実行の際には各個人事にIDが変わるので
自身のコマンドを手に入れて実行して下さい


ライブラリ取得できたら
次はインストールコマンドです
!modular install mojo

普通に実行すれば
問題なくインストール出来るかと思います

インストールが終わったかどうかは
確認コマンドで確認できます
!export MODULAR_HOME="/root/.modular" && \
export PATH="/root/.modular/pkg/packages.modular.com_mojo/bin:$PATH" && \
mojo --version
mojo 0.3.1 (a3eed7c8)


MojoとPythonの速度比較


さて、それではPythonとMojoで
同じコードでの速度を比較検証してみましょう

3重ループでカウントするだけの
すごくシンプルな関数を実行して
時間を測るというコードになっています

・Pythonのコード
# サンプルコード
import time

def test_def(n):
    count = 0.0
    for i in range(n):
        for j in range(n):
            for k in range(n):
                count += 1.0
    return count


# Pythonでの実行時間
start_time = time.time()
n=500
print(test_def(n))
elapsed_time = time.time() - start_time
print(f"{elapsed_time}s")
125000000.0
7.398502826690674s


1億2千5百万回計算して
7-8秒ほど掛かる様です


・Mojoのコード

Mojoの場合は一度ファイルとして
作成しないといけません

ソースコードをそのままファイル化します

Mojoファイルの作成コマンド
%%writefile main.mojo

from time import now

def sample_def(n):
    var count: Float64 = 0.0
    for i in range(n):
        for j in range(n):
            for k in range(n):
                count += 1.0
    return count

def main():
    let start_time = now()

    let n: Int64 = 500
    count = sample_def(n)
    print(count)

    let end_time = now()
    let execution_time = Float64(end_time - start_time) / 1000_000_000
    print(execution_time)

これを実行するとGoogle Colabのファイル置き場に
main.mojoが作成されるハズです

このファイルをコマンドで動かします
mojoファイルを実行するコマンドはこれです
# Mojoの実行
!export MODULAR_HOME="/root/.modular" && \
export PATH="/root/.modular/pkg/packages.modular.com_mojo/bin:$PATH" && \
mojo main.mojo
125000000.0
0.18964049799999999


先ほどのPython実行は7-8秒ほどになるので
単純計算で40倍くらいは速くなっているようです

単純だけども、時間の掛かる計算をやらなければ
いけない場合に、一部をmojoに書き換えておけば
その分格段に速くなりそうですね

複雑なものだとコードの差異が大きいので
大変そうですが、簡単なアルゴリズムの
書き換え程度なら、実用出来かなと思いました

今後は機械学習系の実装も
徐々にMojoに置き換わって行くのかなと
推測します

速くなる分には
何のデメリットも無いですもんね
今後の動きを期待したいです

今回はMojoをGoogle Colabで試してみました
それでは

たまには真面目に
数学の問題を解いてみましょう

2023年度の東大の数学の問題です


解説動画はこちら



今回は数学の問題です

手で解いたら解法が分からず
すごく時間が掛かってしまう問題も
プログラミングの力を使えば
近似解を簡単に求める事ができます

という訳で
東大の数学の問題を解いてみましょう





2023年度東大数学文系第3問

問題:
黒玉3個、赤玉4個、白玉5個が入っている袋から
玉を1個ずつ取り出し、取り出した玉を順に1列に12個並べる
ただし、袋から個々の玉が取り出される確率は等しいものとする

(1) どの赤玉も隣り合わない確率 p を求めよ
(2) どの赤玉も隣り合わないとき
どの黒玉も隣り合わない条件付確率 q を求めよ


12個の順列の問題ですね
プログラミングの力を使えば
こういうのもシミュレーション出来ます


考え方

まずは石を用意しましょう
次にその石の並びで隣同士なのかどうかを
チェックする方法を考えてみましょう

次のようなやり方で
石のデータと判定方法を
考える事ができます
# 12個の玉を作って試してみる
import numpy as np

data = ["b"]*3 + ["r"]*4 + ["w"]*5
np.random.shuffle(data)

# リストを結合して文字列にする
st = "".join(data)

# 赤玉が隣り合わないかどうか
res1 = "rr" not in st
# 上記のに加えて黒玉が隣り合わないかどうか
res2 = res1 & ("bb" not in st)

print(st)
print(res1)
print(res2)
rwrwwbbrbwwr
True
False

データは文字列やリスト型で定義しておくと
後で計算しやすいです

これを元にして
計算を行ってみましょう



順列を生成してチェックする方法



今回は12個の中から12個を取り出してつくる
順列になるので、その総個数は
import math

math.factorial(12)
479001600


順列は itertools ライブラリの
permutations で作る事ができます

チェック機構では判定式を返し
Trueを1、Falseを0として
条件にあった個数を返していきます

最終的に条件にあった個数と
元の順列の個数を組み合わせれば
確率が求められます
import itertools

def num_check(data):
    st = "".join(data)
    res1 = "rr" not in st
    res2 = res1 & ("bb" not in st)
    return res1, res2

data = ["b"]*3 + ["r"]*4 + ["w"]*5

ans1, ans2 = 0, 0
for t in itertools.permutations(data):
    t1,t2 = num_check(t)
    ans1+=t1
    ans2+=t2

# 総当たりの個数(順列の個数)
permutations_num = math.factorial(12)

print("1の答え : {0}".format(ans1/permutations_num))
print("2の答え : {0}".format(ans2/ans1))
1の答え : 0.2545454545454545
2の答え : 0.6130952380952381




シミュレーションしてみる


総当たりの方法が思いつかなくても
シミュレーションで近似解を求める事ができます

先ほどは順列を作って繰り返しを行っていましたが
単純に回数を指定して、ランダムに並び替えた後に
チェックを行えば、順列の際の近似が求められます

チェック関数は先ほどのを用いるとして
次のような計算でシミュレーションできます

import numpy as np

N = 100000000

ans2_1, ans2_2 = 0, 0
for i in range(N):
    data = ["b"]*3 + ["r"]*4 + ["w"]*5
    np.random.shuffle(data)
    t1,t2 = num_check(data)
    ans2_1+=t1
    ans2_2+=t2

print("1の答え : {0}".format(ans2_1/N))
print("2の答え : {0}".format(ans2_2/ans2_1))
1の答え : 0.25452006
2の答え : 0.613167347202417


小数点第3位くらいまでは
同じ数字になりますね

近似解だと点数は貰えないかもしれませんが
点数関係ない、仕事上の計算であれば
こういったシミュレーションが行えるのが
プログラミングの役に立つポイントです

確率が分からなくても
それっぽい確率を算出する事ができるので
いろいろ便利ですねえ

色々なシミュレーションを行えるので
仕事がめちゃくちゃ捗ります

プログラミング出来ない方は
是非、この機会に覚えてみて下さい


今回は数学の問題を解く
プログラミングでのシミュレーションでした
それでは
 

このページのトップヘ