さんだすメモ

さメモ

技術ブログでは、ない・・・

アニメのセリフを収集してみる

pr1m3 v1d30 の字幕から集めてみました。
表にまとめるのを目標にし、話し手が7割くらい合う結果になりました。

各字幕

*.ttml2 を見てみると、次のように字幕が羅列されていることが分かります。
また、字幕の開始・終了時も抽出できます。

<p begin="00:00:00.459" end="00:00:03.921" style="s1"><span style="s2">(園児)か~くれんぼする人<br />この指 とまれ!</span></p>
<p begin="00:00:04.004" end="00:00:04.755" style="s1"><span style="s2">(園児たち)やる~!</span></p>
<p begin="00:00:04.839" end="00:00:06.424" style="s1"><span style="s2"><span style="s3"><span style="s4">後藤</span><span style="s5">ごとう</span></span>ひとり)<span style="s6">私なんかが…</span></span></p>

スタイルについて

<p begin="00:00:04.839" end="00:00:06.424" style="s1"><span style="s2"><span style="s3"><span style="s4">後藤</span><span style="s5">ごとう</span></span>ひとり)<span style="s6">私なんかが…</span></span></p>

各行に span が大量にありますが、 style="s○" の意味については、ヘッダを見てみると次のように解釈できます。
なお、この s○ は動画によって変わるので毎回抽出する必要があります。

<!-- ルビ部分の全体 -->
<style tts:ruby="container" xml:id="s3"></style>

<!-- ルビ -->
<style tts:ruby="text" tts:rubyPosition="before" xml:id="s5"></style>
<style tts:ruby="text" tts:rubyPosition="after" xml:id="s8"></style>

<!-- ルビ部分の本文 -->
<style tts:ruby="base" xml:id="s4"></style>

<!-- その他 -->
<style tts:textAlign="center" xml:id="s1"></style>
<style tts:textAlign="start" xml:id="s2"></style>
<style tts:fontShear="16.78842%" xml:id="s6"></style>
<style tts:fontShear="16.78842%" tts:textAlign="center" xml:id="s7"></style>

ルビは不要なので削除しました。

全角括弧

話し手などの情報は全角括弧で示されています。
(<話し手>)<セリフ> または (<効果音>) または <セリフ> が連なっていると考えてよさそうです。
なお、<br/> の扱いを考える必要がありますが、その後に違う文が続くときは必ず全角括弧があるようでした。

<p begin="00:02:25.437" end="00:02:27.106" style="s1"><span style="s2">(玄関のチャイム)<br />(ひとり)ハッ!</span></p>
<p begin="00:02:27.189" end="00:02:29.149" style="s1"><span style="s2">ぼっちちゃん 来たよ~</span></p>

※ span や br などのタグの部分を消す

(玄関のチャイム)(ひとり)ハッ!
ぼっちちゃん 来たよ~

その他

半角括弧

今回は半角括弧で囲まれた部分は読みを表しているようだったので削除しました。

(ひとり)きの う 虹夏(にじか)ちゃんから

名前の省略

二度目以降は名前が省略されるので、事前に組み合わせでまとめておくとよいと思います。

(後藤ひとり)あっ あっ あ…
(ひとり)イ… イエ~イ!

最終的なコードの概要

ひとまずの抽出部分を書きました。

# p タグについてのループ
for p in div:
    # 開始・終了時の取得
    begin = p.attrib.get('begin')
    end = p.attrib.get('end')

    # ルビの削除
    for span in p.findall(f'.//{{{namespace}}}span'):
        if span.attrib.get('style') in id_exclusion_list:
            span.text = ''

    # 現在の p タグの要素を文字列として取得
    s = ET.tostring(p, encoding='utf-8').decode().strip()

    # タグを削除
    s = re.sub(r'<[^<>]*>', '', s)

    # 半角括弧と中身を削除
    s = re.sub(r'\([^()]*\)', '', s)

    # 全角括弧をまとまりの起点として、正規表現で話し手やセリフを抽出
    for m in re.finditer(r'(?P<brace>((?P<in_brace>[^()]*)))(?P<line>[^()]*)|(?P<line2>[^()]+)', s):
        # (効果音)の形
        brace = m.group('brace')
        line = m.group('line')
        if brace != None and line == None:
            print(f'効果音: {m.group("se")}')
            continue

        # (キャラ)セリフの形
        in_brace = m.group('in_brace')
        if line != None:
            print(f'キャラ: {in_brace}, セリフ: {line}')
            continue

        # セリフのみの形
        line2 = m.group('line2')
        if line2 != None:
            print(f'セリフ: {line2}')
            continue

        print('exception')

キャラは直近のものを採用するなど、適切な処理を加えてしまえば、あとは出力するだけです。

その後

喋っているキャラが画面から明らかに判別できる場合は、全角括弧でキャラ名を示されないようです。
そのため、今回の方法ではいくつもキャラ名を取りこぼします。
良い方法で修正しても、最後は手作業が必要でしょう。

自分の場合は、プルダウンでキャラを選択して修正できるようにしました。
適当に音声を録音して、編集中に自在に流せるようにしておくと便利です。
また、選択に応じてテキストの色が変わるようにすると、認識が楽になりました。

良き収集ライフを——。

アニメのGB素材を作ってみる[GIMP]

GIMP でアニメの GB 素材を作ってみました。
線画が太いと有効かもしれないです。
今回は素材が良かったのか1枚1分半くらいでできました。
汎用性と効率に優れているかは分かりませんが、一例として紹介しておきます。

こちらのページを参考にしつつ線画を抽出して、対象以外を選択するという流れです。


(2023/03/15)前半の線画抽出部分のスクリプトを書きました。


  1. 画像を読み込む ・・・レイヤー1
  2. (レイヤー1) 右クリックして「レイヤーの複製」 ・・・レイヤー2
  3. (レイヤー2) 「色>脱色>脱色」
  4. (レイヤー2) 右クリックして「レイヤーの複製」 ・・・レイヤー3
  5. (レイヤー3) 「色>階調の反転」
  6. (レイヤー3) ブレンドモードを「標準」から「覆い焼き」にする
  7. (レイヤー3) 「フィルター>ぼかし>ガウスぼかし」
    値によって線画の成分の濃さが変わります。
    自分は100pxで作業しました。
  8. (レイヤー3) 右クリックして「下のレイヤーと統合」
  9. (レイヤー3) 「ツール>選択ツール>ファジー選択」
    背景部分を選択していきます。
    綺麗に選択できなかった部分は後で見つける作業をして戻ってきます。
    なお、「選択範囲に加える」モードにすることと、「なめらかに」「境界をぼかす」「対角に接続」を外すと良いと思います。
  10. (レイヤー3) 「選択>穴の削除」
  11. (レイヤー3) 「ツール>選択ツール>自由選択」
    枝が生えてたり画面端で選択されていない部分を取り去ります。
    「選択範囲に加える」モードにしておきます。
  12. (レイヤー3) Delete キーで選択範囲の画像を削除
    選択範囲がおかしいことが判明したら、8.5としてブラシで修正してやり直します。
    修正可能なら、12.5として、その場で修正・塗り潰して進みます。
  13. (レイヤー3) 右クリック「不透明部分を選択範囲に」

以上で欲しい部分を選択範囲にすることができました。

Stylus メモ

twitch の動画タイトルを末尾まで見る

/* ドメイン: twitch.tv */
.ilJsSZ {
    white-space: normal;
}

ニコ動のコメント欄の大きさを 384px 固定じゃなく変えられるようにする
分割の割合を変えるとかを javascript で書けるのかも

/* ドメイン: www.nicovideo.jp */
.MainContainer-playerPanel {
    left: calc(100% - 384px);
    right: auto;
    overflow: scroll;
    resize: both;
}

US配列 on JIS配列のすすめ [キーボード]

はじめに

JIS配列のキーボードでUS配列を使うと、Enter キーを近くに置けるという話です。

配置

JIS

画像
JIS

US

画像
US

US配列 on JIS配列

US-on-JIS

US 配列の記号配置で変換・無変換キーが使えるのは言わずと知れたところだと思います。

この配列隠れた利点は、Enter キーを近いところに置けるというところです。
また、空いた右シフトに _ を置くと、プログラムを書くときに便利です。

Windows の設定

kbd106.dll を作り直して、ショートカットキーに不整合がないようにします。

実際の作業は Windows 日本語入力環境で US 配列をより使いやすくする を参考にしました。

vcxsrv の設定

vcxsrv は scan code を見ているようなので、ドライバを変えても効果がありません。

インストール先にある X KeyBoard extension の設定を編集します。
scoop で入れている人は、%USERPROFILE%\scoop\apps\vcxsrv\current\xkbdata\symbols\jp を編集します。

--- jp_original
+++ jp
@@ -6,30 +6,29 @@
     include "jp(common)"
     name[Group1]= "Japanese";

-    key <AE10> { [ 0, asciitilde ] };
-    key <AE13> { [ backslash, bar ] };
+    key <AE10> { [ 0, parenright ] };
+    key <AE13> { [ BackSpace ] };
+
+    key <RTRN> { [ backslash, bar ] };
+    key <RTSH> { [ underscore, backslash ] };
 };

 hidden partial alphanumeric_keys
 xkb_symbols "common" {
     // "Common" keys for jp 106/109A layouts.

-    key <HZTG> {
-       type[Group1]="PC_ALT_LEVEL2",
-       symbols[Group1]= [ Zenkaku_Hankaku, Kanji ]
-    };
-
+    key <HZTG> { [ grave, asciitilde ] };
     key <AE01> { [ 1, exclam ] };
-    key <AE02> { [ 2, quotedbl ] };
+    key <AE02> { [ 2, at ] };
     key <AE03> { [ 3, numbersign ] };
     key <AE04> { [ 4, dollar ] };
     key <AE05> { [ 5, percent ] };
-    key <AE06> { [ 6, ampersand ] };
-    key <AE07> { [ 7, apostrophe ] };
-    key <AE08> { [ 8, parenleft ] };
-    key <AE09> { [ 9, parenright ] };
-    key <AE11> { [ minus, equal ] };
-    key <AE12> { [ asciicircum, asciitilde ] };
+    key <AE06> { [ 6, asciicircum ] };
+    key <AE07> { [ 7, ampersand ] };
+    key <AE08> { [ 8, asterisk ] };
+    key <AE09> { [ 9, parenleft ] };
+    key <AE11> { [ minus, underscore ] };
+    key <AE12> { [ equal, plus ] };

     key <AD01> { [ q, Q ] };
     key <AD02> { [ w, W ] };
@@ -41,10 +40,10 @@
     key <AD08> { [ i, I ] };
     key <AD09> { [ o, O ] };
     key <AD10> { [ p, P ] };
-    key <AD11> { [ at, grave ] };
-    key <AD12> { [ bracketleft, braceleft ] };
+    key <AD11> { [ bracketleft, braceleft ] };
+    key <AD12> { [ bracketright, braceright ] };

-    key <CAPS> { [ Eisu_toggle, Caps_Lock ] };
+    key <CAPS> { [ Caps_Lock ] };

     key <AC01> { [ a, A ] };
     key <AC02> { [ s, S ] };
@@ -55,9 +54,9 @@
     key <AC07> { [ j, J ] };
     key <AC08> { [ k, K ] };
     key <AC09> { [ l, L ] };
-    key <AC10> { [ semicolon, plus ] };
-    key <AC11> { [ colon, asterisk ] };
-    key <AC12> { [ bracketright, braceright ] };
+    key <AC10> { [ semicolon, colon ] };
+    key <AC11> { [ apostrophe, quotedbl ] };
+    key <AC12> { [ Return ] };

     key <AB01> { [ z, Z ] };
     key <AB02> { [ x, X ] };
@@ -69,8 +68,8 @@
     key <AB08> { [ comma, less ] };
     key <AB09> { [ period, greater ] };
     key <AB10> { [ slash, question ] };
-    key <AB11> { [ backslash, underscore ] };
-    key <LCTL> { [ Control_L };
+    key <AB11> { [ Shift_R ] };
+    key <LCTL> { [ Control_L ] };

     key <NFER> { [ Muhenkan ] };

JIS配列のキーボードを使うため、vcxsrv の起動時に引数に -xkblayout jp を入れておきます。

エクスプローラのコンテキストメニューから WSL の tmux でディレクトリを開く

こんな感じで設定してみました。

フォルダ選択時のメニュー

  • HKEY_CURRENT_USER\SOFTWARE\Classes\Folder\shell\tmux
    • (既定), REG_SZ, tmuxで開く
    • Icon, REG_SZ, C:\Windows\System32\wsl.exe
  • HKEY_CURRENT_USER\SOFTWARE\Classes\Folder\shell\tmux\command
    • (既定), REG_SZ, C:\Windows\System32\wsl.exe --cd "%V" /path/to/send_to_tmux

フォルダ外でのメニュー

  • HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\tmux
    • (既定), REG_SZ, tmuxで開く
    • Icon, REG_SZ, C:\Windows\System32\wsl.exe
  • HKEY_CURRENT_USER\SOFTWARE\Classes\Directory\Background\shell\tmux\command
    • (既定), REG_SZ, C:\Windows\System32\wsl.exe --cd "%V" /path/to/send_to_tmux

/path/to/send_to_tmux を作って編集します。
実行権限も付けておきます。

#!/bin/sh

if [ $(tmux ls 2> /dev/null | wc -l)  -ne 0 ]; then
  tmux new-window -t "$(tmux ls | head -n 1 | sed -n 's/^\([^:]\+\):.*$/\1/p'):"
fi

レジストリについて参考にしました: https://www.pg-fl.jp/program/winreg/classes.htm

HKCU のレジストリはコマンドで登録できて良いですね。

Vivaldi のタイトルバーを消す

★★★Vivaldi 6.0 以降は設定画面で表示/非表示を設定できます。★★★

したいこと

  • タイトルバーが不要なので消す
    • Vivaldi ボタンはアドレスバーに移動させる

すること

インストール場所でファイルを追加・編集します。

  • my_style.css の作成
    • タイトルバーを最大限消す
  • my_script.js の作成
    • Vivaldi ボタンをアドレスバーに移動する
  • browser.html の編集
    • 起動時に読み込むようにする

my_style.css

#header {
  min-height: auto;
}

#header > .tabless > .window-buttongroup {
  visibility: collapse;
}

.window-buttongroup は右上のウィンドウ操作のボタンたちです。

my_script.js

(function() {
  /**
    * Move the vivaldi button to the beginning of the toolbar
    * #app > #browser > #header > #titlebar > button.vivaldi
    * #app > #browser > #main > .UrlBar > .toolbar
    * #app > #browser > #main > .mainbar > .toolbar (220618)
    */

  const app = document.getElementById('app');

  // Create observer
  const observer = new MutationObserver(observerCallback);

  // Start
  observer.observe(app, {childList: true});

  // For debug
  let observerCount = 0;

  // Callback function
  function observerCallback(records) {
    // For debug
    observerCount++;
    console.log('observer:%s start', observerCount);
    console.log('observer:%s records.length:%s', observerCount, records.length);

    const vivaldiButton = document.querySelector('#titlebar button.vivaldi');
    const toolbar = document.querySelector('#main .mainbar .toolbar');
    // const toolbar = document.querySelector('#main .UrlBar .toolbar');

    if (vivaldiButton != null && toolbar != null) {
      // Create a buttonToolbar
      const buttonToolbar = document.createElement('div');
      buttonToolbar.className = 'button-toolbar';

      // Edit the vivaldi button and append it to the buttonToolbar
      vivaldiButton.style.height = '34px';
      vivaldiButton.classList.add('ToolbarButton-Button');
      vivaldiButton.classList.remove('vivaldi');
      buttonToolbar.appendChild(vivaldiButton);

      // Prepend the buttonToolbar to the toolbar
      toolbar.prepend(buttonToolbar);

      // End processing
      observer.disconnect();

      // For debug
      console.log('observer:%s disconnect', observerCount);
    }

    // For debug
    console.log('observer:%s end', observerCount);
  }

})();

動作としては、

  • #app について子要素の追加・削除を監視する
  • vivaldiButtontoolbar が追加されたら移動する

browser.html

  • <head><link rel="stylesheet" href="my_style.css" /> を追加する
  • <body><script src="my_script.js"></script> を追加する