PulseAudioでSSHサーバ側の音声をクライアント側で再生する

RDPと違い、VNCでは接続先の音声を送れないことがある。 接続先のデスクトップ(SSH・VNCサーバ)で再生された音声をSSH経由で送信し、SSH・VNCクライアント側で再生できるようにする。 https://raspberrypi.stackexchange.com/questions/8621/how-to-set-up-a-pulseaudio-sink https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-tunnel-sink-new module-tunnel-sink-newの実装はすでにmodule-tunnel-sinkで動くようになっている(pulseaudio 13.99.1) 音声を受け取る側(SSH・VNCクライアント、PulseAudioサーバ) 受信側 /etc/pulse/default.pa load-module module-native-protocol-tcp auth-ip-acl=127.0.0.0/8 load-module module-null-sink sink_name=DummyOutputRemote0 sink_properties=device.description="DummyOutputRemote0" load-module module-loopback source=DummyOutputRemote0.monitor source_dont_move=true DummyOutputRemote0に対して音声が送られてくる。 DummyOutputRemote0.monitorで入力として音声を拾うこともできる。 受信側 ~/.ssh/config Host your-server # VNC LocalForward 15900 localhost:5900 # PulseAudio RemoteForward 14713 localhost:4713 音声を送る側(SSH・VNCサーバ、PulseAudioクライアント・サーバ=中継用) 送信側 /etc/pulse/default.pa load-module module-tunnel-sink sink_name=Remote server=tcp:127.0.0.1:14713 sink=DummyOutputRemote0 PulseAudio再起動(pulseaudio -k)後、 接続先のデスクトップ上で音声出力デバイス(Sink)をDummyOutputRemote0に設定する。 DummyOutputRemote0が表示されない場合、どこか設定が間違っていると思われる。 電源メニューから音声デバイスを変更できるようにするGNOME拡張 https://extensions.gnome.org/extension/906/sound-output-device-chooser/

2021年10月9日 · aoirint

VOICEVOX Core 0.5.1をUbuntu + GPU + Pythonで使う(exampleを動かすまで)

※ VOICEVOX Coreにより生成した音声の利用にあたっては、VOICEVOX Coreの添付文書・利用規約を必ず確認し、従ってください。 https://github.com/Hiroshiba/voicevox_core Ubuntu 20.04.3 LTS (Focal Fossa) Python 3.9.6 (pyenv) NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 cuDNN 8.2.4 VOICEVOXを使った音声合成について VOICEVOXの音声合成の仕組みについては、以下の記事が参考になるかもしれません。 VOICEVOXの音声合成エンジンの紹介 | Hiho’s Blog VOICEVOX Coreを効果的に使うには、ある程度音声合成の専門知識が必要になると思います。 簡易にTTSを利用したい場合には、VOICEVOX EngineのHTTP APIを使うことをおすすめします。 voicevox_engine API Document VOICEVOX Engineは、公式Dockerイメージが公開されています。 https://github.com/Hiroshiba/voicevox_engine https://hub.docker.com/r/hiroshiba/voicevox_engine VOICEVOX Coreのインタフェースについて Details わたしは音声合成については素人ですが、参考のため現在の理解を書いておきます。 VOICEVOX Coreでは、 「音素ごとの長さの推定 replace_phoneme_length / yukarin_s_forward」、 「モーラごとの音高の推定 replace_mora_pitch / yukarin_sa_forward」、 「音声波形の推定 synthesis / decode_forward」の3つの深層学習モデルを使って音声合成します。 OpenJTalkには、辞書に基づいてテキストを解析し、アクセント句・モーラ・アクセント位置・疑問文フラグなどの情報で構成された フルコンテキストラベルというデータに変換する機能があります。 フルコンテキストラベルの仕様は、以下のURLを開き、 HTS-2.3 > Speaker dependent training demo > Japanese > tar.bz2からHTS-demo_NIT-ATR503-M001.tar.bz2をダウンロード・展開し、 data/lab_format.pdfを見ると英語で記述されています。 ...

2021年9月11日 · aoirint

SendGrid

背景 Discourseをセットアップしようとしていたところ、いくつかのEmailプロバイダが紹介されていた。 https://github.com/discourse/discourse/blob/4e0a43f2117ac83bcf7e0f9bed65370f6c4c15bb/docs/INSTALL-email.md Mailgun SendGrid Mailjet Elastic Email Discourseはセットアップにメールサーバが要求される。以前のMastodonのセットアップでは、Gmailとアプリパスワードを使った簡易セットアップを使ったが、経験積みとセキュリティ上の懸念から、今回はメールサーバを用意することにした。 名前を聞いたことのあるSendGridを使う。業務上の利用を想定しているようだが、個人による利用として続行する。スケールする商用サービスでの利用ではないが、利用経験は技術選定の上で大事だと思う。その分、Abuseしないように考えなければならないが。 Freeプラン https://sendgrid.com/pricing/ 1日に100メールまではFreeプランが使用できる。自分しか使わない、またはごくごく小規模な利用では十分だろう。 登録 https://sendgrid.com/ Start For Freeから登録する。 細かい登録の過程は省略する。 ドメインの認証 ダッシュボードを開く。 https://app.sendgrid.com/ https://app.sendgrid.com/settings/sender_auth/domain/create ドメインプロバイダ(DNSホスト)の選択を求められる。 お名前.comはリストになかったので、Other Host (Not Listed)を選択し続行する。 あまり意味はないだろうが、Which DNS Hostにプロバイダ名を書いておく。 ドメイン名を入力する。 DNSサーバに登録すべき認証用のレコードが表示される(DNSサーバにクエリを送れば誰でも確認できるので公開情報)。 ドメインプロバイダ/DNSサーバでDNSレコードを設定する。 設定が反映されるまでしばらく待つ。 ドメインが認証された。 これでSendGridを使って、このドメインからのメールを送信できるようになった。 APIキーの発行(送信テスト) https://app.sendgrid.com/guide/integrate Web APIを選択する。 プログラミング言語/利用プログラムを選択する。チュートリアルの出し分けをするだけで、ここでの選択に特に意味はないと思われる(チュートリアルなしでAPIキーを発行もできる: https://app.sendgrid.com/settings/api_keys)。 とりあえずcURLでテストすることにして、APIキーを発行する。 下のcurlコマンドの送信JSONデータを編集する。 toを自分のメールアドレス、fromを認証したドメインのメールアドレスに変える。 特にfromのメールアカウントを作成する必要はなく、 [email protected]のように適当なアカウント名をつけたアドレスを使えばよい。 コマンドを適当な端末で実行し、メールが届けば成功。 SendGrid上でも送信成功を確認できる。

2021年9月11日 · aoirint

WebDAV in Docker

https://github.com/aoirint/webdav-docker https://hub.docker.com/r/aoirint/webdav 以下のリポジトリをforkし、Windows 10のExplorerクライアントに対応させたDockerイメージ。 Apache Web ServerのDAV機能でWebDAVサーバを立てる。 https://github.com/BytemarkHosting/docker-webdav docker-compose.yml version: '3.9' services: webdav: image: aoirint/webdav:2.4-20210822c restart: always ports: - '${DAV_PORT:-127.0.0.1:8000}:80' environment: LOCATION: /webdav ANONYMOUS_METHODS: OPTIONS AUTH_TYPE: Basic USERNAME: ${DAV_USERNAME:-user} PASSWORD: ${DAV_PASSWORD:-password} # SKIP_CHOWN: 1 volumes: - ./dav:/var/lib/dav 以上の設定で、dav://127.0.0.1:8000/webdavにWebDAVサーバが立つ。 データは./dav/dataに格納される。 Optional: /etc/fstab シンボリックリンクは動作しないので、bindfsを使う。 sudo apt install bindfs fuse-utils /src/path /dest/dav/data/path fuse.bindfs rw,user,uid=YOURUSER 0 0 https://www.netfort.gr.jp/~tosihisa/notebook/doku.php/bindfs

2021年8月22日 · aoirint

SmokePing in Docker

https://hub.docker.com/r/dperson/smokeping Copy Configs docker run --name smokeping --rm -d dperson/smokeping:latest docker cp smokeping:/etc/smokeping ./config docker rm -f smokeping docker-compose.yml version: '3.9' services: smokeping: image: dperson/smokeping:latest restart: always ports: - '{SMOKEPING_PORT:-127.0.0.1:8000}:80' volumes: - './config:/etc/smokeping:ro' - './data:/var/lib/smokeping' environment: TZ: Asia/Tokyo config/config.d/Targets *** Targets *** probe = FPing menu = Top title = Network Latency Grapher remark = Welcome to the SmokePing website of xxx Company. \ Here you will learn all about the latency of our network. + Home menu = Home title = Home Network #parents = owner:/Test/James location:/ ++ Router menu = Router (192.168.0.1) title = Router (192.168.0.1) host = 192.168.0.1 ++ MyServer menu = MyServer (192.168.0.2) title = MyServer (192.168.0.2) host = 192.168.0.2 #alerts = someloss

2021年8月22日 · aoirint

ファイル変更時にコマンド実行(watchmedo, watchexec)

watchmedo (watchdog) https://github.com/gorakhargosh/watchdog https://pypi.org/project/watchdog/ watchmedo shell-command -R --command 'make build' ./src # プロセスが動いていても停止して再実行する watchmedo auto-restart -R -d ./src -- make serve watchmedo インストール pip3 install watchdog[watchmedo]==2.1.3 ※ 2.1.4 on Ubuntuはバグがありそう Exception in thread Thread-1: Traceback (most recent call last): File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/threading.py", line 973, in _bootstrap_inner self.run() File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/observers/api.py", line 199, in run self.dispatch_events(self.event_queue, self.timeout) File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/observers/api.py", line 372, in dispatch_events handler.dispatch(event) File "$HOME/.pyenv/versions/3.9.6/lib/python3.9/site-packages/watchdog/events.py", line 282, in dispatch self.event_dispatch_map[event.event_type](event) AttributeError: 'RootHandler' object has no attribute 'event_dispatch_map' watchexec https://github.com/watchexec/watchexec https://crates.io/crates/watchexec-cli https://superuser.com/questions/181517/how-to-execute-a-command-whenever-a-file-changes watchexec -w ./src -- make build # プロセスが動いていても停止して再実行する watchexec -r -w ./src -- make serve # 初回実行しない watchexec -p -w ./src -- make event-trigger watchexec インストール Rustのインストール https://www.rust-lang.org/ja/learn/get-started curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh watchexecのインストール cargo install watchexec-cli

2021年8月22日 · aoirint

Terraria TShockサーバをdocker-composeで立てる

https://github.com/Pryaxis/TShock https://hub.docker.com/r/ryshe/terraria/ 上記URLから最新(もしくは対応する)バージョンを確認して、イメージタグのバージョンを変更する。 既存のワールドを使用する場合は、./data/worlds/に.wldファイルを配置し、WORLD_FILENAMEを変更する。 docker-compose.yml version: '3.9' services: terraria: image: ryshe/terraria:tshock-1.4.2.3-4.5.5 tty: true stdin_open: true restart: always ports: - '7777:7777' volumes: - '${WORLD_DIR:-./data/worlds}:/root/.local/share/Terraria/Worlds' - '${LOG_DIR:-./data/logs}:/tshock/logs' - '${BACKUP_DIR:-./data/backups}:/tshock/backups' - '${PLUGIN_DIR:-./data/plugins}:/plugins' environment: TZ: 'Asia/Tokyo' WORLD_FILENAME: 'MyWorldName.wld' ワールドの新規作成 autocreateオプションにはワールドサイズを数値で指定する(1: Small, 2: Medium, 3: Large)。 ここではSmallを指定している。 環境変数WORLD_FILENAMEが設定されていると実行に失敗するので、-e WORLD_FILENAME=で外しておく。 docker-compose run --rm -e WORLD_FILENAME= terraria -world /root/.local/share/Terraria/Worlds/MyWorldName.wld -autocreate 1 作成完了後、サーバが起動し、サーバコンソールが開く。 バックグラウンド起動にするため、ここでは一旦サーバを停止しておく。 サーバの起動 docker-compose up -d docker-compose logs -f tail -f data/logs/*.log サーバコンソールを開く Dockerコンテナ名を調べる。ここでは、tshock_terraria_1とする。 docker-compose ps 以下コマンドでサーバコンソールが開く。 Ctrl+cするとサーバが停止してしまうので、脱出するときはCtrl+p Ctrl+qを押す。 docker attach tshock_terraria_1 設定・権限の変更 TShockにはバニラと異なる細かいデフォルト設定や権限機能があるので注意。 設定では、デフォルトで初期スポーン地点保護が有効化、墓生成が無効化されている。 権限では、デフォルトでNPCの部屋割り当て、ボス召喚などが無効化されている。 また、TShockのバージョンによってコマンドや設定方法に差異がある。 ...

2021年8月22日 · aoirint

GitHub Actions, DockerイメージをビルドしてDocker Hubにpushする(アクセストークン)

Docker Hubにアクセストークンを追加する。 https://hub.docker.com/settings/security リポジトリのSettingsから、Secretsを開き、New repository secretから DOCKER_USERNAME、DOCKER_PASSWORDを追加する。 DOCKER_USERNAMEはDocker Hub上のユーザ名、 DOCKER_PASSWORDはアクセストークンを設定する。 以下のファイルをリポジトリに追加する(ファイル名docker.ymlは変更可)。 mainブランチにgit pushされたとき、Dockerイメージのビルドが走り、イメージがDocker Hubにdocker pushされる。 .github/workflows/docker.yml name: Push to Docker registry on: push: branches: - main jobs: push: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Login to Docker Hub uses: actions-hub/docker/login@master env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} DOCKER_REGISTRY_URL: docker.io - name: Build :latest if: success() run: docker build -t username/imagename:latest . - name: Deploy :latest if: success() uses: actions-hub/docker@master with: args: push username/imagename:latest

2021年7月10日 · aoirint

GoogleサービスのURLでユーザアカウントを指定する(?authuser=email)

Googleサービスでは、URL中の/u/0/や/u/1/の数値部分を書き換えることで、ログイン順に基づいてユーザの切り替えができる。しかし、ログイン順の異なる端末間でURLをブックマークしたい場合などに不便である。 メールアドレスを指定してユーザを切り替えるには、 URLのGETパラメータに[email protected]のようにGoogleアカウントのメールアドレスを記述する。 Google Classroom https://classroom.google.com/c/[email protected] Gmail https://mail.google.com/[email protected]

2021年7月1日 · aoirint

Makefile Tips

Makefileのあるディレクトリの絶対パスを取得する $(pwd)や相対パスでは、makeコマンドの実行ディレクトリが基準になってしまう。Makefileの実体があるディレクトリを基準としたいときは、以下のようにROOT_DIRを定義する。 ROOT_DIR = $(dir $(realpath $(firstword $(MAKEFILE_LIST)))) エラー時に処理を続行する コマンドの前に-(ハイフン)をつける。 .PHONY: cmd cmd: ls -fail_command a b c ls インデントはスペースではなくタブを使う vimrcでset expandtabしている場合にひっかかる。 以下で一時的に解除するか、vimrcでset expandtabするのをやめる、もしくはvimrcでファイル名による分岐で設定する。 :set noexpandtab .vimrc set expandtab let _filename = expand('%:r') if _filename == 'Makefile' set noexpandtab endif vimでMakefileだけTabスペースではなくTabとして入力する - Qiita ファイルの存在に関係なくターゲットを実行する Makeは本来Cのコンパイルなどに使うとき、ターゲット名に一致するファイルが存在している場合に処理をスキップするようになっている。 一方で、buildというターゲット名を使って、呼び出しのたびにコマンドを実行したいが、buildディレクトリが存在するような場合に困る。 スキップさせないようにするには、.PHONY: ターゲット名を記述する。 .PHONY: cmd cmd: ls 複数のコマンドを1つのシェルで実行する cmd: echo Hello;\ VAR=World;\ echo $$VAR .ONESHELL: cmd cmd: echo "Hello" VAR=World echo $$VAR 途中のコマンドの終了ステータスを返す https://stackoverflow.com/a/44324918 .ONESHELL: cmd .PHONY: cmd cmd: sh -c 'exit 123' EXIT_CODE=$$? echo "Exit code: $$EXIT_CODE" exit $$EXIT_CODE

2021年7月1日 · aoirint