5
5

実況AI。ユーザーが選択したスポーツの架空の実況テキストを生成し、それをラジオ感覚で再生することができます。

Last updated at Posted at 2024-07-19

1dc98a71-983c-450d-aeba-05a4cf5943f1.png

ショートストーリー: 「実況AIの一日」

青空の広がる夏の日、東京のとある一室で、開発者の佐藤は新しいAIプロジェクトに取り組んでいた。このプロジェクトの名は「実況AI」。様々なスポーツの試合をリアルに実況し、その内容を音声で届けるという革新的な技術だった。

「よし、これで10種類のスポーツに対応できるようになったぞ」と佐藤はつぶやきながら、コードを眺めた。アメリカンフットボール、野球、ボクシング、剣道、ラグビー、テニス、水泳、バスケットボール、サッカー、バレーボール。これら全てのスポーツの実況を、AIがリアルに生成することができるようになったのだ。

佐藤はAIモデルのトレーニングを終え、Gradioインターフェースを立ち上げた。これにより、ユーザーは簡単に好きなスポーツを選び、実況テキストと音声を生成することができる。彼は興奮を抑えきれず、早速インターフェースを試してみた。

まずは野球を選び、生成ボタンをクリック。AIは即座に野球の試合実況テキストを生成し始めた。

「9回裏、2アウト、ランナー1塁3塁、バッターは4番の田中選手…」というリアルな実況が画面に表示される。そして、テキストを音声に変換する機能を使って、生成された実況がMP3ファイルとして保存される。

佐藤はイヤホンを装着し、生成された音声を再生した。「9回裏、2アウト、ランナー1塁3塁、バッターは4番の田中選手…」という臨場感溢れる実況が流れた。まるで自分が球場にいるかのような感覚に包まれた。

次に、佐藤は剣道を選んだ。生成された実況テキストには、「激しい竹刀の音が響き渡る中、佐藤選手が一歩前進し、見事な面打ちを決めた…」と書かれていた。これもまた、音声として生成され、佐藤はそのリアルな実況を楽しんだ。

その日、佐藤は様々なスポーツを試しながら、AIの精度に感動し続けた。「これで多くの人が、自宅にいながら様々なスポーツの試合を楽しむことができる」と彼は考えた。

夜遅くまで作業を続けた佐藤は、満足感と共にプロジェクトの進捗を振り返った。「実況AI」は順調に成長している。明日もまた、新しい挑戦が待っているに違いない。そう思いながら、佐藤は静かにパソコンの電源を切った。

このショートストーリーは、佐藤という開発者が「実況AI」プロジェクトに取り組む様子を描いています。AIがリアルなスポーツ実況を生成し、それを音声で届けるという革新的な技術を開発する過程での喜びと興奮が伝わる内容です。

実行結果。

スクリーンショット 2024-07-20 021547.png

野球。

もちろん、以下に試合の概要とその進行状況を紹介します。

試合のタイトル:ロッタス・マーリンズ vs サウルズ・レッドス

時間:2015年8月17日(火曜日)16:00(日本時間)

場所:メトロポリタン・スタジアム

試合開始前

メトロポリタン・スタジアムは人気の高い観客が満席で、緊張した空気が感じられる。試合開始信号が鳴り響き、試合が始動しました。

試合中

ロッタス・マーリンズの先発投手が登上了り、彼の投球能力を見せてもらいました。しかし、サウルズ・レッドスの打撃力もなかなか見せてくれませんでした。試合はロッタス・マーリンズの攻撃から始まりましたが、結果的に相手チームが得点を挙げました。ロッタス・マーリンズの守備陣は驚くほど的好調で、多くの得点を防ぎます。

試合後

試合終了後のフィナーレでは、ロッタス・マーリンズの選手たちは大きな喜びを感じていました。一方で、サウルズ・レッドスの選手たちも苦労してきました。試合終了後には、両チームともまた一回戦に向けて準備を進めています。

この試合はロッタス・マーリンズが勝利を収め、今週のゲームの予想はまだ続くでしょう。次回の試合では、どちらが優勢か楽しみですね!

ボクシング。

タイトル:ボクシング - 10R - 2分45秒

試合が再開され、試合員たちは再び立ち上がり、一歩ずつ前に進む。彼の名前は「マット」。

彼の右拳は猛スピードで前進し、彼の敵の頭部に直撃する。しかし、彼の拳は敵の防御によって弾かれる。そして、彼の左拳も同様に敵の防御から逃げ出す。

試合が進行していき、マットは次第に優位に立っていった。彼の強力な右拳は、敵の体を軽く叩いていく。そして、その勢いで、敵の鼻がひんやりと冷たくなった。

試合が進行すると、マットは敵の攻撃を避けながらも、自分の攻撃も続けている。彼の右拳は無数の敵の防御から逃げ出し、敵の体を打ち破る。

試合が進行すると、マットは敵の体を蹴り飛ばす。そして、その勢いで、彼の敵が倒れ込む。

試合が終了すると、マットは勝利を収めることができ、その場に立つ。そして、彼の勝利を喜んでいた人々が歓声を上げる。

試合が終わると、マットは息を整え、そして、次の試合への準備を始める。彼の目標は、また新しい試合に出場することだ。彼の目標は、彼の夢を達成するために、常に努力し続けることだ。

サッカー。

タイトル:サッカーチャンピオンシップ決勝

こんにちは、お世話になります。

この週末、世界中から観客たちが集まる場所へと足を運びます。それは、最も尊敬される国際競技である「サッカーチャンピオンシップ」の決勝戦です。試合は2時間で行われ、試合後には特別なパフォーマンスが予定されています。

試合開始!

試合は15分ほど前から始まりました。選手たちは緊張した表情を浮かべつつ、準備を整えています。彼らの体調は良好であり、彼らの強さと技術は見事に展示されます。

試合は2チームに分けられ、それぞれが自分たちのフィールドで戦います。それぞれのチームは自分のアプローチと戦略を持っています。

試合が進行すると、攻撃的なプレーが目立つようになりました。両チームは相手を追い詰めるため、積極的にボールを奪い合う姿が見られます。

試合は時間が経過とともに進み、どちらのチームも力を入れています。しかし、最終的には一方が勝利を収めることになるでしょう。

試合はまだ始まっていませんが、多くの人々は期待に満ちていています。彼らの熱意と挑戦心が今後の試合に影響を与え、観客たちは彼女たちの活躍を見守ります。

試合が終わり、結果が明らかになると、その瞬間は歓声があがり、欢呼が空を広げます。

試合終了!

試合終了後、特別なパフォーマンスが行われます。そのパフォーマンスは、試合の最後の部分で行われ、観客たちは興奮し、歓喜します。

そして、サッカーチャンピオンシップの決勝戦は、次回の試合に向けて再び始まります。この試合で得た学びは、次の試合への大きな助けとなります。

この試合は、サッカーの魅力を最大限に引き出す素晴らしい機会です。皆さん、楽しんでください。

コードの説明

ライブラリのインストール: 必要なライブラリを最初にインストールします。

モデルの読み込み: transformersライブラリを使って言語モデルとトークナイザーを読み込みます。

プロンプトの設定: アメリカンフットボール、野球、ボクシング、剣道、ラグビー、テニス、水泳、バスケットボール、サッカー、バレーボールの実況テキストを生成するためのプロンプトを設定します。

generate_story 関数: スポーツに応じた実況テキストを生成します。

text_to_speech 関数: 生成されたテキストを音声に変換してMP3ファイルとして保存します。

generate_and_speak 関数: ユーザーが選択したスポーツに基づいて実況テキストを生成し、その音声を再生します。

Gradio インターフェース: ユーザーがスポーツを選択し、生成された実況テキストと音声を表示するためのインターフェースを提供します。

このコードを実行すると、ユーザーが選択したスポーツの実況テキストを生成し、それを音声で再生することができます。

# 必要なライブラリのインストール
!pip install accelerate gTTS gradio transformers

from transformers import AutoModelForCausalLM, AutoTokenizer
from gtts import gTTS
import torch
import gradio as gr

# GPUが利用可能かどうかをチェック
device = "cuda" if torch.cuda.is_available() else "cpu"

# 言語モデルとトークナイザーの読み込み
language_model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen2-1.5B-Instruct",
    torch_dtype="auto",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-1.5B-Instruct")

# スポーツ実況のプロンプト
prompts = {
    "football": "アメリカンフットボールの試合実況テキストをリアルに生成してください。",
    "baseball": "野球の試合実況テキストをリアルに生成してください。",
    "boxing": "ボクシングの試合実況テキストをリアルに生成してください。",
    "kendo": "剣道の試合実況テキストをリアルに生成してください。",
    "rugby": "ラグビーの試合実況テキストをリアルに生成してください。",
    "tennis": "テニスの試合実況テキストをリアルに生成してください。",
    "swimming": "水泳の競技実況テキストをリアルに生成してください。",
    "basketball": "バスケットボールの試合実況テキストをリアルに生成してください。",
    "soccer": "サッカーの試合実況テキストをリアルに生成してください。",
    "volleyball": "バレーボールの試合実況テキストをリアルに生成してください。",
}

def generate_story(sport):
    prompt = prompts.get(sport, "スポーツの架空の実況テキストをリアルに生成してください。")
    messages = [
        {"role": "system", "content": "あなたはスポーツ実況の専門家です。"},
        {"role": "user", "content": prompt}
    ]

    text = tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        add_generation_prompt=True
    )
    model_inputs = tokenizer([text], return_tensors="pt").to(device)

    generated_ids = language_model.generate(
        model_inputs.input_ids,
        max_new_tokens=512
    )
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]

    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    return response

def text_to_speech(text, filename):
    tts = gTTS(text=text, lang='ja')
    tts.save(filename)
    return filename

def generate_and_speak(sport):
    generated_text = generate_story(sport)
    filename = "generated_story.mp3"
    mp3_filename = text_to_speech(generated_text, filename)
    return generated_text, mp3_filename

sports = list(prompts.keys())

iface = gr.Interface(
    fn=generate_and_speak,
    inputs=[
        gr.Dropdown(choices=sports, label="スポーツを選択")
    ],
    outputs=[gr.Textbox(label="生成された実況テキスト"), gr.Audio(label="生成された音声")],
    title="スポーツ実況生成&読み上げ",
    description="選択したスポーツに基づいて実況テキストを生成し、そのテキストを音声合成してMP3ファイルとして再生します。"
)

if __name__ == "__main__":
    iface.launch()

コードの説明

ライブラリのインストール: コードの先頭で必要なライブラリをインストールします。
モデルの読み込み: transformersライブラリを使って言語モデルとトークナイザーを読み込みます。
プロンプトの設定: 10種類のスポーツの実況テキストを生成するためのプロンプトを設定します。
generate_story 関数: スポーツに応じた実況テキストを生成します。
text_to_speech 関数: 生成されたテキストを音声に変換し、MP3ファイルとして保存します。
generate_and_speak 関数: ユーザーが選択したスポーツに基づいて実況テキストを生成し、その音声を再生します。
Gradio インターフェース: ユーザーがスポーツを選択し、生成された実況テキストと音声を表示するためのインターフェースを提供します。
このコードを実行することで、ユーザーはスポーツを選択し、その選択に応じた実況テキストと音声を生成して再生することができます。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5