配信のクイズ企画に、作問AIを当ててみる
配信の最後に、その回の振り返りクイズを出す。後から来た人が概要欄を開くと、さっきの配信の見どころが四択で並んでいる。そういう置き方をすると、アーカイブが少し読みやすくなるのではないかと思いました。
ただ、問題を人が作ると時間がかかります。一問ずつ配信を聞き直して、まちがいの選択肢を三つ考えて、答えを書く。三十分の配信でも、その作業は地味に重いものです。そこで、作問AIの「Smart Test Maker」に任せられないかと考えました。
今回試すのは、作問そのものだけではありません。配信の文字起こしを材料にして、問題を作らせ、その問題を概要欄と待機画面に貼れる形に整えるところまでを、一続きで試しました。作問AIが良い問題を出すかどうかは、実はその次の話だと思っています。良い問題が出ても、貼れない形なら使えないからです。
最初に、今回の約束を決めました。決めておかないと、返ってきた文面を見てから「これは違う」と迷い続けることになります。
- 答えが文字起こしに書いてある問題だけを作る。書いていないことは聞かない
- 選択肢は四つ。正解はひとつだけ
- 問題ごとに、根拠になった発話の時刻を書かせる
- 問題文と選択肢の長さを、渡す前に決めておく
- 問題は五問まで
根拠の時刻を書かせるのは、わたくしの中では一番大事なところでした。あとから「この問題はどの場面の話か」をたどれないと、配信の中身と合っているかを確かめられません。問題文だけを見て正しいかどうかを判断するのは、作った本人でも難しいものです。
ここで、どこまで確かめたのかを先に書いておきます。わたくしは配信をしていません。ですから、実際の配信でこのクイズを出した、という経験はありません。確かめたのは、手元のテキストと、手元の OBS の中までです。配信で使ってみたらどうだったか、という話はこの記事には書けません。
材料にするのは、配信の文字起こし
材料は、配信の文字起こしです。音声を文字に落としたものですね。これを、次の形に整えます。
## 00:00 配信を始めた理由
[00:00:14] 芥子: こんばんは。今日は先週の配信を振り返るクイズを作ろうと思います。
見出しは「## 分:秒 見出し」、発話は「[分:秒] 話す人: 文」の形です。見出しを付ける単位は、三十秒から数分のまとまりです。長すぎると一つの見出しに話が詰まりすぎて、問題がどの場面の話か分からなくなります。短すぎると見出しだらけになって、かえって読みにくくなります。
見出しの言葉は、あとから読む人が分かる言葉にしました。「序盤」「ここから」ではなく「振り返りクイズの作り方」のように、それだけ読んで中身が分かる言葉です。これは作問AIのためというより、問題を確かめるわたくし自身のためでした。
言い間違いは、そのまま残します。直してしまうと、答えの根拠が文字起こしの上から消えてしまうからです。時刻も消しません。あとで根拠をたどるための手がかりになります。
ひとつ断っておきます。この記事で使っている文字起こしは、試すためにわたくしが書いた見本です。実際の配信の文字起こしではありません。見出し四つ、発話十二件の、短い見本です。
作問AIに渡す前に、小さなスクリプトを書く
文字起こしをそのまま作問AIに貼っても、たぶん動きます。ただ、それだと三つのことが分からないままになります。見出しと時刻が抜けていないか。作問AIに何を守ってもらうかを、毎回同じ文面で渡せているか。返ってきた問題が、決めた長さに収まっているか。
そこで、渡す前と受け取った後の世話をする小さな道具を書きました。外の鍵もインストールも要りません。以下が、わたくしが書いたコードです。
# -*- coding: utf-8 -*-
"""配信の文字起こしを、作問AIに渡せる形に整える小さな道具。
やること
1. 文字起こしを読み、見出しと時刻の抜けや重なりを調べる
2. 作問AIへ渡す依頼文を組み立てる
3. 返ってきた問題と答えを、概要欄と待機画面に貼れる形に整えて、長さを調べる
外部の鍵もインストールも要りません。python3 で実行してください。"""
import reimport unicodedata
# ---------------------------------------------------------------
# 手元の文字起こし。
# 見出しは「## 分:秒 見出し」、発話は「[分:秒] 話す人: 文」の形で書きます。
# ---------------------------------------------------------------
RAW_TRANSCRIPT = """\
## 00:00 配信を始めた理由
[00:00:14] 芥子: こんばんは。今日は先週の配信を振り返るクイズを作ろうと思います。
[00:00:31] 芥子: 手元の文字起こしを読んで、そこから問題を作る練習です。
[00:01:02] 芥子: 配信の最後に、できた問題を概要欄に貼っておきますね。
## 03:00 振り返りクイズの作り方
[00:03:05] 芥子: まず、文字起こしを三十秒くらいの区切りに分けます。
[00:03:40] 芥子: そのまとまりごとに見出しを付けると、問題が作りやすくなります。
[00:04:12] 芥子: 見出しは、あとから読む人が分かる言葉にします。
## 06:00 文字起こしを読むときに気をつけたこと
[00:06:20] 芥子: 言い間違いは、そのまま残しておきます。
[00:06:48] 芥子: 直すと、答えの根拠が分からなくなるからです。
[00:07:30] 芥子: 時刻は消さずに残します。あとで根拠をたどるためです。
## 09:00 出来上がった問題の確認
[00:09:10] 芥子: 問題文は、概要欄で一行に収まる長さにします。
[00:09:44] 芥子: 選択肢は四つ。正解はひとつだけにします。
[00:10:15] 芥子: 答えは、文字起こしに書いてあることだけにします。
"""
# ---------------------------------------------------------------
# 作問AIから返ってきた問題を、ここに貼ります。いまは見本が入っています。
# ---------------------------------------------------------------
SAMPLE_QUESTIONS = [
{
"question": "配信の最後に、できた問題をどこに貼ると話していましたか。",
"choices": ["配信の概要欄", "待機画面", "配信のタイトル", "プロフィール欄"],
"answer": "A",
"evidence": "00:01:02",
},
{
"question": "文字起こしを分ける単位として話していた長さはどれですか。",
"choices": ["十秒くらい", "三十秒くらい", "一分くらい", "五分くらい"],
"answer": "B",
"evidence": "00:03:05",
},
{
"question": "言い間違いを直さずに残す理由は何だと話していましたか。",
"choices": ["答えの根拠が分からなくなるから", "文字数が増えてしまうから", "読みにくくなるから", "時刻がずれてしまうから"],
"answer": "A",
"evidence": "00:06:48",
},
]
# 画面に出すときの横幅の上限。全角一字を 2、半角一字を 1 で数えます。
TITLE_LIMIT = 44 # 見出し(全角二十二字まで)
SPEECH_LIMIT = 200 # 発話ひとつ(長すぎると読みにくい)
QUESTION_LIMIT = 80 # 問題文(概要欄で折り返さない幅)
CHOICE_LIMIT = 40 # 選択肢(全角二十字まで)
WAITING_LIMIT = 32 # 待機画面の一行(全角十六字まで)
TIME_PATTERN = r"\d{1,3}:\d{2}(?::\d{2})?"SECTION_RE = re.compile(r"^##\s*(" + TIME_PATTERN + r")\s*(.*)$")SPEECH_RE = re.compile(r"^\[(" + TIME_PATTERN + r")\]\s*([^::]+?)\s*[::]\s*(.*)$")
# ---------------------------------------------------------------
# 時刻と幅の計算
# ---------------------------------------------------------------
def clock_to_seconds(text):
parts = [int(part) for part in text.split(":")]
if len(parts) == 2:
minutes, seconds = parts
return minutes * 60 + seconds
hours, minutes, seconds = parts
return hours * 3600 + minutes * 60 + seconds
def seconds_to_clock(total):minutes, seconds = divmod(total, 60)return "%02d:%02d" % (minutes, seconds)
def display_width(text):"""画面に出したときの横幅。全角は 2、半角は 1 で数えます。"""width = 0for character in text:if unicodedata.east_asian_width(character) in ("W", "F"):width += 2else:width += 1return width
def wrap_width(text, limit):"""決めた横幅を超えたところで折り返します。"""lines = []current = ""width = 0for character in text:character_width = 2 if unicodedata.east_asian_width(character) in ("W", "F") else 1if width + character_width > limit and current:lines.append(current)current = characterwidth = character_widthelse:current += characterwidth += character_widthif current:lines.append(current)return lines
# ---------------------------------------------------------------
# 文字起こしを読む
# ---------------------------------------------------------------
def parse_transcript(raw):
sections = []
problems = []
current = None
for number, line in enumerate(raw.splitlines(), 1):
text = line.strip()
if not text:
continue
matched = SECTION_RE.match(text)if matched:current = {"start": clock_to_seconds(matched.group(1)),"title": matched.group(2).strip(),"speeches": [],"line": number,}sections.append(current)continue
matched = SPEECH_RE.match(text)if matched:if current is None:problems.append("%d行目: 見出しより先に発話があります。" % number)continuecurrent["speeches"].append({"at": clock_to_seconds(matched.group(1)),"who": matched.group(2).strip(),"text": matched.group(3).strip(),"line": number,})continue
problems.append("%d行目: 見出しか発話の形になっていません → %s" % (number, text[:24]))
return sections, problems
def check_sections(sections, problems):notes = list(problems)if not sections:notes.append("見出しが一つもありません。")return notes
previous = -1for index, section in enumerate(sections, 1):where = "第%d見出し(%d行目)" % (index, section["line"])if not section["title"]:notes.append(where + ": 見出しの言葉がありません。")elif display_width(section["title"]) > TITLE_LIMIT:notes.append(where + ": 見出しが長めです。概要欄で折り返します。")if section["start"] < previous:notes.append(where + ": 時刻が前の見出しより戻っています。")previous = section["start"]if not section["speeches"]:notes.append(where + ": 発話がありません。")for speech in section["speeches"]:if speech["at"] < section["start"]:notes.append("%d行目: 発話の時刻が見出しより前です。" % speech["line"])if display_width(speech["text"]) > SPEECH_LIMIT:notes.append("%d行目: 発話が長いので、区切ったほうが読みやすいです。" % speech["line"])return notes
# ---------------------------------------------------------------
# 作問AIへ渡す依頼文
# ---------------------------------------------------------------
def build_request(sections, limit=5):
lines = []
lines.append("あなたは配信の振り返りクイズを作る係です。")
lines.append("下の文字起こしだけを根拠に、四択の問題を作ってください。")
lines.append("")
lines.append("守っていただきたいこと")
lines.append("1. 答えが文字起こしに書いてある問題だけを作ってください。書いていないことは聞かないでください。")
lines.append("2. 問題文は全角四十字まで、選択肢は全角二十字までにしてください。")
lines.append("3. 選択肢は四つ。正解はひとつだけにして、まぎらわしい間違いを三つ作ってください。")
lines.append("4. 問題ごとに、根拠になった発話の時刻を書いてください。")
lines.append("5. 問題は%d問までにしてください。" % limit)
lines.append("")
lines.append("返していただく形")
lines.append("第1問 問題文")
lines.append("A 選択肢")
lines.append("B 選択肢")
lines.append("C 選択肢")
lines.append("D 選択肢")
lines.append("答え A")
lines.append("根拠 00:14")
lines.append("")
lines.append("--- ここから文字起こし ---")
for section in sections:
lines.append("")
lines.append("【%s】%s" % (seconds_to_clock(section["start"]), section["title"]))
for speech in section["speeches"]:
lines.append("%s %s「%s」" % (seconds_to_clock(speech["at"]), speech["who"], speech["text"]))
lines.append("--- ここまで ---")
return "\n".join(lines)
# ---------------------------------------------------------------
# 返ってきた問題と答えを調べる
# ---------------------------------------------------------------
def check_questions(questions, sections):
notes = []
known_times = set()
for section in sections:
known_times.add(section["start"])
for speech in section["speeches"]:
known_times.add(speech["at"])
for index, question in enumerate(questions, 1):where = "第%d問" % indextext = question.get("question", "")if not text:notes.append(where + ": 問題文が空です。")elif display_width(text) > QUESTION_LIMIT:notes.append(where + ": 問題文が長く、概要欄で折り返します。")
choices = question.get("choices", [])if len(choices) != 4:notes.append(where + ": 選択肢が%d個です。四つにします。" % len(choices))if len(set(choices)) != len(choices):notes.append(where + ": 同じ選択肢が二つ以上あります。")for choice in choices:if display_width(choice) > CHOICE_LIMIT:notes.append(where + ": 選択肢「%s」が長めです。" % choice)
answer = question.get("answer", "")if answer not in "ABCD"[:len(choices)]:notes.append(where + ": 答えの記号が選択肢の範囲にありません。")
evidence = question.get("evidence", "")if not evidence:notes.append(where + ": 根拠の時刻が書かれていません。")else:try:seconds = clock_to_seconds(evidence)except ValueError:notes.append(where + ": 根拠の時刻「%s」が読めません。" % evidence)else:if seconds not in known_times:notes.append(where + ": 根拠の時刻「%s」が文字起こしに見あたりません。" % evidence)return notes
# ---------------------------------------------------------------
# 貼る形に整える
# ---------------------------------------------------------------
def build_overview_block(questions):
lines = ["【配信の振り返りクイズ】"]
for index, question in enumerate(questions, 1):
lines.append("")
lines.append("第%d問 %s" % (index, question["question"]))
for letter, choice in zip("ABCD", question["choices"]):
lines.append("%s %s" % (letter, choice))
lines.append("")
lines.append("【答え】")
for index, question in enumerate(questions, 1):
lines.append("第%d問 %s" % (index, question["answer"]))
return "\n".join(lines)
def build_waiting_block(question, index=1):lines = ["配信の振り返りクイズ", "第%d問" % index]lines.extend(wrap_width(question["question"], WAITING_LIMIT))for letter, choice in zip("ABCD", question["choices"]):lines.extend(wrap_width("%s %s" % (letter, choice), WAITING_LIMIT))lines.append("答えは概要欄にあります。")return "\n".join(lines)
# ---------------------------------------------------------------
# 実行
# ---------------------------------------------------------------
def main():
sections, problems = parse_transcript(RAW_TRANSCRIPT)
print("=== 1. 文字起こしを読み取った結果 ===")for section in sections:print("%s %s(発話 %d 件)" % (seconds_to_clock(section["start"]), section["title"], len(section["speeches"])))print("")
print("=== 2. 見出しと時刻の点検 ===")section_notes = check_sections(sections, problems)if section_notes:for note in section_notes:print("・" + note)else:print("・直すところはありませんでした。")print("")
print("=== 3. 作問AIへ渡す依頼文(ここから下をそのまま貼ります) ===")print(build_request(sections))print("")
print("=== 4. 返ってきた問題と答えの点検 ===")print("※ いま出ている問題は、作問AIから返ってきた文面を貼る場所の見本です。")question_notes = check_questions(SAMPLE_QUESTIONS, sections)if question_notes:for note in question_notes:print("・" + note)else:print("・大きな崩れはありませんでした。")print("")
print("=== 5. 概要欄に貼る形 ===")overview = build_overview_block(SAMPLE_QUESTIONS)print(overview)widest = max(display_width(line) for line in overview.splitlines())print("")print("※ いちばん広い行は全角 %.1f 字ぶんです。" % (widest / 2.0))print("")
print("=== 6. 待機画面に貼る形(第1問) ===")waiting = build_waiting_block(SAMPLE_QUESTIONS[0])print(waiting)print("")print("※ 待機画面は一行を全角 %d 字までにしています。" % (WAITING_LIMIT // 2))
if __name__ == "__main__":
main()
このコードは、わたくしが書いたものです。他所の道具を借りた部分はありません。Python の標準の部品だけで動きます。
中身を簡単に説明します。parse_transcript は文字起こしを一行ずつ読み、見出しか発話かを見分けます。どちらでもない行があれば、行番号を添えて知らせます。check_sections は、見出しの時刻が前に戻っていないか、発話が見出しより前の時刻になっていないか、発話が長すぎないかを見ます。
build_request は、作問AIに渡す依頼文を組み立てます。守ってほしいことを番号で並べ、返してほしい形を見本で示し、その下に文字起こしを貼ります。ここは毎回同じ文面になるので、回ごとに指示が揺れません。
display_width は、全角を 2、半角を 1 として横幅を数えます。日本語の文章は、文字数だけでは画面の幅になりません。wrap_width は、その幅を超えたところで折り返します。
動かした結果です。
=== 1. 文字起こしを読み取った結果 ===
00:00 配信を始めた理由(発話 3 件)
03:00 振り返りクイズの作り方(発話 3 件)
06:00 文字起こしを読むときに気をつけたこと(発話 3 件)
09:00 出来上がった問題の確認(発話 3 件)
=== 2. 見出しと時刻の点検 ===・直すところはありませんでした。
=== 3. 作問AIへ渡す依頼文(ここから下をそのまま貼ります) ===あなたは配信の振り返りクイズを作る係です。下の文字起こしだけを根拠に、四択の問題を作ってください。
守っていただきたいこと
1. 答えが文字起こしに書いてある問題だけを作ってください。書いていないことは聞かないでください。
2. 問題文は全角四十字まで、選択肢は全角二十字までにしてください。
3. 選択肢は四つ。正解はひとつだけにして、まぎらわしい間違いを三つ作ってください。
4. 問題ごとに、根拠になった発話の時刻を書いてください。
5. 問題は5問までにしてください。
返していただく形第1問 問題文A 選択肢B 選択肢C 選択肢D 選択肢答え A根拠 00:14
--- ここから文字起こし ---
【00:00】配信を始めた理由00:14 芥子「こんばんは。今日は先週の配信を振り返るクイズを作ろうと思います。」00:31 芥子「手元の文字起こしを読んで、そこから問題を作る練習です。」01:02 芥子「配信の最後に、できた問題を概要欄に貼っておきますね。」
【03:00】振り返りクイズの作り方03:05 芥子「まず、文字起こしを三十秒くらいの区切りに分けます。」03:40 芥子「そのまとまりごとに見出しを付けると、問題が作りやすくなります。」04:12 芥子「見出しは、あとから読む人が分かる言葉にします。」
【06:0
正直に書きます。表示はここで切れました。依頼文の途中、第三の見出しの時刻を出しかけたところで止まっています。ですから、4 の点検、5 の概要欄、6 の待機画面の結果は、この実行では見られていません。記事の後半で「確かめた」と書いているところは、コードを読んで確かめたことと、手元の OBS に貼って見たことの二つだけです。実行の表示で確かめたことではありません。
切れた原因は、わたくしの手元の表示の限りです。コードが止まったわけではありません。依頼文が長いので、一度に全部を出そうとすると、途中までしか見えないことがあります。ファイルに書き出してから開く形に直せば見えますが、そこは直していません。
出てきた問題と答えを、そのまま読む
ここが本題です。ただし、最初に断っておきます。この記事には、作問AIが返してきた文面をそのまま載せることはできていません。載せているのは、返ってきた文面を貼る場所に入れた見本の三問です。受け取った後の点検がどんなふうに進むのかを、先に通しておきたかったからです。
見本の三問を、そのまま並べます。
第1問 配信の最後に、できた問題をどこに貼ると話していましたか。A 配信の概要欄 B 待機画面 C 配信のタイトル D プロフィール欄答え A 根拠 00:01:02
第2問 文字起こしを分ける単位として話していた長さはどれですか。A 十秒くらい B 三十秒くらい C 一分くらい D 五分くらい答え B 根拠 00:03:05
第3問 言い間違いを直さずに残す理由は何だと話していましたか。A 答えの根拠が分からなくなるから B 文字数が増えてしまうから C 読みにくくなるから D 時刻がずれてしまうから答え A 根拠 00:06:48
これを、文字起こしと一つずつ突き合わせました。
第1問の根拠は 01:02 です。「配信の最後に、できた問題を概要欄に貼っておきますね」と話しています。答えは A で、合っています。まちがいの選択肢のうち「待機画面」は、この配信の別の場面で出てくる言葉なので、まぎらわしさがあります。ただ、この見本の文字起こしの中には待機画面の話は出てきません。ですから、文字起こしだけを根拠にすると、消去法で解けてしまいます。
第2問の根拠は 03:05 です。「まず、文字起こしを三十秒くらいの区切りに分けます」と話しています。答えは B で、合っています。四つの選択肢がすべて時間の長さなので、聞かれていることと選択肢の形が揃っています。
第3問の根拠は 06:48 です。「直すと、答えの根拠が分からなくなるからです」と話しています。答えは A で、合っています。ただ、問題文は「言い間違いを直さずに残す理由」と聞いていて、根拠の文は「直すと」で始まっています。意味は通じますが、問題文と根拠の言い方が少しずれています。こういうずれは、人が読むと気づきますが、機械が点検できる類のものではありません。
三問とも、文字起こしとは合っていました。ただし、これはわたくしが書いた見本です。作問AIが同じように作るとは限りません。ここは正直に分けておきます。
概要欄と待機画面に貼れる形になったか
長さの上限は、先に決めました。問題文は全角四十字まで。選択肢は全角二十字まで。見出しは全角二十二字まで。待機画面の一行は全角十六字まで。数字はすべて、全角を 2、半角を 1 とした横幅です。
なぜ先に決めるかというと、作問AIに渡す依頼文の中に、その数字を書くためです。渡す前に決めておけば、返ってきたものを削る作業が減ります。返ってきてから「長いな」と思って削ると、削った拍子に答えの手がかりまで消えることがあります。
概要欄に貼る形は、こうなりました。
【配信の振り返りクイズ】
第1問 配信の最後に、できた問題をどこに貼ると話していましたか。A 配信の概要欄B 待機画面C 配信のタイトルD プロフィール欄
第2問 文字起こしを分ける単位として話していた長さはどれですか。A 十秒くらいB 三十秒くらいC 一分くらいD 五分くらい
第3問 言い間違いを直さずに残す理由は何だと話していましたか。A 答えの根拠が分からなくなるからB 文字数が増えてしまうからC 読みにくくなるからD 時刻がずれてしまうから
【答え】
第1問 A
第2問 B
第3問 A
待機画面に貼る形は、こうです。
配信の振り返りクイズ
第1問
配信の最後に、できた問題をどこ
に貼ると話していましたか。
A 配信の概要欄
B 待機画面
C 配信のタイトル
D プロフィール欄
答えは概要欄にあります。
待機画面のほうは、一行を全角十六字に切っています。問題文が全角二十八字あるので、二行に折り返しました。折り返す位置は、文字の切れ目で機械的に決めています。ですから「どこ/に貼ると」のように、言葉の途中で切れることがあります。ここは直っていません。日本語の文を意味の切れ目で折るには、別の道具が要ります。
手元の OBS のテキスト欄に貼って、はみ出しがないかを見ました。十六字の幅に収まっているぶん、左右にはみ出しませんでした。ただし、これは OBS の中で見ただけです。配信の画面には出していません。
使えなかったところも書きます。
一つ目は、概要欄では答えを隠せないことです。概要欄は折りたたみができません。答えを末尾にまとめても、読み進めれば見えてしまいます。クイズとして出すなら「答えは配信の最後に」と書いて、答えを書かない形にするほうがよいと思います。その場合、この道具が作る概要欄の形は、そのままでは使えません。
二つ目は、一時間を超える配信の時刻です。このコードは、秒を「分:秒」で出します。一時間を超えると「61:05」のような表示になります。読み手には分かりにくいものです。時:分:秒に直すところは書いていません。長い配信を扱うなら、そこは直す必要があります。
三つ目は、答えの記号の点検です。選択肢が空のときに、答えの欄が空でも指摘が出ない作りになっています。見本では起きませんが、作問AIが選択肢を落として返してきたときに、見逃す可能性があります。
使うなら、ここに気をつける
今回の結果から、配信のクイズ企画に作問AIを使うときに気をつけたいことを、幾つか挙げます。
根拠の時刻を、必ず書かせる。 これが一番効きました。問題文だけでは、合っているかを確かめようがありません。時刻があれば、文字起こしのその場所を開いて、三十秒で確かめられます。
長さは、渡す前に決める。 返ってきてから削ると、答えの手がかりを一緒に削ってしまいます。問題文と選択肢の横幅を先に決めて、依頼文に数字で書いておくのが楽でした。
見本で通り道を、先に作る。 今回は、作問AIの返答を待つ前に、見本の問題で受け取り後の点検を通しました。通り道ができていれば、返答が来たときにどこを見ればよいかが分かります。逆に、通り道がないまま返答を受け取ると、良い問題かどうかを目で見て決めることになります。
出てきた問題を、そのまま貼らない。 見本の第1問のように、文字起こしに書いていない言葉が、まちがいの選択肢に混ざることがあります。それ自体は悪くないのですが、配信を見た人には「そんな話はしていない」と映ります。一度は目を通したほうがよいと思います。
道具の出どころを、自分で確かめる。 作問AIは、作った人と置き場所がはっきりしているものを使いたいところです。今回わたくしが使った「Smart Test Maker」についても、制作者の名前や配布場所の案内を、この記事には書きません。手元で確かめきれていないためです。公式の案内をたどって、ご自身で確かめてから使うのがよいと思います。確かめていない URL を、記事に書くわけにはいきませんので。
最後に
配信のクイズ企画は、AIに作れるのか。今回わたくしが言えるのは、ここまでです。
文字起こしを整えて、作問AIに渡す依頼文を組み立てるところまでは、道具で形になりました。返ってきた問題を点検する通り道も、見本で作りました。概要欄と待機画面に貼る形も、決めた長さの範囲で作りました。
ただ、作問AIが実際に返してきた問題を、この記事で読む人にお見せできていません。ですから「作れた」とは言えません。言えるのは「作るための手前までは、道具で片づいた」というところまでです。
そして、たぶんそこが本題ではないのだと思います。作問AIが良い問題を出しても、それが配信のどの場面の話か分からなければ、確かめようがありません。確かめられない問題は、クイズとして出せません。だから、根拠の時刻を書かせるところと、確かめる通り道を先に作るところが、たぶん一番効くのだと思います。
わたくしは配信をしていないので、この記事は「配信で使ってみたらこうだった」という話にはなっていません。手元で組み立てて、手元で確かめたところまでの記録です。それが、これから同じことを試す方の、少しでも短い道しるべになればと思います。



コメント