英語吹替の歌詞でDAM・JOYSOUNDのアニソンを歌うための道のり(前編)

!!この記事の内容は、まだ成功していません。アイディア提示といままでやってきたことの記憶です。完結は来年予定の後編で!!

この記事は[Aizu Advent Calendar 2019](https://adventar.org/calendars/3938) 25日目です。24日目はマヤミトの「[コミュ障を治す技術](https://yt8492.hatenablog.com/entry/2019/12/24/233047)」でした。

今年は、『英語吹替の歌詞でDAM・JOYSOUNDのアニソンを歌うための道のり(前編)』ということで、カラオケ機種ごとに英語吹き替え歌詞を表示するための道のりを検討していきます。

カラオケ行ったら、アニソンをドヤ顔で英語版で歌ってやるのが趣味なのですが、誰も歌詞を聞き取れず困る。。これは、前のスクリーンにちゃんと英語を表示させるしかないということでプロジェクトを始めました。

なんでこの記事が前編なのかって？実は未完成で悩んでたら、来年に後編書けば丸く収まることを教わって、なるほど〜ってなった感じですw ( [spookydokey](https://tetsukirimountain.hatenablog.com/entry/2019/12/22/223433?_ga=2.68365585.126965980.1576699478-1502846612.1576156282)ありがと！！

# やろうとしてること

最初のアイディア段階では、以下の4つでした

- DAMの「USBメモリから背景動画挿入する機能」を利用して英語吹替版歌詞を表示する(断念)
- JOYSOUNDの「『キョクナビ』の背景動画挿入機能」を利用して英語吹替版歌詞を表示する(断念)
- スマホ用カラオケアプリ『JOYSOUND+』を解析して、曲データを英語吹替歌詞に差し替える(作業中)
- Windows用カラオケアプリ『カラオケ＠DAM』の「背景動画を無理やり差し替える」(保留)

次のセクションから、実際にやってきたことを紹介しますが、その前に↓↓

## 続ける前に英語吹替版アニソンの良さを語らせて

技術的な話ししても納得してくれなきゃ、正直ふ〜んって感じだろうし〜〜！！お願い！

まずは黙ってデート・ア・ライブの『Q&A』、たった90秒なんで英語版と日本語版の歌詞で聴き比べてみてください。。

[日本語版](https://www.youtube.com/watch?v=ZWFDJchHtnY) 「あれこれ抱え込んで 思えばいらないものまで♪」
[英語吹替版](https://www.youtube.com/watch?v=N-85_gu57sY) 「Taking care to keep my baggage with me - Loading more and more when I should be unloading♪」

日本語カワイイ声もいいんだけど、英語版のカッコよく締まったような声が好きになってしまいました！

こういう吹替の曲、調べるとめちゃくちゃあって

めちゃくちゃ日本語版に似せてて違いが楽しい、
「[お願いマッスル](https://www.youtube.com/watch?v=HUoRNS9q_FQ) (I wanna get muscles! Won't you pretty please!)」
英語でも歌った感覚が強く残って響きが楽しい、
「[God Knows](https://www.youtube.com/watch?v=Gz9cTIm6z4w) (This empty heart runs past you time and again)」
早口言葉みたいな感じでもあって歌うだけ楽しい、
「[心のファンファーレ](https://www.youtube.com/watch?v=huH-mQ0calU) (No one ever said to me that having to be strong means that you can never cry.)」

全部、アニソンに違った花を咲かせてくれてめちゃくちゃ楽しいですよ！！
この歌詞で、この歌詞でカラオケ、歌いたくなってきませんか？？ 

~~ちなみに、DAMでもJOYSOUNDでもやりたい理由は、デアラのアニメ挿入歌がDAMにしか入ってないからだったり~~

# やってきたこと

ここからは、各機器ごとにやってきたことを紹介していきます

## DAM (断念)

### きっかけ

ある日、カラオケの新曲リストのスクレイピングをしようとしていて、こんな記事を見つけた。
https://gist.github.com/walfie/87bcb9e5a14d97af6fe39c8d3eb9468e

これは、「「「「デンモクAPI」」」に関する説明だった。

①ご存知、DAMはスマホアプリとしてデンモクを提供している。これさえあれば、APIだけで検索も予約もできるはずなのだ！！

②また、DAMにはUSB経由で背景ビデオを転送する機能を知っていた。しかし、DAM本体だけで映像の選択はできないのだ。
http://hikopatchi.hatenablog.com/entry/2015/06/30/185611

そこで、ひらめいた。

予約できるAPI→現在の予約曲も確認できる→これとairCard(wifiがついてるSDカード)でも使えば再生している曲に応じてビデオを自動セレクトできるようになるはず！！

これで、歌を変えるごとに、USBメモリを取り外して転送し直す必要が無くなる！！！！！

というわけで、次の目標を立てました。

###「USBメモリから背景動画挿入する機能」を利用して英語吹替版歌詞を表示する

これをするための主な課題は以下の2つでした。

- 次再生する音楽を決定するために、デンモクのAPIから予約リストの曲目を取得する
- 「LIVE DAM STADIUM」にUSBメモリを刺すと持ち込んだ動画が再生できるが、なぜか実際の動画より早い速度で再生されたり、途中で切れたりしてしまうのを解決する
- PQI Cardで任意のスクリプトを実行＆DAMに記憶媒体として認識させる
- 動画の位置合わせ

#### 次再生する音楽を決定するために、デンモクのAPIから予約リストの曲目を取得する

Androidで古いバージョンのアプリ(API Level 23 以前)は、ユーザーがインストールしたSSL証明書を読み込んでくれます。そのため、『デンモクの古いバージョン+ [packet capture](https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture&hl=ja)』の組み合わせで、DAMのデンモクAPIを詳しく覗いてみました。

しかし、「次再生する音楽を決定するために、デンモクのAPIから予約リストの曲目を取得する」という時点で、APIにそもそもそういう機能がなさそうなことが発覚。

ここで、DAM機器で歌詞表示するのは断念しました。。

## JOYSOUND (断念)

### きっかけ

JOYSOUNDには、[スマホから動画を流す機能](https://www.joysound.com/web/s/joy/naviapp/movieplayer)がある。
キョクナビアプリをざっと見た限り、予約確認機能とかもあるし
これをうまく利用すれば、いけるのではないか。。。

### JOYSOUNDの「『キョクナビ』の背景動画挿入機能」を利用して英語吹替版歌詞を表示する

これをするための主な課題は次の通りでした、

- 次再生する音楽を決定するために、キョクナビのAPIから予約リストの曲目を取得する
- 端末への動画送信の仕様を知る
- 動画の位置合わせ

#### 次再生する音楽を決定するために、キョクナビのAPIから予約リストの曲目を取得する

DAMの時と同じ方法で(スマホで完結するのが億劫になってきてfrida&objectionで飛ばしてburpsuiteで確認していたけど)、ここはすんなり、該当のAPIを見つけることが出来ました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/b14117ef-c518-af58-e3ad-0225567cf21e.png)


#### 端末への動画送信の仕様を知る

プロキシ通ってくれなくて、`adb shell`からtcpdumpして、カラオケ機に直接通信してるらしきデータを発見。ただ、これ以上解析しようとすると、いろいろ試すことになって、攻撃になってしまう気がしてここで断念。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/611b19b7-6de6-b595-312d-bc27ffdbb31d.png)

一応仕様としては、

1. カラオケ本体(10.111.21.48)上の5万番台の任意ポート上で、配信対象の動画を配信するWebサーバーを立てる
1. スマホ(10.111.254.190)からカラオケ本体(10.111.21.48)に受信してほしい動画のURLを送信
1. カラオケ本体(10.111.21.48)がスマホ(10.111.254.190)上の指定されたURLにアクセスし動画をダウンロード

という形式になっているようでした。
この2番目の「受信してほしい動画のURLを送信」するリクエストがよく分からずに断念してしまいました。

追記: 朝になってから見てみたらそこまで複雑じゃないのでは？ってなってる
※wiresharkにEthernetⅡのフレームから表示されてるのに今気づいた人。TCPのヘッダは知ってたけどこの値はなんじゃってなってた。。

というわけで、まともに通信見てみましょうか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/6a412fd7-4e1c-bca8-4d38-ecd2b92da954.png)

通し番号100番のものから見ていくとして、100番〜102番はTCPのハンドシェイク。

103番はカラオケ機器に次のデータを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/ce357cec-b6b8-69eb-b2b2-7453554a64e1.png)

105番でスマホに次のデータを送って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/a504131d-a096-3bde-ee2d-78c06ff5a74a.png)

107番でカラオケ機器にURLらしきものを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/d27313a6-5932-f344-64aa-8d423a79aa4f.png)

109番で返事っぽいものを貰って
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/bdee88b5-023d-542a-a667-4d9cadecb85a.png)

こののちに112番以降でスマホ側にハンドシェイクし直し、HTTPリクエストをしているようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/cd73a87c-300c-f281-0d67-969929d3a296.png)

なんだか意外と単純な気がしてきました。またカラオケ行って確認してくるか

### 追記のまとめ

TCPのカラオケ機器送信側のデータで

`3c 02 00 00 00 00 00 00`から始まるやつは、その後にアクセスしてほしいURLがASCIIで来て、
`3f 01 00 00 00 00 00 00`から始まるやつはハッシュ値っぽいもの `<(40文字だからSHA1かな?ファイルのハッシュではなさそう) + ',' + yyyyMMddHHmmssffの日付>`がASCIIで来る。

この2つを読み込むだけで動画再生できるのは要検証だな。
とりあえずこのTCPリクエスト投げれるスクリプトを何かで書いたらまたカラオケで検証してみます

### 暫定の仮定

`09 07 00 00 00 00 00 00 0f`で再生
`08 06 ?? ?? ?? ?? ?? ??`再生停止?
`09 07 00 00 00 00 00 00 3c` `09 07 00 00 00 00 00 00 1e`早送り・早戻し?
`0c 05 00 00 00 00 00 00 00 ?? ?? ?? ??`位置指定でのジャンプ?


## JOYSOUND (スマホ練習アプリ『JOYSOUND+』)

### 曲データを英語吹替歌詞に差し替える (作業中)

APIを見てみると、歌詞とその位置データはfmeという形式らしい。base64にエンコードされて、このデータがjsonで送られて来ていたので、このデータを英語吹替歌詞に変えたらおそらく！
っと思ったけど、このバイナリ何も読めないw

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293301/1227fdda-ed84-ccd2-ce53-9bb94f3657a1.png)

適当な歌詞データ取ってきて、解析を試みてみましたが、ヘッダ部分はshift-jisでめちゃめちゃそれっぽいのに、それ以外の部分が理解できませんでした。

全く分からないのでARMのバイナリを読もうとしていますが、正直見たこともない命令ばっかりで本当の意味のなんもわからん。。解読できるのはいつになるんだか。。[後編に続く! 。。。多分]

というか、このアプリ一日3曲まで無料とかやってるけど、なんかサブスクリプションとか絡んできそうだし、これも深追いするのは怖いなぁ。

## DAM (Windows10『カラオケ＠DAM』) (保留)

### 曲データを英語吹替歌詞に差し替える

解析していると、mp4のデータが飛んで来た。
なんと、歌詞データが動画に埋め込まれた状態で送られている？！

というわけで、歌詞データはいじれなそうなので、やるとしたら動画ごといじる必要がありそう。
一番骨は折れそうだけど、ffmpegでいろいろいじって、歌詞だけの動画くっつけてとかやったら一番なんとかなりそうな方法ではある

# 結論

とにかく、通信カラオケはオンライン。なんだか心理的安全性がとても低く、やり辛さが目立ちました。

心理的安全性高め=オフラインでやる方法としては、

- 映像のミキサーを使って、カラオケ機以外の所で埋め込む
- PC上で動くカラオケアプリでなんとかする (持ちカラ。1から作るかぁ〜
- 実家にある遥か昔の「e-kara」とかいう玩具をいじる

くらいしかないんですよね〜〜〜。全部つらそう

とりあえず、ARMアセンブリ読むことと、DAMのアプリでなんとかすることを中心に進めてみます

さあ、後編(来年)には、どんな結果が待っているのでしょう。来年のサンタさんがなんとかしてくれるのを祈って、メリークリスマス👋