とりとりとりぴ

ちょっと残しておきたいことをまとめています。

会社のAIハッカソンに参加したよ

2025年の7月31日から8月1日の1泊2日で会社のAI合宿に行ったのでシェア。

私は今回技術メンター的な立ち位置で参加した。

このハッカソンでは2日かけて大きなものを作るというよりは、小さなハッカソンを3回やってAIを使った物作りに慣れてもらうことがコンセプトだった。

続きを読む

最近の音楽生成・音声生成について調べちゃおう

前回の続きです。 今回は音楽生成や音声生成について調べてみました。

音楽生成

音楽生成は課金プランを利用すると、作業用のミュージックであったり、いい感じのjpopソングを作ってくれます。

サービス名 できること 無料プラン 有料プラン例 商用利用
Suno 歌入り楽曲・BGM生成 〇(制限あり) \$10/月〜 △(一部可)
AIVA BGM作曲、ジャンル選択可 〇(条件有) €15/月〜
Soundful 簡単なBGM自動生成 〇(3曲/月) \$9.99/月〜
Amper Music ジャンル選択でBGM自動作曲 〇(DL制限) \$5/月〜

Suno

https://suno.com

得意なジャンル:

作風傾向:

  • 歌詞もAIで自動生成(プロンプトでお題指定可能)
  • それっぽい歌声・メロディ・伴奏が一発で作れる
  • ボーカルのバリエーション豊富、歌詞も自在

長所:

  • 日本語・英語など多言語で歌入り楽曲が生成できる
  • 歌詞/ジャンル/テーマを入力するだけで本格的な曲が完成
  • 商用利用も可能(一部プランで規約要確認)
  • SNSショート動画やネタ曲、オリジナル音源づくりに最適

短所:

  • 無料プランは生成数やダウンロード回数に制限あり
  • 完全な「プロ仕様」の音質には及ばない場合も
  • 音楽の細かい編集や部分修正は苦手

Sunoはいい感じの音楽を生成してくれます。試しに落ち着く音楽を生成していただきました。 https://suno.com/s/Pf9jx1RneJWQDVMO

バラードっぽいものを生成してもらいましたが、若干アニソンっぽいです。

およげ!たいやきくんみたいな曲を出してくださいと言ったら、ボカロっぽい声で出してくれました。 https://suno.com/s/fJJH4RtLY1Epv3Rm

Instrumentalモードをonにすると、歌詞なしの曲も作ってくれます。 https://suno.com/s/A4ugyDkYxAHYaZYX

とっても素敵ですね。個人的に機能が一番優れていると思いました。

AIVA

www.aiva.ai

得意なジャンル:

  • 映画音楽・ピアノ・オーケストラ風BGM
  • ゲーム音楽・癒し系・クラシック

作風傾向:

  • 映画のサウンドトラックのような壮大・繊細なBGM
  • メロディーや和声がしっかりした上品な雰囲気
  • 楽器構成がリッチ(ピアノ・ストリングスなど)

長所:

  • ジャンル・気分・雰囲気など細かく指定できる
  • 商用利用可能(有料プランなら著作権もクリア)
  • 編集画面でコードやメロディの微調整もできる
  • エクスポート形式も豊富(MP3、MIDIなど)

短所:

  • 無料だとクレジット表示が必要・DL制限あり
  • 一部機能や高品質楽曲は有料プラン限定
  • 日本語UIは未対応

Soundful

my.soundful.com

得意なジャンル:

  • ローファイ・ヒップホップ・エレクトロ
  • ポップ・ダンス系・インストBGM
  • 短尺BGMやループBGM(SNS動画向き)

作風傾向:

  • トレンド感のある現代的なBGM
  • シンプルでキャッチー、使いやすい
  • ループしやすく、SNSや動画編集で使い勝手◎

長所:

  • 操作が超シンプルで初心者にもやさしい
  • ジャンル・気分・長さを選ぶだけで数クリック生成
  • 商用利用OK(有料プランなら著作権フリー)
  • YouTubeTikTokPodcast、広告用など幅広く活用可能

短所:

  • 1ヶ月に作れる曲数に無料枠制限あり(例:3曲/月)
  • 独創的なメロディや構成はやや弱め
  • ボーカル入りの楽曲生成は非対応(インストのみ)

こちらも登録して、いくつか音楽を見てみました。 このサービスは元となる音楽を選択し、そのジャンルに似た音楽を生成してくれるみたいです。

音楽を見る限りEDMっぽい音楽と、瞑想っぽい音楽が多いなというイメージで好みとは違いました。 入眠の音楽作成に良さそうです。

Amper Music

得意なジャンル:

  • ポップ、ロック、エレクトロ、企業系BGM
  • 軽快・明るい雰囲気、現代的なサウンド

作風傾向:

  • シンプルで使いやすい現代風BGM
  • 無難なBGMが量産しやすい
  • ループしやすいサウンド設計

長所:

  • 超シンプル操作、すぐにBGMが作れる
  • 商用利用OK(有料プランならロイヤリティフリー)
  • ジャンル・雰囲気・長さを指定するだけでOK
  • 編集がとても直感的(パートごとに楽器追加も可)

短所:

  • 独創性や深みはやや弱め
  • ジャンルによっては単調に感じることも
  • サービスによっては日本からアクセスできない時期もある

まとめ

二つのサービスを使ってみましたが、個人的にSunoが一番使いやすいなと思いました。

音声生成(AIボイス生成)

サービス名 できること 日本語対応 無料プラン 有料プラン例 商用利用
CoeFont 超自然な日本語AIナレーション 〇(1,000文字) ¥980/月〜
VOICEROID2 キャラクター風の音声合成 ×(体験版のみ) 買い切り¥9,000前後
VOICEVOX 完全無料キャラボイス生成 ◎(完全無料) 無料
AITalk 落ち着いた日本語ナレーション × ¥2,200/月〜
Synthesizer V 歌声合成/ナレーション × ¥10,000前後(買切)
ElevenLabs 超自然多言語ボイス(日本語OK) 〇(β対応) 〇(制限有) \$5/月〜
Descript (Overdub) 英語中心だが一部日本語可能 \$12/月〜
PlayHT 多言語/商用向けAIボイス 〇(やや機械音) 〇(制限有) \$31.20/月〜
Voiceful.io 多言語AIボイス/歌声 〇(日本語可) €9.99/月〜

1. 日本語対応・ナレーション/キャラ重視タイプ

代表サービス:

  • CoeFont
  • VOICEROID2
  • VOICEVOX
  • AITalk
  • Synthesizer V

特徴:

  • 日本語ナレーションやキャラクターボイスのクオリティが非常に高い
  • 商用利用OK(規約要確認)
  • VOICEVOXは完全無料で使いやすい
  • VOICEROID2やSynthesizer Vは「買い切り」型で本格派
  • CoeFontやAITalkはWebベースで編集や調整も簡単

2. 多言語・グローバル向けタイプ

代表サービス:

  • ElevenLabs
  • PlayHT
  • Voiceful.io
  • Descript (Overdub)

特徴:

  • 英語や多言語ボイス生成に強い(日本語も一部対応)
  • ナレーション用途やグローバルSNS発信にも◎
  • 商用利用OK(有料プラン推奨)
  • ElevenLabsは超自然な発音と多言語対応が強み
  • PlayHT/Voiceful.ioは歌声・多様な声質にも対応
  • Descriptは編集機能付き(Overdubで自分の声も再現可能)

3. 歌声合成・音楽系特化タイプ(参考)

代表サービス:

  • Synthesizer V
  • Voiceful.io

特徴:

  • 人間らしいAI歌声が作れる
  • オリジナルソング・カバー・BGM制作に活用可
  • 日本語歌唱もOK
  • 無料体験や有料買い切り型も選択可能

最近の画像生成・動画作成について調べちゃおう

最近めっちゃ流行りのAI。仕事柄AIはめっちゃめっちゃ使うのですが、エンジニアなこともあってかコーディング特化のAIしか知らない。

エンジニア界隈はClaude Code, Devin, Cursor, ChatGPTあたりをよくつかっているイメージだが、それ以外の界隈のAIを知らなすぎる!!!

SNS運用に興味があるので、画像生成や音楽生成、動画生成のAIについて今回調べてみようと思う。

とりあえず課金しているChatGPTに聞いてみる。

愛用のChatGPT バージョン4.1

めっちゃ出してくれた。一つ一つ見ていこうと思う。

画像生成

サービス名 できること 無料プラン 有料プラン例 商用利用
Midjourney テキストから高精度イラストや写真 ×(試用のみ) \$10/月〜
DALL·E 3 (OpenAI) テキストから画像、写真 一部〇 ChatGPT Plus \$20/月
Stable Diffusion ローカル・クラウドで多様な画像生成 有料API・商用プラン有
Canva(Magic Media) 画像やデザイン自動生成 〇(回数制限) Pro: ¥1,500/月〜

私は「DALL·E 3」と「Canva」しか使ったこと無いので、どれが何するのが得意なのかわからない。もう少し詳しく聞いてみてまとめたら以下のようになった。

DALL·E 3(OpenAI)

得意なジャンル:

  • イラスト
  • シンプルな合成写真
  • 説明用のイメージカット
  • SNSアイコンや資料用イラスト

作風傾向:

  • 明るめ・やわらかめ・自然体
  • ポップで親しみやすい雰囲気
  • リアル過ぎず説明的な描写が得意

長所:

  • テキスト→画像がとにかく簡単(ChatGPTから使える)
  • やわらかめのイラストや説明イメージが得意
  • 商用利用もOK

短所:

  • キャラクターの手や細部が崩れやすいことも
  • 超リアル・超ハイクオリティ写真は苦手
  • バリエーションやマニアックな調整はやや弱い

画像を生成してみた。こんな感じ。安定感ある。

beautiful butterfly

Midjourney

得意なジャンル:

  • アート・ファッション
  • 抽象画・デザイン性の高いビジュアル
  • 印象的なサムネ・表現重視の画像

作風傾向:

  • 芸術的で美しいタッチ
  • ダイナミック・唯一無二の世界観
  • SNS映え・インパクト重視

長所:

  • 芸術的なタッチ、唯一無二のビジュアルが強み
  • ファッション系・抽象アート・表現力のある画像が得意
  • 「美しさ」「おしゃれ」「印象的なサムネ」などに◎

短所:

  • Discord経由でややとっつきづらい
  • 写実リアル写真はやや苦手
  • プロンプト(指示文)の工夫が必要

チュートリアルで生成していただきましたが、かなりアーティステックな画像が生成されてた!ChatGPTでは出てこない雰囲気で結構好きかもしれない。

vibrant California poppies

アート系のグッズとか作るのに良さそう。

Stable Diffusion

得意なジャンル:

  • アニメ・コミック
  • リアルな人物・風景
  • ファンタジー・キャラクター
  • 好みの画風のカスタム

作風傾向:

  • 幅広く自由度が高い(モデル次第で変化)
  • アニメ調もフォトリアルも両対応
  • マニアックなジャンルやニッチな趣味絵も可

長所:

  • 無料でローカル動作も可(PCパワー必要)
  • アニメ・コミック・リアル・ファンタジーなど無限の作風
  • カスタムモデル(LoRA、Checkpointなど)で思い通りの画風にできる

短所:

  • 初心者はセットアップやモデル選びがやや難しい
  • 商用OKだが素材次第で著作権グレーも
  • GUIツール増えて使いやすくなってきたが「最初は学習コスト高」

アニメーション風にして生成してもらった。プロンプトは以下の通り。

コマンド

なんか別のキャラ出てきた。

アニメーション風

粘土風にしたら、キモいの出てきた。

キモすぎ

キャラクターが得意みたいだが、日本風の可愛いキャラは無理なのかも。現状使う気にはなれない。

superheroで出てきた画像

Canva Magic Media

得意なジャンル:

  • SNSアイコン・バナー
  • プレゼン資料用イラスト
  • 簡単なSNS投稿用画像
  • デザインテンプレート活用

作風傾向:

  • わかりやすい・シンプル・実用的
  • ビジネス・教育向け
  • おしゃれなテンプレをそのまま使いやすい

長所:

  • デザイン感覚で直感的に使える(アイコン/バナー/プレゼンに◎)
  • 画像生成とレイアウト組み合わせてSNS用画像作成が速い
  • テンプレが豊富、初心者も簡単

短所:

  • 写実写真や個性的なイラストはやや弱い
  • 本格クリエイティブ作品より「実用/発信用」向け

昔生成したイラストはこんな感じ。抽象的なイラストは得意そう。

canvaの生成画像


動画生成

次に動画生成について調べる。以下が表になる。

サービス名 できること 無料プラン 有料プラン例 商用利用
Runway Gen-3 テキスト→動画、画像→動画 〇(低解像度/回数制限) \$12/月〜
Pika Labs テキスト→動画(短尺) \$10/月〜
Kaiber 画像→短編動画、エフェクト変換 〇(DL制限) \$10/月〜
Canva(Magic Media動画) 簡単な動画生成 〇(回数制限) Pro: ¥1,500/月〜

流石に、パッと動画は作れる気がしないが、無料プランのあるものから4つピックアップした。

Runway Gen-3

作風傾向: * フォトリアル〜映画風の高品質な短編動画 * 実写寄り・ダイナミックな映像 * 抽象表現やアートも比較的得意

得意なジャンル: * シネマティック映像 * ショートフィルム・プロモーション動画 * ミュージックビデオ風・モーショングラフィックス

長所: * テキストや画像から数秒〜十数秒の高品質動画が生成可能 * インパクトある映像を手軽に作れる * 商用利用もOKで動画素材制作にも最適

短所: * 長尺の動画は現状作れない * 細かいカット編集やストーリー制御は苦手 * 無料プランは低解像度&生成回数制限あり

とりあえず、ChatGPTで画像を生成して、それを今人気の包丁でカットするASMRの動画にして作ってみる。 トークンがないので、一番格安のKling2.1を使って動画を生成した。

prompt:星を包丁で切ってください

全然ダメそうw 一番安いのだし、課金したら上手く作れるのかな😅

Pika Labs

作風傾向:

  • カラフル・スタイリッシュ・イマドキなショート動画
  • アニメーション的な表現や動きの強調が得意
  • 抽象イメージ・トレンド感ある映像

得意なジャンル:

長所:

  • テキストから1タップで動く動画が生成できる
  • 動きや色彩が派手でSNS映えしやすい
  • スマホからも利用しやすい

短所: * 細かい演出やシーンコントロールは難しい * 長い動画や複雑な編集には向かない * 無料プランは画質やDL回数に制限

このクマちゃんが動く動画とかはとっても可愛い。

pika.art

さっきのDELL3の画像を入力して、「蝶を飛ばして、その後溶けたように消してください」というプロンプトを投げたがめちゃくちゃいい感じに溶かしてくれた。飛ばなかったけど。これはめっちゃすごい。効果音も入るのやばい。

pika.art

Kaiber

作風傾向:

  • 静止画→動きのあるショート動画化が得意
  • エフェクト演出や未来的なビジュアルが強み
  • アニメ風・デジタルアート調も可能

得意なジャンル:

  • MV風プロモーション
  • 静止画から作るループ動画・ショートエフェクト
  • SNSプロフ動画やサイバーパンク系映像

長所:

  • 画像一枚から手軽に印象的な動画が作れる
  • エフェクトのバリエーションが豊富
  • 独自性のあるビジュアルで差別化しやすい

短所:

  • 長編・ナレーション入り動画は非対応
  • 動画内容の細かい調整は難しい
  • 無料プランはダウンロードや尺に制限

無料枠がないので、諦め。

Canva(Magic Media動画)

作風傾向:

  • ポップ・実用的なSNS用動画
  • テンプレベースでカジュアル・親しみやすい
  • 写真やアイコン素材を組み合わせた動画が得意

得意なジャンル:

  • SNS投稿・ストーリー動画
  • プレゼン・告知動画
  • ちょっとしたアニメーション入り説明動画

長所:

  • 誰でも直感的に作れるデザイン性の高い動画
  • 写真・画像素材の活用や文字入れが超簡単
  • テンプレ活用で時短&バリエーション豊富

短所:

  • AIによるオリジナル生成要素はやや弱め
  • 複雑な動画編集やストーリー構成は苦手
  • 本格的な映画風やアート系には向かない

適当に一旦生成してもらいました。 こちらのプロンプトは「チョコレートのCMみたいな動画を作成してください。」です。

チョコレートのCM動画

まとめ

いろいろ調べてみて、とにかく「Pika」が私の欲しい動画を生成してくれることがわかったので、一旦ChatGPTとPikaを使ってSNSやってみようかなと思う。

ブログを読んでくれた人はチャンネル登録してくれると嬉しいです。

www.youtube.com

画像のマスク処理除去を最新のAIツールで頑張ってみる

こんにちは。最近めちゃくちゃ精進をサボっててもう5月末、早いです。 GWにおでかけで、かなり遠くの夢の国に行ってきました。

この夢の国にはカメラマンがたくさんいて、カメラで写真を撮ってくれるのですが、どの画像にもマスク処理がかかっており無料で画像を取ることができません。

ちなみに画像を買うとなると、1枚単位ではなく、1日単位、30日単位で画像をとるしか選べなく、1日単位のものでも12000円かかります。 私の場合、撮ってもらった画像は30枚ほどしかなく、1日単位だと8枚くらいです。8枚で12000円は1枚単位2500円であまりにも高すぎます。

そこで今回は最新のツールでどのくらいマスク処理の除去ができるかを試してみたいと思います。


こちらがテストの画像になります。

ChatGPTにいくつかツールを出してもらったので、それらを試していきます。

今回は3つのツールで試してみます。 1. Cleanup.pictures 2. Magic Eraser by Magic Studio 3. Photoshop

Cleanup.pictures

消したいものを消すだけの消しゴム機能を提供しているサービスです。 使う前に2ドルくらい課金する必要があります。3日間無料で利用できます。

こんな感じで消すことができました。しかし雑に消しゴムをすると文字も消えてしまうようで、看板っぽい文字は消えてしまいます。

編集後

今回は建物の写真なので、そんなに気になりませんが人の場合は潰れてしまうと流石に気になってしまいますね。

丁寧にやったらだいぶ綺麗に消えました。いいですね。

丁寧に編集

大体こういうのは周りの画素を確認して、周りの画素に合わせて画素を埋めているため、空とか建物とか色の変化が少ないものに対しては綺麗に除去してくれそうです。

Magic Eraser by Magic Studio

今後は Magic Eraserを使って除去してみました。想像以上に賢くて、結構適当にやってもいい感じに補完してくれます。

magicstudio無料枠

気づいたこととしては、oとかaとか丸が小さい文字はなぞるよりも全体を塗ってしまった方が綺麗に消えることがわかりました。

割と適当にやっても綺麗に消えてくれるので、個人的にはCleanup.picturesよりもこちらの方が使い勝手が良さそうだと感じました。

このツールは除去だけは無料で、高画質保存したい場合に課金する必要があるみたいです。 Cleanup.picturesは先に課金してから無料トライアルなので、気軽に始めるならmagicstudioが良さそうです。

Photoshop

時間があればやりたいけど、めんどくさそうでまだやってない。

[おまけ] 人を使った画像でテスト

cleanup.pictures課金

magicstudio無料枠

課金してないので画質の差はありますが、やっぱりmagicstudioの方が綺麗に消してくれる気がします。 顔はやっぱり潰れてしまいますね。

終わりに

色々ツール試してある程度消せることがわかりました。簡単なリンゴの写真とかのマスクであれば、うまく消してくれそうですよね。

ちなみに友達にプログラムコードでできないかやってもらったのですが、プログラムだと難しい(めんどくさい)みたいです。 ただマスクの方法は共通なはずなので、マスクしているRGBAがわかればリバースエンジニアリング的な感じで元画像を生成できそうな気がします。今のところ、めんどくさいのでマスクされた画像を楽しもうとおもます。

人間だとマスクされている部分ってわかるんですけど、プログラムだと元に戻せないのって本当に面白いですね。

SQLのクエリ実行時のメモリ使用について

先日、とある仕事で自分の書いたプログラムをProductionリリースしたのだが、リリース時にkubernetesのpodがOOM起因でkillされるようになってしまった。

幸い、このプログラムは定期jobのプログラムで、実際の製品とは関係なかったためお客様影響はなかったが、会社に入社してから初めての自分起因でのincidentであったため、すごく焦った。

QAなどもしていたが、クエリが関わるjobであったため、開発環境と製品環境でのクエリの結果に若干の違いがあったため、クエリの結果の差に考慮できてなかったのが問題であった。

そこで今回は、SQLのクエリ実行についてメモリを重点的に見るように勉強しようと思う。


この内容でWeb検索したら結構面白い記事かいくつか見つかった。

-> 全てのSQL server共通ではないだろうが、ある程度は一致しそう。

-> SQLクライアントを開いてから閉じるまでのメモリ動作について。Oracle Databese。

これらの記事を参考にして、今回の問題になったクエリのメモリ量について調べてみようと思う。


今回のクエリのメモリ消費については以下のようになる。使用言語はPHP8.4で、DBはMySQL

  1. PHPプログラムでMySQLクライアントを開く
  2. SQLクエリを定義
  3. 実行計画の作成
  4. クエリの実行
  5. クライアントを閉じる

実際OOMに影響するのは3,4が考えられるが、他の部分のoverheadについても気になるので、chatGPTに聞いてみた。

PHPでMySQLクライアントを開いたり閉じたりする際のメモリ使用量は、使用するPHPのバージョン、MySQLサーバーへの接続の特性、および実際のスクリプトの内容によって変わります。具体的なメモリ使用量を正確に知るためには、実行環境によるプロファイリングやメモリ監視ツールを使用する必要があります。
一般的には、以下のポイントを考慮することができます:
1. 接続オーバーヘッド: mysql_connectを呼び出す際に、PHPはMySQLサーバーとの接続を確立し、必要なリソースを確保します。この時、接続のオーバーヘッドとしてメモリを消費します。
2. リソース管理: 接続が確立されると、PHPはその接続のためのリソースを管理するためにさらにメモリを使用します。ここでは、接続に関連する状態や情報が保存されます。
3. クローズ時のメモリ解放: mysql_closeを呼び出すと、その接続に関連するメモリは解放されます。接続の解放に伴うメモリの使用量は、接続の際に確保されたメモリ量に依存します。

確認にはmemory_get_usage()を使うといいらしい。

ただchatGPTの回答を見ている限り、接続の確立と接続リソースを維持するためのメモリが必要なだけで実行自体には大きくメモリを使わないように見える。

クエリが走るのはSQL serverなので、やっぱりOOMが起きたのはSQLを実行してから返ってくるresponseの値が大きすぎたのが原因っぽい気がする。

podのmemoryが1GB(確認ずみ)で、SQL serverのメモリーは基本的にほぼ無限大レベルで設定しているようなので、SQL server > podは確実そう。

[追記] 先人でやってそうな人を確認した。結果を見ても、453MBだったのでやはりパフォーマンスに大きく影響はなさそう。

blog.mogmet.com


3,4について、面白そうなので、こちらにも注目してみる。

今回のクエリは、ざっと書くとこんな感じであった。

SELECT item1
FROM table_name
WHERE item1 in (hoge, hoge, ...);

item1はchar型であり、20文字くらい。Tableにはindexが定義されていたのでwhereはindex付き。

ってかこの記事見て思ったけど、EXPLAINしたらメモリ使用量出るっぽいね...!

qiita.com

やってみよ

EXPLAIN ANALYZE SELECT item1
FROM table_name
WHERE item1 in (hoge, hoge, ...);

ANALYZEつけたらメモリ出てきた。inの数が増えるほど大きくなるっぽい。inの中身が2つの場合、286Bytes, 5つで299Byte、6つの場合は303Byteになった。ひとつ増えるごとに4Byteくらい増えるっぽい。

改善後のクエリ

EXPLAIN ANALYZE SELECT item1
FROM table_name 
WHERE item1 BETWEEN hoge AND hoge2;

こちらはIndex スキャンで25.2KByte。改善前のクエリよりは重いので使いようって感じだ。

どちらにせよ、クエリの実行自体にかかるメモリというのは軽いのだなと感じた。最適化されてて流石すぎる。アプリケーションエンジニアたちはDBを効率よく使うことが求められている。


OOMが起きた原因は返ってきたクエリの行数が多く、アプリケーションのメモリで受け取った時に死んでしまったっぽい。とあるクエリをproductionで投げたら97万行返ってきて、1行1Byteだとしても9.47MBになるし、1行1Byteな訳がないので100MBくらいあったんじゃないかな。上限が1GBに対して0.1GB(100MB)が急に返ってきたらそれはOOMくるよね...反省

その他の参考記事

pytestでmock作って遊んでみた

PyLadies Tokyoのライブラリ研究会でpytestについて調べたのでまとめる。

2025年は技術記事を1ヶ月に一度作るということを目標にしているが、2月の2回目の記事で、もうキツいなと感じている(笑)

pytestの概要

概要:

  • pytestは、Python用のテストフレームワークで、シンプルかつ強力なテスト機能を提供します。単体テストや統合テストの実装に使われ、コード品質の維持に貢献します。

主な特徴:

  • 簡潔で直感的、読みやすいテストコードの記述が可能。
  • 高度な機能拡張が可能(プラグインシステム)。
  • テストのスキップや条件付き実行、パラメータ化テストをサポート。
  • 詳細なエラーメッセージを出力し、デバッグを容易にする。

pytestのインストール

pip install pytest
pip install pytest-cov # [optional] カバレッジ用 

試したこと

テストのパラメータ化

こんな感じで、一つのテストケースで複数の入力値に対してテストができる。

# app.py

def add(a, b):
    return a+b
# app_test.py

@pytest.mark.parametrize("test_input_a, test_input_b, expected", [
    (3, 5, 8),
    (2, 4, 6),
])
def test_eval(test_input_a, test_input_b, expected):
    assert app.add(test_input_a, test_input_b) == expected

mock

テストしたい関数の中に含まれる、呼び出ししたくない関数に仮装的な値を返すようにさせる。

# app.py

def service():
   resp = call_db()
   return f"{resp['name']}の年齢は{resp['age']}歳です"
  
def call_db():
   return {"age": 2, "name":  "とりとり"}
# app_test.py

def test_xxx_service(mocker):
   # mock化
   mock_get = mocker.patch("app.call_db")
   mock_get.return_value = {"age": 1, "name":  "とりぴ"}


   got = app.xxx_service() # 実行
   expected = "とりぴの年齢は1歳です"
   assert got == expected
pytest .
=> passed

時間がなくてパラメータ化とmockしか見れなかったけど、どちらも他の言語と比較してめちゃくちゃ簡潔にテストが書けるのが素晴らしいなと感じる。 もしPythonを使ってテストを書かなくてはいけない時はぜひpytestを積極的に使っていきたい。

Reference

LINE API + Gemini + Cloud runで英語録音の添削アプリを作成した

最近英語のpodcastを聴き、内容を英語で要約をしたものを音声録音していた。 その音声の使い道がなかったので、こんな感じの英語添削アプリを作成しました。

添削アプリ

録音した音声を添削してくれます。

ことの始めは12月半ばのPythonLadiesの開発合宿で作ることとなり、合宿では70%くらい実装した状態だった。

torichan.hatenadiary.jp

アーキテクチャ

こんな感じ。個人開発ではAWS Lamdaばっかり使ってたので、たまにはGCPを使ってみようということでGemini+GCPで固めてみた。Cloud runとかはじめて使った。今のところは課金請求とかは来ていない。

めっちゃシンプルだけど、意外とハマりポイントが多くて、実装に合宿の2日+年末の1日くらいかかった。

ハマりポイント

初心者にCloud runがなかなか難しい。

ローカルでコードを書いてDockerfileからDocker imageを作成した後、docker pushをしていたのだが、Cloud runとどう繋がっているのか最初よくわからず、新しいimageに更新された時にCloud runが更新されたのか謎だった(されてなかった)。

よくみたらCloud runの設定ミスっていて、指定されたバージョンのimageをCloud runがずっと参照しており、imageをpushしてもCloud runは更新されていないことが判明した。tagをつけたり、設定変えたりしてデプロイするたびにCloud runのリビジョンを更新するようにし、ひとまずうまくdeployできるようになった。

Pythonで音声変換難しい (諦めた)

iPhoneで録音すると音声フォーマットがm4pになってしまうのだが、Speech-to-Textを使うにはwav形式が望ましい。そのためプログラム上でオーディオフォーマットを変換する必要があった。はじめはPythonのライブラリであるsoundfileを使おうと思ったのだが、ライブラリの呼び出しがうまくいかなくて結局subprocessでffmpegコマンドを叩いた。

型とかがよくわからないから変なエラーの時にPythonデバッグが難しくて嫌になる。subprocess使うの負けた感がすごいけど、個人開発だからできればいいのよ、できれば。

LINE APIデバッグ

LINE APIはイベントの取得とWebhookデバッグ方法に本当に詰まった。

イベントの取得方法は以下の記事を読んだのだが、この通りに実装しても全然イベントを取得してくれないし、全く参考にならなかった。

www.divx.co.jp

結局以下のLINE API公式リファレンスを参考に、ルートURLでリクエストを受け取るようにして、送られてきたmessage typeから呼び出す関数を変えるように実装した。

developers.line.biz

参考までに、雑なmain関数。

@app.route("/", methods=['POST'])
def main():    
    event = json.loads(request.get_data())
    message_data = event['events'][0]

    if message_data['message']['type'] == "text": 
        res_message = f"あなたは{message_data['message']['text']}と送ってきましたね!"
        send_message(res_message)
    elif message_data['message']['type'] == "audio": 
        send_message("audioが送信されました")
        audio_main(message_data['message']['id'])
    else:
        send_message("サポートされていないフォーマットです")    

LINE APIのWebhookのデバッグngrokっていう神ツールのおかげですごく楽にデバッグができた。

ngrok.com

ngrokを使った背景としては、LINE APIのメッセージ送信やイベント取得のデバッグで、ローカルサーバーではデバッグができない&毎度ローカルコードをCloud runにdeployするのはめちゃくちゃ面倒くさいという問題があり、ngrokを使ってサービスを公開し、そのURLを一時的にWebhookのURLとして設定することでローカルのデバッグをしていた。

ngrok http http://0.0.0.0:8080 

↑この一行だけで公開されるのマジで神では?ctrl+Cで終わることができる。

この子に会えただけでも今回のアプリを作った甲斐があった。

改善点

頑張って作ったけどまだ気になる点が多いので未来の自分へ向けて。

  • 発音が悪いのかSpeech-to-Textの精度が悪い😢
  • プロンプトがあんまり良くないのか、文法ミスを指摘されがち。Speech-to-Textの精度もあるのでそこ指摘されてもなーという気持ちになる。
  • Speech-to-Textは同期呼び出しのAPIを叩いているので、1分以内の録音にしか対応していない。1分以上もできるようにしたいけど、そうすると間にCloud Storageを挟まないといけなくなるのでめんどくさい。

ちなみに、一回の呼び出しでのレスポンスタイムは1-2分くらいかかる。


久しぶりに色々APIをさわれて楽しかった。また時間あったら個人開発したい🥺