generAtes reaL-time subtitles in multiPle lAnguages from voiCe recognition And Reads Them Aloud. (with obs and obs-Websocket
音声認識からリアルタイムで翻訳し、認識結果と翻訳結果を音声合成で読み上げる。
OBS連携することで、音声認識した文字列と翻訳した文字列をOBS上に表示する。
-
Google Chrome
-
OBS + OBS-Websocket
-
localhost.run (またはngrokなど他のstunnelツール)
OBSの動いてるPC上でコマンドプロンプトを開いて以下を実行する。
> ssh -R 80:localhost:(OBS-WebSocketで指定したポート番号) localhost.run
コマンドに失敗する場合はFAQを見ること。
「xxxxxx.localhost.run tunneled with tls termination」と出れば完了。
ALPACARTAWから繋ぐには、IPAddrにxxxxxx.localhost.run、Portに443を指定する。
音声認識が行われるたびに、継続的に結果を返すのか、あるいは1つの結果のみ返すのかを制御する。(ON:する / OFF:しない)
デフォルト:する
音声認識する言語を設定する。
デフォルト:ja_JP
音声認識結果に適用するUTF8エンコーディングでJSON形式の辞書を設定する。
デフォルト:なし
音声認識を開始する。
音声認識結果に適用する辞書をトレーニングにより生成する。
トレーニングしたい文字列を設定する。
デフォルト:なし
トレーニングを開始する。
-
実行にはAdapt targetの設定が必須
-
音声認識はNative outputに出力される
トレーニングが正しく行われた場合、即座に現時点の読み込み済みの辞書を更新する。(ファイルには保存しない
辞書をローカル保存する。
翻訳機能を持つgoogle apps scriptのデプロイキーを設定する。
デフォルト:アルパカさんの
落ちてる場合は自分で用意すること。
// サンプル
function doGet(e) {
var p = e.parameter;
var translatedText = LanguageApp.translate(p.text, p.source, p.target);
return ContentService.createTextOutput(e.parameter.callback + '({"translated" : "' + translatedText + '"});').setMimeType(ContentService.MimeType.JAVASCRIPT);
}
母国語を設定する。
デフォルト:ja
翻訳対象の言語を設定する。
デフォルト:en
翻訳対象の第二言語を設定する。未指定なら翻訳しない。
デフォルト:なし
翻訳をテスト実行する。
テスト文字列は日本語なので、NativeLangには"ja"を設定しておくこと。
母国語の音声を設定する。
デフォルト:取得可能な音声一覧の先頭
母国語の音声の音量を設定する。
デフォルト:1
母国語の音声の音程を設定する。
デフォルト:1
母国語の音声の速度を設定する。
デフォルト:1
母国語で音声合成をテスト実行する。
翻訳対象の言語の音声を設定する。
デフォルト:取得可能な音声一覧の先頭
翻訳対象の言語の音声の音量を設定する。
デフォルト:1
翻訳対象の言語の音声の音程を設定する。
デフォルト:1
翻訳対象の言語の音声の速度を設定する。
デフォルト:1
翻訳対象の言語で音声合成をテスト実行する。
OBSとOBS-Websocketの設定をしておくこと。
OBS:26.1.1
OBS-Websocket:4.9.0
OBSとの接続が切れた場合に自動で再接続するか?(ON:する / OFF:しない)
デフォルト:OFF
OBSがインストールされているPCのIPv4アドレスを設定する。
デフォルト:localhost
OBS-Websocketで設定したポート番号を指定する。
デフォルト:4444
OBS-Websocketで設定したパスワードを指定する。
OBSに接続する。状態はボタン右に表示される。
- OPEN
OBSとの接続を開始した。
- CONNECTED
OBSとの接続が完了した。
- ERROR
OBSとの接続に失敗した。
母国語表示用のOBSのテキストソース名を設定する。
デフォルト:native
翻訳対象の言語のOBSのテキストソース名を設定する。
デフォルト:foreign
翻訳対象の第二言語のOBSのテキストソース名を設定する。
デフォルト:foreign2
OBSのテキストソースに表示された字幕が消えるまでの時間(ミリ秒)。
デフォルト:未設定
-
未設定、数値として評価できない場合は消えない
-
1000ms未満の場合は5000msになる
OBSのテキストソースに表示するテキストの最大長。
デフォルト:未設定
- 未設定、数値として評価できない場合は制限しない
最大長を超えて文字列が表示される場合
- 未確定状態の場合
最大長を超えないように左にパディングするみたいな雰囲気。
- 確定状態の場合
Subtitle scroll timeで指定した時間ごとに自動スクロールする。
Subtitle limitが有効の場合、確定状態のスクロールする時間。(ミリ秒)
デフォルト:300ms
Windowsのみ
音声認識の途中経過を取得するか?(ON:する / OFF:しない)
デフォルト:OFF
この機能をONにした場合、以下の処理が発生する。
- OBSに途中経過を送信する。
- 「Native source」で指定したテキストソースに「rtawfilter」という名前のフィルターがかかっている場合、それを以下のように制御する。
-> 途中経過の場合はフィルターをON
-> 確定した場合はフィルターをOFF
例えば、予め色補正フィルター(不透明度50など)を付けておくことで途中経過は半透明、確定したらフィルターが外れて不透明になる。といったことができる。
音声コマンドでリプレイを表示する。
-
OBSのリプレイバッファを有効にすること。
-
本機能には OBSプラグイン「Advanced Scene Switcher」もしくは相当の機能が必要。(リプレイ再生後のシーン戻し用)
-
本機能には OBSプラグイン「Directory waitch miedia」もしくは相当の機能が必要。(リプライバッファ最新保存をメディアソースに自動設定する用)
Replay機能を有効にする。(ON:する / OFF:しない)
デフォルト:OFF
Replayを保存する音声コマンドを設定する。
デフォルト:なし
Replayを再生するためのシーン切り替え音声コマンドを設定する。
デフォルト:なし
keyword - Move コマンドで移動するシーン名を設定する。
デフォルト:なし
音声コマンドで特定のシーンへ移動する。
シーンスイッチ機能を有効にする。(ON:する / OFF:しない)
デフォルト:OFF
シーン移動する音声コマンドを設定する。
デフォルト:なし
元のシーンに戻る音声コマンドを設定する。
デフォルト:なし
keyword - Return コマンドで戻るシーン名を設定する。
デフォルト:なし
keyword - Move コマンドで移動するシーン名を設定する。
デフォルト:なし
keyword - Return コマンドで戻るシーン名を設定する。
デフォルト:なし
確定された字幕がすぐに流れないように過去ログを一定時間連結表示する。
Overflow機能を有効にする。(ON:する / OFF:しない)
デフォルト:OFF
字幕を維持対象にするまでの時間。(ミリ秒)
デフォルト:10000
ここで指定した時間内に新たな字幕入力が発生した場合、字幕の維持が発生する。
字幕を別枠表示し続ける時間。(ミリ秒)
デフォルト:20000
ここで指定した時間内は字幕が維持される。
連結する字幕の個数。
デフォルト:2
ここで指定した個数だけ過去字幕が維持される。 この数値を超えた場合、Overflow keep timeoutの設定は無視され、生成時刻の古い字幕から消去する。
連結した字幕の表示残り時間を確認する間隔を決定する指標値。
デフォルト:3
ここで指定した回数、Overflow keep timeoutの時間内に字幕の表示残り時間をチェックする。
数値が高いほど正確な時間を刻めるが、負荷も上がるので環境に合わせて適宜調整する。
母国語の字幕の連結子を指定する。
デフォルト:。
外国語の字幕の連結子を指定する。
デフォルト:.
Discordに字幕と同じ文章をロギングする機能。
この機能はGoogleScriptApp経由でDiscordのWEBHOOKを呼び出すようにしている。
LiveLog機能を有効にする。(ON:する / OFF:しない)
デフォルト:OFF
DiscordのWEBHOOKを呼び出す実装をしたGASのAPIキー。
デフォルト:なし
実装サンプルは下記参照。
function doGet(e) {
var p = e.parameter;
const WEBHOOK_URL = "https://discord.com/api/webhooks/" + p.param1 + "/" + p.param2; //取得したWebhookURLを追加
const payload = {
username: p.name,
content: p.text + "(" + p.translated + ")",
};
UrlFetchApp.fetch(WEBHOOK_URL, {
method: "post",
contentType: "application/json",
payload: JSON.stringify(payload),
});
}
DiscordのWEBHOOKのURLの一部を設定する。
https://discord.com/api/webhooks/**Param1**/**Param2**
デフォルト:なし
Emotion機能を有効にする。(ON:する / OFF:しない)
RFTIMとの連携を想定しているが、WebSocket経由であれば他のアプリと連携も可能。
デフォルト:OFF
Websocketでcloud.achex.caに接続するためのキー。
KeyはURLの一部(wss://cloud.achex.ca/rtaw${key})とログインユーザー名に使用する。
デフォルト:なし
それぞれの感情に対する、PitchとRateの増減を指定する。
デフォルト:0
- 各項目はパスワード以外クライアントPCに保存し、パスワードのみ画面を閉じると削除する。