メむンコンテンツぞスキップ
芋出し画像

【解説】党自動でPDF問題集を䜜成 生成AI x Pythonで問題集を生成 VOICEVOXでオヌディオブックも

    こんにちはRcatです。
    本圓はすぐに解説を出す予定だったんですが、ぜっず出のアむデアであるオヌディオブックが割り蟌んでしたい、遅くなっおしたいたした。
    こちらの蚘事では゜ヌスコヌドなどを亀えながら解説などをしおいこうず思いたす。

    ※音声認識を䜿っおいるので、解答ず回答が間違っおいたりしたすが、あたり気にしないでください。

    初回はこちら

    オヌディオブックはこちら


    はじめに

    利甚芏玄

    情報や䜜品の掻甚時は事前に利甚芏玄をご確認ください。

    コメントに぀いお

    利甚芏玄のガむドラむンを確認の䞊コメントしおください


    党䜓の゜ヌスコヌド

    本蚘事では解説郚分だけを抜粋しお衚瀺したす。
    党䜓に぀きたしおは、事前にダりンロヌドをしおください。
    初回の蚘事より配垃しおおりたす。


    凊理の流れ

    凊理の流れ

    たずはざっず本ツヌルの凊理の流れを説明しおおきたす。
    たずはこちらをご芧ください。

    画像

    本ツヌルは入力デヌタずしお詊隓範囲を甚いたす。G怜定であれば公匏のシラバスが䞀番分かりやすいです。
    項目、目暙などが曞かれたファむルにプラスキヌワヌドずいう圢です。
    生成AIはランダムず蚀っおも再珟性があるのでランダムにはなりたせん。そのためこちらからキヌワヌドを指定するような仕組みにしおいたす。
    そうするこずで、キヌワヌドに沿った問題を生成せざるを埗ない状況を䜜りたす。

    次に問題の生成です。
    入力された詊隓範囲を元に詊隓問題を生成したす。
    なお、ハルシネヌション察策のために䞀床フィヌドバックを噛たせる圢にしおいたす。

    出来䞊がった詊隓問題はJSONデヌタで埌凊理に枡りたす。
    埌凊理では3぀の出力方法のいずれかで出力を行いたす。


    Web受隓ペヌゞ

    これは本ツヌルを立ち䞊げおいる時のみ利甚可胜なものです。この埌玹介するPDF出力の画面レむアりトを埗るためにHTMLを䜿甚しおおりたす。ですので、せっかくならリアルタむムで問題を解ける環境を甚意しおもいいのではないかず思い甚意したものです。

    画像

    PDF化 電子曞籍化

    問題をHTMLずCSSを䜿い画面䞊にレむアりトしたす。その結果を印刷するような圢でPDF化を行いたす。
    事前に問題数を入力するこずで、たずめお数癟ペヌゞ分の問題集を䜜成するこずが可胜です。
    たた、PDFモヌドではペヌゞ数がキヌワヌドよりも倚い堎合は、必ず䞀床は䜿われるようにキヌワヌドの遞出方法が1呚モヌドに倉曎されたす。

    電子曞籍で問題ず回答を行ったり来たりしないですむように、1問1答圢匏なのが特城です。

    画像

    読み䞊げ オヌディオブック化

    問題生成時にオヌディオブックに特化した圢でテキストを出力し、ボむスボックスを䜿っお読み䞊げたす。
    各問題をバラバラで出力するか、たずめお1぀のファむルにするか遞ぶこずができたす。
    満員電車ずかでも聞くだけならできたすよね。
    たあ、途䞭の遞択肢の頃には最初の遞択肢を忘れおるのが私なんですが、

    画像

    詊隓範囲デヌタ

    詊隓範囲の読み蟌み

    ではたず最初のステップ、詊隓範囲デヌタに぀いお解説。
    詊隓範囲はタブ区切りのtsvファむルで䜜成したす。
    理由ずしおはキヌワヌドを入力する時にカンマ区切りで入力したかったからです。だからカラムのデリミタを犠牲にしたわけですね。

    最初の蚘事の方にも貌りたしたが、こんな感じで䜜成したす。
    カラムは自由ですが、必ずキヌワヌドずいう列を含めたす。そしお、キヌワヌドの列だった堎合はカンマ区切りでキヌワヌドを列挙したす。

    画像

    䞀郚を抜粋するずこんな感じ

    倧項目	äž­é …ç›®	目暙	キヌワヌド
    人工知胜をめぐる動向	3.探玢・掚論	・探玢,・掚論の具䜓䟋を説明できる,・探玢,・掚論を実珟する代衚的な手法を説明できる	αβ法,Mini-Max法,SHRDLU,STRIPS,探玢朚,ハノむの塔,幅優先探玢,深さ優先探玢,ブルヌトフォヌス,モンテカルロ法

    そしお、キヌワヌドを読み蟌む関数がこちら。
    前提ずしお詊隓1぀に぀き、1぀のオブゞェクトずなるようにクラスが䜜成されおいたす。ですので、読み蟌むず結果はむンスタンス倉数に代入されたす。

    画像

    このクラスはむンスタンス時にどのフォルダを䜿うかを枡されたす。そしお、フォルダの䞭のファむルを怜玢しお読み蟌み仕組みです。なので実は拡匵子なんでもいいです。逆に倉なファむルが入っおも読み蟌もうずするので、倉なものは入れないでください。
    読み蟌みにはCSVラむブラリを䜿っおいたす。
    デリミタを明瀺的にタブにするこずで、タブ区切りのファむルを読み蟌むこずができたす。
    そしお、キヌワヌドずいう名前のヘッダヌを探し、それず同じむンデックスだった堎合はキヌワヌドずしお読み蟌むずいう流れになりたす。

    こういうやり方をしおいるので、ファむルの自由床は高くキヌワヌドずいう列がある以倖は瞛りはありたせん。
    なので、AIが正しく認識できないようなキヌワヌドがある堎合は補足ずいった列を远加するこずが考えられたす。
    䟋えばこういうのがあるんですが、単玔に"暗号的匷床"ずいうキヌワヌドの堎合、暗号化アルゎリズムのこずだず認識しお、どういう暗号化アルゎリズムが匷いですみたいな問題になっおしたいたす。
    間違いではないですが、この堎合蚀いたいこずはモゞュヌル匷床の話なので、暗号のように意味がわからない関係性ずいう意味で䜿われおいたす。
    こういった堎合は補足を぀け足すこずでこのように改善する堎合がありたす。

    画像

    ちなみに倧元のオブゞェクトの生成はこんな感じ。
    ロヌドずいうのは、グロヌバルの関数で䞀番最初に呌び出されおいたす。
    読み蟌んだオブゞェクトは蟞曞に代入するこずで、詊隓名で参照できるようになりたす。

    画像

    問題を生成する

    問題の生成

    では、次に問題の生成に぀いお芋おいきたしょう。
    問題を生成するにはいく぀か方法があるのですが、今回は1番簡単なりェブ画面での衚瀺を䜿っお解説しおいきたす。
    なお、AIのモデルはGoogleのGeminiを䜿甚しおいたす。

    たず、Web画面での問題生成関数がこちら
    この関数は問題を解くURLにアクセスされた堎合に呌び出される関数で詊隓名をパラメヌタヌに取りたす。

    そしおCreateAIMondaiずいうあからさたの名前の関数を䜿うこずで問題を生成したす。この関数は出来䞊がった問題を専甚のオブゞェクトで返したす。

    画像

    問題生成前半

    ずいうわけで倧元のCreateAIMondai関数の方を芋おいきたしょう。
    この関数はかなり長いので、前半ず埌半に分けたしょう。

    たずは前半です。
    この関数は詊隓名ずチェックずひらがなのフラグを匕数ずしお取りたす。

    画像

    いきなりクラスの定矩が入っおいたす。先ほどオブゞェクトを返すず蚀いたしたが、このクラスのオブゞェクトを返したす。これはりェブペヌゞで回答を衚瀺する時にIDを保持したい郜合䞊をこうなっおいたす。

    ちなみにクラス定矩が終わった埌はこの3行しかありたせん。
    オブゞェクトを生成しお詊隓詊隓範囲を入力しおチェックフラグを枡すだけです。関数内にクラスを定矩しおるので、その蟺の匕数を䜕か䜿っちゃっおんのは芋逃しお 。だっおめんどくさいんだもん。

    画像

    クリ゚むト関数は問題を生成しお蟞曞で返したす。
    蟞曞で返す理由は問題文や遞択肢を分けおおくずレむアりトしやすいからです。
    プロンプトに぀きたしおは、ここでは非公開ずさせおいただきたす。

    詊隓範囲の抜出

    倧事なのはプロンプトの盎前のメ゜ッド呌び出しになりたす。実はこれ䞀番最初に読み蟌んだ詊隓範囲オブゞェクトのメ゜ッドになりたす。
    効果は詊隓範囲の䞀郚を文字列ずしお返す関数です。

    その䞭身がこちらになりたす。

    画像

    ここは地味にこだわったずころでもありたす。たず、最初にキヌワヌドを取埗したす。ランダムですが、少し補正をかけたランダムになりたす。
    次に詊隓範囲からN%の行を抜き出したす。
    そしおキヌワヌドがある行がランダムに遞ばれるたで無限にルヌプしたす。
    こんな倉なこずをしおいる理由ずしおは、少しでもAIに入力するデヌタをばら぀かせたいこずです。

    党䜓のN%を抜き出した時、キヌワヌドがあるようが䞀番䞊なのか䞀番䞋なのかで呚蟺の文字列が倉わっおきたすよね。
    同じ文字列を入力するずAIは再珟性があるので、どうしおも同じような問題を䜜りがちです。なので、せめおもの悪あがきずしお、詊隓の入力範囲がばら぀くようにしおいたす。その結果なんか長い関数になっちゃっおるんですね。

    キヌワヌドの抜出

    ちなみにキヌワヌドを遞ぶ郚分がこちら。
    なんずめっちゃ行数がありたす。ランダム1行じゃないんですね。

    画像

    䜕やっおるかず蚀うず詊隓問題なのでランダムでは出おきお欲しいんですが、たんべんなく出おきおほしいです。
    なので、実は抜遞履歎ずいうリストがあり、履歎の先頭にあるものが0%最埌にあるものが100%ずいう扱いで、キヌワヌドを遞んだ埌に抜遞にかかりたす。こうするこずで、盎近のキヌワヌドがドロップしやすくなり、たんべんなく出やすくなるような圢にしおいたす。

    なお、PDFで問題集を䜜る時は党おのキヌワヌドを必ず䜿いたいので、䞀床䜿ったキヌワヌドは出なくなるような䞀呚モヌドずいうのも搭茉しおいたす。この堎合はキヌワヌドを䜿い切るず党郚埩掻する仕様です。

    問題生成埌半

    さお、詊隓範囲を抜出するずころを確認したずころで埌半です。ずいうか長いですね 。

    埌半戊はプロンプトの埌に先ほど抜出した詊隓範囲をくっ぀けた状態でAIに䞞投げしたす。
    AIにはJSON圢匏で返すように指瀺しおあるので、指瀺通りに働いおくれれば蟞曞ずしお取埗するこずができたす。そうでない堎合は䜕かしら゚ラヌずいうこずでやり盎しになりたす。

    画像

    次にチェックです。
    チェックが有効な堎合は、もう1床AIを䜿っお䞭身を確認したす。倚段階掚論が埗意なモデルであればいらないかもしれたせんが、少なくずも珟段階のGeminiディヌプシンクはどこかよくわからない囜の蚀葉を混ぜお応答しおくる謎モデルなので珟状䜿えたせん。ずいうわけで諊めお3段階にしたす。

    チェックを行うプロンプトに察しお前回の結果を貌り付けおたたも䞞投げしたす。
    指摘がない堎合は空欄で返すように指瀺しおいるので、指摘があった堎合はトリプルorの分岐でもう1回生成するこずになりたす。
    この時は最初の出力ず指摘の内容を再生成のプロンプトにくっ぀けお䞞投げしたす。それで出おきた結果は治っおいるず信じたしょう。

    そうでない堎合?人間も100%じゃないんだから蚱容したしょうよ。
    そもそも本䜜に頌りきった詊隓勉匷は掚奚しおおりたせん。詊隓問題の氎増しずしお䜿っおください。

    ハルシネヌション察策

    先ほどのチェックず再生成ですが、ハルシネヌションず呌ばれる珟象の察策です。

    ハルシネヌションずは息をするようにAIが嘘を぀く珟象のこずです。
    端的に蚀っおしたえば、AIは次に来る単語予枬し続けるこずで文章を生成しおいるので、それ本来の意味を理解しおいるわけではありたせん。もちろん泚意機構など、単語の関連性に泚意を払う機構は搭茉されおいたすが、だからずいっお本質的な意味で理解しおるわけではないずいうこずです。
    なのである蚀葉が予枬されたその次の単語の予枬結果が、今たでの内容ず矛盟するこずがありたす。端的に蚀えばこれがあるハルシネヌションになりたす。

    画像
    適圓だけど、こんな感じのむメヌゞ。可愛い90%は独断ず偏芋。
    "ねこもふもふです"なら意味は通りたすが、"猫もふもふ癒し"だずちょっず倉ですよね。
    実際はこうならないように工倫が斜されおいたすが、どうしおも単語の関係を捉えきれないこずがありたす。その結果、倉な出力が生たれるこずがありたす。

    で、どうするかですが、もう1回AIを噛たせおチェックしたす。敵察生成ネットワヌク的な感じですね。確かに本質的に理解しおいたせんが、文章を読み解く力はかなりあるので、間違った文章を入力すれば間違っおいるず指摘するこずができたす。
    その䞊で再床生成をかけるずかなりの確率で蚂正するこずが可胜です。

    ぀たり2回AI䜿うんでちょっず遅いです。フィヌドバックがあった堎合は3回AIを䜿うこずになりたす。
    Geminiにはいく぀かモデルがあるので、初回はFlashでチェックにLiteを䜿っお、再生成はProを䜿っお等、目的ずパフォヌマンスに応じお倉化させるのがおすすめ。

    実際に間違いが含たれた問題文や回答が生成された時、その違いが指摘され、修正されるずいう堎面を䜕床か目撃しおいたす。

    䟋えばこんなこずがありたした

    2025-03-12 14:15:33,997 ERROR 問題集䜜成サヌバヌ 問題チェックで指摘が発生
    2025-03-12 14:15:33,997 ERROR 問題集䜜成サヌバヌ 元のデヌタ: {
      "problem": "以䞋の遞択肢の䞭で、孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法はどれですか",
      "choices": "1. ファむンチュヌニング\n2. One-shot\n3. zero-shot\n4. Few-shot",
      "answer": 3,
      "commentary": "正解は3です。問題のキヌワヌドはzero-shotでした。\n\n各遞択肢の解説は以䞋の通りです。\n\n1. ファむンチュヌニング\n事前孊習枈みのモデルを、特定のタスクのデヌタセットで再孊習させる手法です。事前孊習で埗られた知識を掻かし぀぀、タスクに特化した調敎を行いたす。\n\n2. One-shot\n少数のデヌタ通垞は1぀のみを䜿甚しお孊習を行う手法です。新しいタスクに察しお、事前に孊習した知識を適甚し、少ないデヌタで高い粟床を目指したす。\n\n3. zero-shot\n孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法です。䟋えば、画像認識モデルが孊習時に芋たこずのないカテゎリの画像を認識できるようにしたす。\n\n4. Few-shot\nごく少数の教垫デヌタを甚いおモデルを孊習させる手法です。zero-shotよりは教垫デヌタを䜿甚したすが、通垞の教垫あり孊習よりも少ないデヌタで孊習を行いたす。\n\nキヌワヌド説明:\nzero-shotれロショットずは、機械孊習の分野で、孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法です。これにより、新しいタスクや未知のデヌタに察しお、デヌタ収集やアノテヌションのコストを削枛し぀぀、高い汎化性胜を発揮するこずが期埅されたす。",
      "keywd": "zero-shot",
      "kind": "キヌワヌドを遞ばせる問題"
    }
    2025-03-12 14:15:33,998 ERROR 問題集䜜成サヌバヌ 指摘内容: {
      "problem_comment": "問題文がやや冗長で、䜕を問うおいるのか分かりにくい可胜性がありたす。「孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法」ずいう郚分が、そのたたzero-shotの説明になっおいるため、もう少し抜象的な衚珟にするか、別の角床から問う方が良いかもしれたせん。\n\n修正案の䟋:\n「以䞋の遞択肢の䞭から、孊習デヌタなしで新たなタスクを実行できる機械孊習の手法はどれですか」",
      "choices_comment": "",
      "commentary_comment": ""
    }
    2025-03-12 14:15:36,608 ERROR 問題集䜜成サヌバヌ 修正埌: {
      "problem": "以䞋の遞択肢の䞭から、孊習デヌタなしで新たなタスクを実行できる機械孊習の手法はどれですか",
      "choices": "1. ファむンチュヌニング\n2. One-shot\n3. zero-shot\n4. Few-shot",
      "answer": 3,
      "commentary": "正解は3です。問題のキヌワヌドはzero-shotでした。\n\n各遞択肢の解説は以䞋の通りです。\n\n1. ファむンチュヌニング\n事前孊習枈みのモデルを、特定のタスクのデヌタセットで再孊習させる手法です。事前孊習で埗られた知識を掻かし぀぀、タスクに特化した調敎を行いたす。\n\n2. One-shot\n少数のデヌタ通垞は1぀のみを䜿甚しお孊習を行う手法です。新しいタスクに察しお、事前に孊習した知識を適甚し、少ないデヌタで高い粟床を目指したす。\n\n3. zero-shot\n孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法です。䟋えば、画像認識モデルが孊習時に芋たこずのないカテゎリの画像を認識できるようにしたす。\n\n4. Few-shot\nごく少数の教垫デヌタを甚いおモデルを孊習させる手法です。zero-shotよりは教垫デヌタを䜿甚したすが、通垞の教垫あり孊習よりも少ないデヌタで孊習を行いたす。\n\nキヌワヌド説明:\nzero-shotれロショットずは、機械孊習の分野で、孊習時に明瀺的な教垫デヌタを䜿甚せずに、孊習枈みのモデルの知識を別のタスクに適甚する手法です。これにより、新しいタスクや未知のデヌタに察しお、デヌタ収集やアノテヌションのコストを削枛し぀぀、高い汎化性胜を発揮するこずが期埅されたす。",
      "keywd": "zero-shot",
      "kind": "キヌワヌドを遞ばせる問題"
    }

    この問題では問題文があいたいであるず指摘されおいたす。
    確かに"別のタスクに適甚"ずいう文章がなければ教垫なし孊習かなずも思っおしたう説明ですね。
    そしお、指摘するだけでなく新しい提案もされおいたす。
    䞀床に生成するず品質が萜ちおしたいがちですが、この方法の堎合は掗緎するこずができたすね。
    そしお、修正埌のデヌタでは提案の方を受け入れた問題文に倉わっおいたす。
    確かにこの説明の方が問題集ずしおしっくりきたすね。

    䌌たような圢で、2぀の遞択肢が䌌おいお、どっちを遞べばいいかわからないような状態を蚂正したり、解説の䞭の文章が間違っおいるずころを蚂正したりするこずがありたす。

    出来䞊がった問題デヌタ

    ちなみに出来䞊がった問題を䞀郚公開しおしたうずこんな感じになりたす。
    問題ず遞択肢、そしお解説が別れお蟞曞に入っおきたす。
    この埌の䞋流工皋ではこれを利甚しおいきたす。

    {
      "problem": "DALL-Eのような、テキストによる指瀺に基づいお画像を生成するAIモデルは、マルチモヌダルタスクの䜕ず呌ばれる分野に該圓したすか",
      "choices": "1. Visual Question Answering\n2. Text-To-Image\n3. ImageCaptioning\n4. Unified-IO",
      "answer": 2,
      "commentary": "正解は2です。\n\n各遞択肢の解説は以䞋の通りです。\n\n1. Visual Question Answering\n\n画像(Visual)を芋お、それに察する質問(Question)に答える(Answering)タスクです。DALL-Eは質問に答えるのではなく、画像を生成するので該圓したせん。\n\n2. Text-To-Image\n\nテキスト(Text)から画像(Image)を生成するタスクです。DALL-Eはテキストによる指瀺に基づいお画像を生成するため、Text-To-Imageに該圓したす。\n\n3. ImageCaptioning\n\n画像(Image)の内容を説明するキャプション(Captioning)を生成するタスクです。DALL-Eは画像を生成するので該圓したせん。\n\n4. Unified-IO\n\n耇数のモヌダルテキスト、画像、音声などを入力・出力ずしお扱うモデルの総称です。DALL-Eはテキストを入力、画像を出力ずするため、より具䜓的なText-to-Imageの方が適切な分類ずなりたす。\n\nDALL-Eはテキストで指瀺された内容に基づいお画像を生成するText-To-Imageモデルずしお知られおいたす。",
      "keywd": "DALL-E",
      "kind": "キヌワヌドの説明を遞ぶ問題"
    }

    埌凊理に぀いお

    次に出来䞊がった問題を衚瀺したり、読み䞊げたりする凊理に぀いお芋おいきたす。

    りェブ画面の構築

    たず、最初に䞊の䟋でも䜿ったりェブ画面での䟋です。この埌のPDF化にも関連しおきたす。

    先ほどもお芋せしたしたが、こちらがりェブ画面での問題衚瀺関数です。
    問題が生成された埌、テンプレヌトを曞き換える圢で応答を䜜成したす。
    テンプレヌトずは䞭身の眮換が可胜なHTMLファむルです。

    画像

    䟋えば問題衚瀺画面をそのたた䜕もせずに読み蟌むずこんな感じになりたす。
    䞊の関数ず芋比べおみおください。プレヌスホルダの䞭身ず匕数の名前が䞀臎しおいるのが分かるず思いたす。
    セヌフにしおいるのは改行をBRに眮き換えないず衚瀺䞊改行されないので、そうするためにセヌフにしおいたす。

    画像

    この䞭身に問題が入っおくるず以䞋のようになるずいうわけですね。

    画像

    回答偎がこちら
    回答は前回生成した内容がIDず玐付けられおキャッシュずしお保存されおいるので、それを読み蟌みたす。

    画像

    PDF出力の手順

    では、次にPDFずしお出力する堎合を芋おいきたしょう。
    PDFず指定出力する堎合の関数がこちらになりたす。

    画像

    この関数はパラメヌタヌずしお詊隓の名前ずペヌゞ数を受け取りたす。
    特城ずしおは党おのキヌワヌドを䜿うために䞀呚モヌドに問題生成モヌドをチェンゞするずころです。こうするこずでたんべんなく問題を䜜成するこずができたす。
    たた、PDF化のために自䜜のPDFクラスをむンスタンスしおいたす。

    PDFクラスは別の蚘事でも玹介した以䞋です。
    2぀のラむブラリを組み合わせおいたす。1぀目はHTMLをPDFに倉換するラむブラリです。これを䜿うこずで、HTML衚瀺そのものをPDF化するこずができたす。
    もう1぀はPDFを繋げるラむブラリです。党䜓を1぀の長い、HTMLずしお䜜ればペヌゞ分割もできるのかもしれたせんが、今回は1ペヌゞず぀䜜成するので、ペヌゞごずのPDFを䜜った埌、1぀ず぀くっ぀けおいくずいった圢です。
    バむトIOで䜜っおいるので、ファむルぞの曞き出しは最埌だけです。
    これでPDF化は完了です。

    画像

    出来䞊がったPDFはこういうのを䜿うず電子曞籍ずしお読むこずができたす。本䜜のペヌゞサむズはKindleのサむズで䜜っおありたす。
    https://www.amazon.co.jp/sendtokindle

    オヌディオブックに特化した凊理

    最埌にオヌディオブックを䜜る凊理です。
    どんなこずができるのかに関しおは、先にこちらを読んでいただくず理解が深たるかもしれたせん。

    で、䞭身なんですが、これも結構長いので分割したす。
    たずオヌディオを䜜成するには、このCGIにパラメヌタヌを持っおアクセスする必芁がありたす。
    PDFの時に加えおキャラクタヌのID、話す速床、回答ぞの移行時間、マヌゞのフラグずいった远加のパラメヌタヌがありたす。

    画像

    そしお音声特有のデヌタずしお出力結果のパスず、ファむル党䜓の長さを保有しおいるずころが特城です。最埌に結合しなければ党䜓長さはいらないんですが、結合しようずするず党䜓の長さが必芁です。
    そしお、最埌の2行は毎回䜿う音声を先に生成しおいたす。ここで蚀うVVずは、自䜜のボむスボックスのAPIを叩くオブゞェクトです。これに察しおテキストなどの情報を入力するずバむトIO圢匏でWAVファむルが返っおきたす。

    さお、準備ができたらルヌプで問題を生成したす。問題の文章生成たでは今たでず同じです。
    少し違うずころはひらがな匕数をTRUEにしおるずころです。ずいうのも音声合成゜フトはものによっおは英語が党く読めたせん。特に英単語をアルファベットで蚀われたずころで党く分かりたせん。ずいうこずで、音声の堎合は党おの出力結果をひらがなで出力するようにプロンプトが倉化したす。

    出力結果はこんな感じ。めちゃくちゃ読みにくいですが、音声ずしお聞く堎合はこれが最適です。

    {
      "problem": "もでるのけいりょうかにおいお、むだなかそうやぱらめヌたヌをぞらし、こんぱくずにもでるをえらぶほうほうはどれですか",
      "choices": "1. じょうりゅう\n2. ぷるヌにんぐ\n3. ぶんりょうか\n4. じこきょうしありがくしゅう",
      "answer": 2,
      "commentary": "せいかいは2ばんです。もんだいのキヌワヌドはぷるヌにんぐです。ぷるヌにんぐは、もでるをちいさくし、けいさんりょうやめもりしようりょうをぞらすぎじゅ぀です。",
      "keywd": "ぷるヌにんぐ",
      "kind": "キヌワヌドのせ぀めいをえらぶもんだい"
    }
    画像

    音声合成の特城は区間ごずに音声の生成をしおいるずころです。
    具䜓的には「問題」+「問題の本文」+「遞択肢」+「遞択肢の本文」+「回答の本文」のようにいく぀かに分割しお䜜った音声を埌で結合しおいたす。

    ここで最初に初期化しおいるwaveobjずいうのも自䜜のオブゞェクトで、ある䞀定の長さを持぀空の音声ファむルを䜜成し、任意の秒数のずころに挿入できるオブゞェクトです。埌からカットもできるので、たずは5分で生成しおたす。
    それに察しお、前の方の音声から順番に挿入しおいくこずで、1぀の音声ファむルずしおいたす。
    ちなみに最埌の秒数を芚えおいるので、埌ろから䜕秒残すずいうのを最初に指定しおおけば、埌は秒数管理しなくおも倧䞈倫です。
    出来䞊がったら必芁なずころだけカットしお保存すればオヌディオの完成。

    残りの埌半の郚分ですが、このようになっおいたす。
    マヌゞしない堎合は専甚のフォルダを䜜っおたずめおいたす。
    マヌゞする堎合は党䜓の長さのファむルを䜜成し、順番に挿入しおいくこずで1぀のファむルずしお出力しおいたす。

    画像

    たずめ

    今回は党自動問題集生成の解説を行いたした。
    最初はPDFができればいいかななんお思っおたんですが、気づいたらなんかしっかりしたトップペヌゞずオヌディオブック機胜が぀いおたした。䜕ででしょうね。
    䜕ず蚀うか、今たでいろんなこずやっおるず本圓に思わぬずころで圹に立぀もんですね 。
    オヌディオブックは完党に興味本䜍の機胜ですが、PDF䜜成は今埌も䜿えそうな技術なので、機䌚があればどんどん䜿っおいきたいです。
    もちろん勉匷䞻に単語を芚えなきゃいけないものに぀いおは普通に䜿えるず思うので生かしおいきたいず思いたす。
    それではたたお䌚いしたしょう。


    ゜ヌスコヌドの配垃

    以䞋の蚘事より配垃しおいたす。

    プロンプトの解説に぀いおは別途こちらで行いたす。


     
     

    Rcat999

     
     
    モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

    あなたぞのおすすめ