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

プログラミング

今回はアプリをリリースしたので
そちらのご報告です。

解説動画はこちら



アプリについて


今回作成したアプリはこちらです

・チャンクde英会話

iOS
AppStore


Android
Googleplay

良かったら使ってみてください


アプリの作成方法

Flutterを用いて作成しました

Flutterにした理由は
 1.iOSとAndroid両対応であること
 2.学習コストが低い
 3.文献が豊富で有る

以上の理由からFlutterにしてみました。

それ以外にもアプリを作る方法は
いくらでもありますが、今回は
Flutterを使ってみました。

開発言語がDartになるので
1から勉強することになります。

また、コードやデータなどの大半は
ChatGPTを用いて作成していますので
実質ChatGPTに頼れば
アプリの開発は容易かと思います。

学習開発の期間で2ヶ月くらいでした。



リリースについて

コードを実装しシミュレータや
実機でのテストが終わったら
ビルドを行なってアプリを作り
リリース準備ができます。


その前にアプリストアのアカウントがないと
そもそもリリース出来ないので
アプリストアのアカウント取得が必要です。

これもそこそこ手間と時間が掛かります。

リリース登録をしたら審査が行われますが
審査に通らなければビルドからやり直し
審査に通るまでの繰り返しです。

審査に通ったらようやく
リリース、アプリ配信ができる様になります。

リリース作業を始めてから
アカウント登録とアプリリリースまでで
大体1ヶ月くらい掛かっています。



Flutterについて

動画の方では少しだけ解説していますが
FlutterはiOSとAndroidの両方のアプリを
作成する事ができる開発フレームワークです。

Flutterをインストールしたら
VSCodeなどでコードを書き進める事が
できる様になります。

テストやビルドなども
Flutterコマンドを用いて行う形になります。

この辺りも
VSCodeと合わせておくと
開発が楽になるかなと思います。

どんな感じなのかは
動画の方で解説していますので
参考にしていただければと思います。


最後に

これからアプリ開発を行いたい方にとっては
色々な選択肢があると思いますが
Flutterを使ってアプリを開発したい方が
増えていただけたら幸いです。

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チートシート


 

先日放送されていた
水曜日のダウンタウンの企画で使われていた
清春さんの新曲にAIは
どこまで正しく文字起こしできるのか
検証してみることとしました。

解説動画はこちら




はじめに


元ネタは「水曜日のダウンタウン」の企画
「清春の新曲、歌詞を全て書き起こせるまで脱出できない生活」
です。

ここでは、清春さんの新曲「霧」の歌詞を
芸人「きしたかの」が二人合わせて聞き取っていましたが
AI文字起こしでどこまで正しく文字起こしできるのか
試してみる事としました。


手順としては
1.spleeterでボーカル音声を抽出する
2.ボーカル音声をWhisperで文字起こしする
となります。



1.Spleeter でボーカルを抽出する

楽曲の音声ファイルから
声だけを抜き取るには
「Spleeter」を使うと出来ます。

詳しい使い方は
音楽データからボーカル・伴奏の音を抽出できるspleeterを使ってみた


インストール
# インストール
!pip uninstall tensorflow -y
!pip install yt-dlp
!pip install pydub
!pip install spleeter==2.4.0

ライブラリの読み込み
# モジュール読み込み
import warnings
warnings.simplefilter('ignore')
from IPython.display import Audio,display,clear_output,update_display
import glob
import os
import subprocess
import re
import ipywidgets as widgets
import shutil
from pydub import AudioSegment
from spleeter.separator import Separator

音声ファイルをディレクトリ に起きます。
配置したmp3からボーカルだけを抽出します。
#@title mp3からボーカル抽出
from spleeter.separator import Separator
file_name = "霧.mp3"#@param {type:"string"}
MP3_BITRATE = "192k"#@param {type:"string"}

# 2stemsモデルを使用してボーカルと伴奏に分離
separator = Separator('spleeter:2stems')

# 音楽ファイルを読み込み、分離を実行
separator.separate_to_file(file_name, '/content')

# wavをmp3に変換する
dir_path = file_name.replace(".mp3","")
vol_file_name = "vocals.wav"
audio_file_path = f"/content/{dir_path}/{vol_file_name}"
AudioSegment.from_wav(audio_file_path).export(audio_file_path.replace(".wav",".mp3"),format="mp3",bitrate=MP3_BITRATE)

抽出した音声を聴く場合は
#@title ボーカル抽出を聞いてみる
from IPython.display import Audio

# 音声ファイルのパス
audio_file_path = '/content/霧/vocals.mp3'#@param {type:"string"}

# 音声の再生
Audio(audio_file_path)

2.Whisperで文字起こしをする

whisperはopen AI が開発した
音声文字起こしです。

詳しくはこちら
音声認識ライブラリWhisperを使って文字起こししてみる


OpenAI Whisperのインストール
!pip install git+https://github.com/openai/whisper.git

文字起こしの実行はこちら
#@title OpenAI Whisperで文字起こし
import whisper

vocal_file_path = "/content/霧/vocals.wav"#@param {type:"string"}

model = whisper.load_model("base")
result = model.transcribe(vocal_file_path)

answer = result["text"]
print(answer)

うまく文字起こしできたら
テキストが表示されると思います。


さーて
うまくいったのでしょうか!!?!

結果は動画をお楽しみ下さい
それでは。



今回はR1ファイナリスト
ルシファー吉岡さんのネタを
検証してみることとしました。

解説動画はこちら





はじめに

R1ファイナリスト
ルシファー吉岡大先生のネタに
東京中のデリ全部呼んでみた

というネタがあります。

このネタの中では
大体の店舗数と
平均在籍人数がうたわれていましたが
今、このネタを実践すると
おおよそ幾ら掛かるのか

大雑把なフェルミ推定してみたいと思います



計算方法

店舗数 x 在籍人数 x 平均金額
金額はネタと同じく
60分あたりの金額とします。



1.東京都のデリバリー店舗数

こういうのは警視庁の許可がいりますね。

無店舗型性風俗特殊営業1号 の許可数が
店舗数になると思います。


こんな資料をみつけました

こちらに
令和4年12月末時点の
許可数が出ていました。



2.在籍人数を推測する

全ての店舗のHPが
WEB上に存在する訳では
無さそうだったので

「シティー天国」というサイトがあったので
そこのデータを引っ張ってくる事にしました。


うまく取れなかったのを除いて
在籍数の分布は
ninzuu

こんな感じになります。
これの平均在籍人数を求めました。



3.料金はどうなっているのか

そのお店の紹介に載っている
コースの料金を元に
60分あたりのコース料金を計算しました。


kakaku

分布はこんな感じになります。
この平均値を一人当たりの料金とします。


実際にかかる金額はいくらになるか

1.店舗数 : X件
2.平均在籍人数 : Y人
3.60分平均料金 : Z円

X * Y * Z = ・・・・・

金額は動画を見てみて下さいね。


最後に

いやーこんな素敵なネタを思いついて下さるなんて
素晴らしいですね

発想が神の領域侵犯です。

2024年のR1ファイナリストらしいので
是非優勝していただきたいと思います。

それでは。

最近、やけに地震が多いので
気になって調べて
データを取って可視化してみました。


解説動画はこちら


 
今回のコードは
気象庁の地震データを取得して
そのデータを可視化するコードです。

先にデータが必要になるので
気になった人はコードを実行してみて下さい。

Jupyter Notebook や Google Colab で
実行できると思います。


地震データを取得する



気象庁から地震の観測データを取得して
データフレームにします。

やりたい人は、30分くらいかかるので
気をつけてやって下さい。

リンクを取得
import re
import time
import pandas as pd
import requests
from tqdm import tqdm
from bs4 import BeautifulSoup

domain = "https://www.data.jma.go.jp/"
index_url = "https://www.data.jma.go.jp/svd/eqev/data/daily_map/index.html"
res = requests.get(index_url)
soup = BeautifulSoup(res.content, "html.parser")
eq_link = [i.get("href") for i in soup.find_all("a") if len(i.get("href"))==13]
print(len(eq_link))

リンクからデータを取得する
# 地震データをテキストから取得
def data_pick(text):
    row_data = []
    for row in [i for i in text.split("\n") if len(i)>1][2:]:
        row = row.replace("° ","°")
        for i in range(7,1,-1):
            row = row.replace(" "*i, " ")
        row = row.replace(":"," ")
        tmp = row.split(" ")
        row_data.append(tmp[:-1])
    return row_data

all_data = []
for day in tqdm(eq_link):
    url = "https://www.data.jma.go.jp/svd/eqev/data/daily_map/" + day
    #print(url)
    res = requests.get(url)
    soup = BeautifulSoup(res.content, "html.parser")
    time.sleep(3.971)
    text_data = soup.pre.text
    all_data += data_pick(text_data)
    #break

print(len(all_data))


データを加工してデータフレームにする
columns=["年","月","日","時","分","秒","緯度","経度","深さ(km)","M","震央地名"]
df = pd.DataFrame(all_data,columns=columns)
df = df[df["M"] != "-"].reset_index(drop=True)
df = df.astype({"M": float , "深さ(km)":int, "年":int,"月":int,"日":int})
df["M2"] = df["M"]//1
df["年月日"] = df.apply(lambda x : "{0}{1:02}{2:02}".format(x["年"],x["月"],x["日"]),axis=1)

def lat_lon_10(x):
    tmp = x.split("°")
    degree = int(tmp[0])
    minute = int(tmp[1].split(".")[0])
    second = int(tmp[1].split(".")[1].split("'")[0])
    # 度、分、秒を10進法で表現
    decimal_degree = degree + minute/60 + second/3600
    return decimal_degree

df["緯度10"] = df["緯度"].map(lat_lon_10)
df["経度10"] = df["経度"].map(lat_lon_10)
df["size"] = df["M2"] ** 3

うまく実行できたら
df という変数にデータが格納されると思います。

エラーが出る人は
ライブラリが足りなかったり
通信がうまくいっていなかったり
色々な事象が起きると思いますが
全部は対応出来ませんので
がんばって解決して下さい。


データを見てみる


データを取得できたら
データを見てみましょう。

変数 df に対して
条件を指定すれば
絞り込みをしてみる事ができます。

マグニチュード別の地震回数
df[["M2","震央地名"]].groupby("M2").count().sort_index(ascending=False)
スクリーンショット 2024-03-02 16.29.41

日本地図にプロットする


日本地図にプロットするには
緯度と経度が必要です。

df 変数にはカラムとして
作成しているので
地図に表示する事ができます。

import plotly.express as px

fig = px.scatter_mapbox(
    data_frame=df[df["M2"]>=5],
    lat="緯度10",
    lon="経度10",
    hover_data=["年月日","深さ(km)"],
    color="M2",
    size="size",
    size_max=20,
    opacity=0.3,
    zoom=4,
    height=700,
    width=1500)

fig.update_layout(mapbox_style='open-street-map')
fig.update_layout(margin={"r": 0, "t": 0, "l": 0, "b": 0})
fig.show()
output_88_0




千葉県だけにすると
こんな感じです。

output_106_0


色々な条件で絞り込んで
地図に反映させる事ができます。

最近は地震が多いので
何かが起きている可能性がありますね。

警戒を強める意味でも
データを見る価値はあるかもしれません。

今回は地震のデータを取得して
それを可視化するコードについてでした。

それでは。


このページのトップヘ