画像生成AIで第二言語習得論に基づく語学学習をする方法
【本文を読む前の注意】
タダで全文読めます。
有料部分は、ちょっとした配布ファイルとその注意書きが書かれている程度です。古いコードもあります。
道中で出るコードは、自分でも勉強に使っています。より便利にするために時折改変していますが、記事中のコードは古い記述のまま修正していません(気が向いたら直します)。配布ファイルにあるコードは、新しい記述に修正されています。
1.お前は何を言っているんだ(概要)
英語学習論という本があります。一年ほど前に簡単なレビュー記事を書きました。
第二言語習得論に精通した著者が、理論と経験をもとに、効率的な英語学習方法について書いた本です。英語学習にフォーカスした内容ですが、第二言語習得論をベースにした内容なので、英語以外にも応用できます。
著者は、スピーキングの重要性を次のように書いています。
その詳細については本書(面倒なら前述などのレビュー)を参照してほしいのですが、雑に書けばスピーキングは他三技能の養成に大きく貢献することが重要というのが趣旨です。加えて、著者は勉強のしやすさにおいてもスピーキングは重要だと書いています。
これが意味することはどういうことかというと、
TOEIC L&Rの点数だけ欲しいからスピーキングもライディングも不要だよね!
別に、英語で会話したいわけじゃないし……論文とか読む以外に使わないし……。
といった人でも、スピーキングを勉強することは大事ということです。
そのスピーキングの練習法として8つ挙げられていて、そのうちの1つがPicture Task(絵の描写)というものです。文字通り、絵または写真の様子を英語で表現する練習法です。TOEICのPart 1で出てくる写真を見て、それについて喋るイメージです。
2.いい感じの画像を作るのに最適な画像生成AI
しかし、このPicture Taskには画像を探すのが面倒という問題があります。
TOEICや英検などの問題集がいい教材なのですが、模試などにはあまり多く収録されていません。かといって、ネットでいちいち探すのも面倒です。探すところから始めるとなると、きっとその面倒さで勉強をやめてしまいます。
「そんなの、お前の気持ち次第じゃん!」
「意志が弱いだけだろ!」
と指摘する人もいるかもしれません。しかし、このちょっとした面倒は勉強をするにあたって、大きな壁になります。
私の記事でたまに触れる「TINY HABITS」(和訳:習慣超大全)という本があります。これは、スタンフォード大学で"behavior scientist"(日本語的には行動科学者?)を教えるBJ Fogg先生によって書かれた本です。その中で、行動を起こすには、以下の3つをすべて満たす必要があると説いています。これを、著者は簡単にB=MAPと表現しています。
モチベーション
やりやすさ
ムキムキになりたい → 何をするかが曖昧なので×
スタミナつけるためにフルマラソンする → 難しすぎて×
スクワット2回する → 簡単だしやることが明確なので〇きっかけ
気が向いたらやる → 気が向かないとやらないので×
トイレ行ったらやる → 生活に根付いたことなので〇
難しい目標だと、行動するか否かはモチベーションに依存します。簡単な目標であれば、モチベーションが高くなくても実行できます。しかし、簡単であったとしてもきっかけがなくては行動に移しません。著者のいうB=MAPとは、こういうことです。これを簡単に図にしたものが以下の画像です。
人のモチベーションは熱しやすく冷めやすいものですから、画像を調べるひと手間があることで、勉強するか否かに直結してしまうわけです。ですから、画像を手軽に集められれば、勉強しやすい環境が整うわけです。
そこで思いついたのが、扱われ方のせいで物議を醸しがちな画像生成AIです。「TOEICのリスニング問題っぽい写真を作ってください」といったお願いをすれば、オリジナルの画像をその都度作ってくれます。なので、以降に画像生成AIを用いたスピーキング練習の方法を記述します。
3.Google Colaboratory上で画像生成AIを使う
その画像生成AIを使うには、高いスペックのパソコンが求められます。とはいえ、「語学学習のためにゲーミングPCを買ってください」と書くのは無理があります。そこで、今回はタダで利用可能なGoogle Colaboratoryを使って実装する方法を紹介します。やりかたは下記のnoteを参考というかコピペしています。ちなみに、スマホのブラウザからでも(やりにくいですが一応)実行可能なので、いつでもどこでもPicture Taskすることが可能になります。
3-1.Google Colaboratoryファイルを作る
3-2.編集→ノートブックの設定→ハードウェアアクセラレータをGPUに変える
3-3.必要な環境をインストールする
# 実行後、色々表示される出力が消えたら準備完了。画像生成が可能になる。
!pip install --upgrade diffusers[torch] transformers
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
import torch
from google.colab import output
model_id = "stabilityai/stable-diffusion-2-1"
pipe = StableDiffusionPipeline.from_pretrained(
model_id,
scheduler=EulerDiscreteScheduler.from_pretrained(
model_id,
subfolder="scheduler"
),
torch_dtype=torch.float16
).to("cuda")
pipe.enable_attention_slicing()
output.clear()
3-4.好きなだけ画像を出す
# ネタを多彩にするために、promptを適当に1つ選ぶ
import random
TextArray = ["2-4 people in city or town",
"2-4 people hold a meeting in office",
"public park, no people",
"a person shopping in a grocery store",
"some fruits in wood basket"
"a family dine out, round table seats some people, many dishes on the table"]
prompt = "a photo of " + random.choice(TextArray) + ", like TOEIC/TOEFL/IELTS listening questions, high quality, highly detailed"
# 出力
image = pipe(prompt, height=768, width=768).images[0]
image
途中で「ランタイムの切断」と表示された場合は、3-3.からもう一度やり直す。
※5-2.項で複数回まとめてやる方法を紹介しています。前述の共有ファイルは、5-2.項のものを使用しています。
もし、3-3.項でエラーが出る場合は「Google Colaboratory Stable Diffusion」で検索して、比較的新しい解説記事を見ることをオススメします。というのも、どのサービスも日々アップデートされているので、以前できていたことができなくなることが往々にしてあるからです。
4.生成される画像はそれなりに使える
では、できた画像のクオリティはどんな感じでしょうか。"2-6 people in city or town"の場合はこんな感じになります。
顔面が崩壊している等おかしな点が見受けられますが、些細な問題です。写真を解説できるだけのネタがあれば十分練習になります。同じように出力した以下の画像を見てみましょう。
これであれば、例えばこんなことが言えそうです。
天気は曇り
比較的軽装だから夏っぽいかも
お店っぽいものがいくらか見える
一人買い物袋持ってるしぱっと見商店街っぽい
右側の店はなんだか分からないけどカフェかな
木は10本くらい生えてる。整然と並んでいるよ
1分程度で話そうと思えば、多すぎるくらいの情報量です。
5.改造して色々出力してみる
途中で出てきたコードはpythonなので、中身をいじって色々要素を増やすことができます。
5-1.ネタを増やす
出力するネタ元となるpromptは、前述のように以下のコードで構成されています。
import random
TextArray = ["2-4 people in city or town",
"2-4 people hold a meeting in office",
"public park, no people",
"a person shopping in a grocery store",
"some fruits in wood basket"
"a family dine out, round table seats some people, many dishes on the table"]
prompt = "a photo of " + random.choice(TextArray) + ", like TOEIC/TOEFL/IELTS listening questions, high quality, highly detailed"
これの意味するところは、以下の通りです。
最初は"a photo of "
次にTextArrayにある文をランダムに1つ選択
最後は", like TOEIC/TOEFL/IELTS listening questions, high quality, highly detailed"
TextArrayは配列です。プログラミング知らない人向けに説明すると、変数が入ったひとまとまりのものです。今回使われているpythonで、中身を文章にしたい場合は、以下のような書き方をします。
配列 = ["文1", "文2", "文3"] #文はいくらあってもよい
というわけで、[ ] の中身を , で区切って、文章を"で囲えば、ネタを自由に増やすことができます。なので、
もっとほかのシチュエーションが欲しい!
もう少しディテールを追求したい!
そう思った場合は、各自で編集することが可能です。promptは文章で書くと変な齟齬が起きにくいですが、面倒なら"shop, food, drink, table"と英単語だけ羅列してもOKです。Google翻訳などで文章を作らせるのも一手です。本当は細かい仕様があるのですが、画像生成ガチ勢でもない限りは些細な問題です。
とはいえ、画像生成初心者向けに注意してほしいのは、一つの文にたくさん情報を詰めないようにすることです。一つの画像に情報をたくさん載せてほしいからといって50個くらい英単語を追加しても、反映されなかったり、中途半端に反映されたり、他の要素が無視されたりするので、あまりメリットがありません。
5-2.反復出力する
先に挙げた「英語学習論」では、こういったスピーキングの練習をする場合、時間制限を設けて負担を増やすことが有効とのことです。ただ、3-4.項で挙げたコードだと、1枚出力して終了するので、手動で時間を管理する必要があります。加えて、画像生成するのに30~50秒かかるので、操作するたびに画像生成を待つ必要があります。少し面倒ですね。
そこで、この画像出力を時間制限(今回は1分)を超えた時に、新たに画像を出力するようにしてみます。具体的には、3-4.項のコードを以下に変えて実行します。
import random
import time
from google.colab import output
# 画像のネタ元
TextArray = ["2-4 people in city or town",
"2-4 people hold a meeting in office",
"public park, no people",
"a person shopping in a grocery store",
"some fruits in wood basket"
"a family dine out, round table seats some people, many dishes on the table"]
# 画像出力の回数
photoNumber = 5
# 制限時間の指定
interval = 60
# 制限時間の調整(image.show()で少し時間がかかるため)
fix_interval = 10
# 画像生成
for i in range(photoNumber):
startTime = time.time()
prompt = "a photo of " + random.choice(TextArray) + ", like TOEIC/TOEFL/IELTS listening questions, high quality, highly detailed"
image = pipe(prompt, height=768, width=768, num_inference_steps=50).images[0]
# 制限時間だけ経過しているかのチェック
while True:
endTime = time.time()
passedTime = endTime - startTime
if passedTime >= interval + fix_interval:
output.clear()
break
else:
time.sleep(5)
print(str(int(passedTime)) + " seconds passed.")
image.show()
time.sleep(interval + fix_interval)
output.clear()
このようにすれば、1分経つごとに出力された画像が消され、否応なしに次の画像が現れます。もちろん、intervalやphotoNumberの数字は個人の自由です。
5-3.より深く改変する(上級者向け)
ただ、私はpythonについては本で少し勉強した程度の知識しか持ち合わせてないので、このコードも粗があると思います。より知識がある人は、これをさらに改変して自分好みの使用にしてみましょう。
6.まとめ
この記事では、まず語学学習には第二言語習得論によればスピーキングが重要であることに触れ、その勉強に効果的なPicture Task(絵の描写)というスピーキング練習法を紹介しました。加えて、その画像を生成するために、Google Colaboratoryで一定時間ごとに画像を生成する方法を紹介しました。
語学学習の勉強で悩んでいる人に、この記事が役立てば幸いです。
――― 本文はここまで ―――
7.以上の手順が面倒な人向けの有料配布ファイル
以下の有料部分には、ここまで説明したことが設定済みで、開くだけで実行できるColaboratoryファイルがあります。念のためにもう一度書きますが、記事を読んでコピペすればできるファイルです。無料配布することで余計なトラブルを避けたいのがメインの理由です。
「この記事に投げ銭をしたい!」という物好きな人がいれば、投げ銭目的で購入することも可能です。
ここから先は
¥ 500
この記事が気に入ったらチップで応援してみませんか?