【グラブル】グラブルの素材(画像音声テキスト)を集めよう

こんにちは、墨汁です。

 

グラブル、絵が綺麗で音楽と声が良くてテキストが素晴らしいですよね。

ゲーム内でいつでもアクセスできますが、どうせなら手元に置いていつでも眺められる状態にしたいですよね

 

置きましょう

 

 

0. はじめに

前提として、PCでの話です。スマホタブレットだとどうやるんでしょうね?

 

それをどう拾うか集めるかというところに終始します。

高級な方法で大量に収集...というのはあまり期待しないでください。

 

また、ここではグラブルの話ですが

どのウェブサイトでも可能な一般的な話です。

 

また、以下のページを大いに参考にしています。

obel.hatenablog.jp

 

1. 画像

1.1. 右クリック、ドラッグアンドドロップ

説明不要の基本機能です。好きなディレクトリを指定してください。

ちなみに、画像をコピーを選択するとクリップボードにコピーされます。

ペイントツールなどを経由すればそこからの保存も可能です。

 

ルリアノートの画像、武器・召喚石、リストのアイコンなどが保存可能です。

ロボをつくるならコレで十二分。

 

1.2. 開発者ツール

Chrome系のブラウザの場合、F12を押すと文字がいっぱいのよくわかんねぇ画面が出てきます。これを開発者ツールというらしく、現在見ているウェブページがどういう構造をしているかを確認できるそうです。

 

コレを経由することで上の方法では保存できない画像を保存できます。

 

 

1.1.では対応できないシナリオの立ち絵、背景、戦闘中のアニメーションのパーツなどを確認できます。

フェディエルの奥義のアニメーションや乳揺れ(いわゆるスーパータユニズムエンジン)実装キャラの謎が溶けたりします。

 

1.3. キャッシュビューワー

グラブルは画像をPCに一旦DLし、それを読み込むという方法で画像や音声を表示しているそうです。その一旦DLされたものをキャッシュというらしいです。しらんけど。

 

それなら、キャッシュは一気に保存できるはずという発想ですね。

 

www.nirsoft.net  

英語でよくわかんねぇですが、これはブラウザのキャッシュを確認するためのフリーソフトです。

 

フィルター欄でgranblueと入力してグラブルのアドレスのファイルに限定すれば、

グラブルのキャッシュ一覧が出てきます。and,orフィルタも出来るので美味いこと目的のものに絞り込んでください。

 

1.1、1.2でも事足りますが、これは一括で出来る点がチョットツヨイです。

 

2. 音声

視覚的ではないので集め方がややムズです。

 

2.1. 録画ソフトで直撮り

OBSなどの録画・録音機能のあるソフトを使って直撮りします。

サウンド設定からボイスだけ、SEだけ、BGMだけなどの状態にできます。

うまく設定して、録画しましょう。

 

動画で出力されるかもしれませんが、ffmpegなどを使えばどうとでも変換できます。

 

2.2. キャッシュビューワー

1.3. と同じ方法です。コレ以外で音声ファイルを保存する方法を私は知らない。

これをするには一旦キャッシュとしてDLする必要があります。シナリオパートの場合、

  • 文章でシナリオを読むの再生ボタンを押す
  • 普通にシナリオを進めて音声を再生する

このどちらかでキャッシュが保存されます。

 

セリフのファイル名には命名規則があるためフィルタリングは容易です。

  • フェイトエピソードであれば、chr+3桁の通し番号
  • イベントシナリオであれば、evt+イベント開始日のyymmdd形式

これらがファイル名に含まれます。

ハーゼリーラであればchr493、2023ハロウィンイベントであればevt231017です。

 

効果音やBGMも同様の方法で収集できます。

 

3. テキスト

これが一番めんどくさいです。

 

3.1. 手打ち

タイピングスキルで押し切る方法です。

コレの場合であればスマホでも可能です。練習しましょう

sushida.net

 

3.2. 開発者ツール(検証)

目的のテキストの上で右クリック→検証を選択して下さい。

すると開発者ツール上でそのテキストの部分に飛びます。

該当部をダブルクリックすると編集モードに入るため、

これをコピーどこかに貼り付けすれば、タイピング下手くそお手々よちよち騎空士でもテキストを集められます。おーよちよち

優美な笑みを湛えた女教皇は、聡明さと智略をもって内心を欺瞞で飾る。過去に降りかかった悲劇は彼女の憎悪を燃え滾らせ、復讐へと駆り立てた。黒く染まった心は、もはや後戻りすることを許さない。例えそれが仲間を欺くことになろうとも──

 

3.3. 開発者ツール(HTMLとして編集)+α

ここまでの方法、手間すぎません?そんな時間あるならもっと他のことしませんか?グラブルとか....レスレリアーナのアトリエとか...

 

※しばらく早口※

最近フィリスちゃん引きました。フィリスのアトリエの主人公、フィリス・ミストルートです。アトリエ最推しキャラなのでかなり嬉しかったです。というかレスレリ始めた理由が初期実装にフィリスちゃんがいたからです。理由...いらっしゃい。ご飯できてるよ...

性能面ですがかなりテクニカルです。圧倒的に低い素早さ、敵のターンをズラす第2スキルとバーストスキル、アタッカーなのに低い火力。第2スキルとバーストスキルが唯一無二ですが汎用性が低いです。というかゲーム性と噛み合っていません。素早さを上げて速攻ブレイク&相手が動く前に落とすが基本戦術の中でこれはなかなか厳しい。

風属性なのでアホつよブレイカーのエスカとシナジーがありますが、斬属性のロジーさんのほうが速度重視のゲーム性とよほど相性がいいです。火力面も正直微妙です。自己バフ持ちのロロナ先生や純粋に倍率が高いライザの後塵を拝します。

ウリの第2スキルでの遅延は足が遅いため本人の速度も相まって使い勝手が悪いです。使う頃には相手のHPが条件の下限を下回りがちなので単純に中火力高遅延のへちょ技になってます。

じゃあ錬金のギフトがどうかというとコレも微妙。魔力の呪詛、突の祝福、火耐性上昇というなんとも言えないラインナップ。なんで?ギフトカラーは黄赤なのでスキル威力上昇持ちの強素材「ビリビリ水」に繋げられるのはいいですが、黄赤はルーウェンがいます。ルーウェン自身のギフトにスキル威力上昇があるので彼を使わない理由がない。

個人的な総評としてはハズレ☆3キャラです。一芸持ちなので起用機会はありますが、性能的に優先すべきキャラが他にたくさんいます。

でも使うよ。だって好きだもん

 

はい。話を戻します。

 

SKIP→文章でシナリオを読むを選ぶとそのシナリオ中の全テキストが読み込まれます。

で、この状態で開発者ツールを開くとわかるのですが

 

prt-log-display class以下にシナリオのデータがあります。

 

読み取れる情報としては

  • styleの第2引数がシナリオのIDのようなもの
  • prt-log-each class内に個別の情報
  • data-scenario-indexがテキストの通し番号
  • txt-log-name, txt-log-message classで誰が何を話したか

といったところですかね。

 

開発者ツールで右クリック→HTMLとして編集を選択すると

選択したclass以下のテキストデータが表示されます。

これをCtrl+A→Ctrl+Cなどでコピーしてどこかに貼り付けてから編集しましょう。

 

 

...

...

編集ゲボめんどくさくねぇ???

 

 

というわけでここで新テク登場。

Pythonにはhtmlを解析するBeautifulSoupというライブラリがあります。

コレを使って編集しちゃいましょう。私のコード力は3ぐらいなので98%ぐらいChatGPTにやってもらいました。

 

そのコードを実行すると

こんな感じのcsvファイルが出力されます。

あとはExcelのクエリなどを使って好きに管理しましょう。

誰がいつ何を言ったが全て分かります。

 

コードはGithubにおいてます。

初めてGithub使ったけどこれでいけてる...?

github.com

使えるかわからないので記事の最後にまるごとコード貼り付けておきます

4. もっと効率のいい方法

あるだろうし、なんとなくやり方は想像つくし、いまどきのえぃあぃに聞いたら教えてくれそうですが、これ以上は標準機能や手元での小テクの範囲を逸脱するというのが私の考えです。

 

5. まとめ

  • 画像は適当に保存できるよ
  • 音声はキャッシュビューワ使うのがいいよ
  • テキストは寿司打を極めるといいよ

 

かたった。

 

 

サムネ用主力。長期戦ならマリーoutメルルin

 

 

pyてょn

import pyperclip
from bs4 import BeautifulSoup
import csv
import re
from collections import Counter

# クリップボードからHTMLデータを読み込む
html_data = pyperclip.paste()

soup = BeautifulSoup(html_data, 'html.parser')
# シーン情報の初期化
scene_info = ""
filename_info = ""

# シーン情報を抽出
scene_search = re.search('scene_(\w+)', soup.find('div', class_='prt-log-display')['style'])
if scene_search:
    scene_info = scene_search.group(1)
    filename_info = scene_info
else:
    # シーン情報が抽出できなかった場合の処理
    voice_data_list =

    for log in soup.find_all('div', class_='prt-log-each'):
        voice_element = log.find('div', class_='btn-play-log-voice')
        if voice_element:
            voice_data_raw = voice_element['data-voice'].replace('voice/', '')
           
            # 最初の_と最後の_の間にある部分を取得
            voice_data_segment = "_".join(voice_data_raw.split('_')[1:-1])
            voice_data_list.append(voice_data_segment)

    # 最も多く出現する要素を取得
    most_common = Counter(voice_data_list).most_common(1)
    if most_common:
        most_common_element = most_common[0][0]
        scene_info = most_common_element
        filename_info = f"{most_common_element}_en"

# CSVファイルのヘッダーを更新
headers = ['Scene', 'Scenario Index', 'Name', 'Message', 'Voice Data']

# データの抽出
data =
for log in soup.find_all('div', class_='prt-log-each'):
    scenario_index = log['data-scenario-index']
    name = log.find('div', class_='txt-log-name').text.strip()
    message = log.find('div', class_='txt-log-message').text.strip().replace('\n', ' ')
   
    # voice/の削除と存在チェック
    voice_element = log.find('div', class_='btn-play-log-voice')
    voice_data = voice_element['data-voice'].replace('voice/', '') if voice_element else ''
   
    data.append([scene_info, scenario_index, name, message, voice_data])

# シーン情報を元にCSVファイル名を設定
filename = f"{filename_info}.csv"

# CSVファイルの作成
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(headers)
    writer.writerows(data)

print(f"CSV file created: {filename}!")