Arduino導入時のメモ

エラー対応

Switch Control Libraryに関するエラー

解決策:v1を使用する。v2とv1は互換性が無いため

error: 'nothrow_t' in namespace 'std' does not name a type~

解決策:"Arduino AVR Boards"のバージョンを1.8.2へダウングレードする
参考URL:https://teratail.com/questions/271735

  • コントローラとして反応しない

boards.txtが編集できていない。
編集する対象は、「C:\Users\[ユーザー名]\AppData\Local\Arduino15」とか
「C:\Users\[ユーザー名]\Documents\ArduinoData\」とかにある。
また、ちゃんと編集できたか確認する場合は
マイコンがつながっている状態で「Arduino IDE」の「ツール」>>「ボード情報を取得」を選択。
うまく書き込めていれば0x0f0d、0x0092と表示されるはず。

  • PC側でFTDIモジュールを認識しない

解決策:デバイスマネージャからドライバーを更新する。
参考URL:http://0918.jp/wp/post-1079/


以上。

C#でOBSを操作する

いろいろ自動化したかったので、OBSをC#から操作する方法を調べました。
その備忘録です。
だいたいみんなPythonなんですかね?
※OBS、obs-websocketはインストールしているものとする。

必要なもの・準備するもの

https://www.nuget.org/packages/obs-websocket-dotnet/

⇒2019のCommunity(Version 16.10.0)でやりました

obs-websocket-dotnetのインストール

パッケージマネージャコンソールで下記を入力して、実行

Install-Package obs-websocket-dotnet -Version 4.9.0

OBS側の設定

[ツール]タブから「Websocketサーバー設定」
サーバーポートとパスワードを設定
f:id:YaliYalice:20210606232712p:plain

C#で実装

要所要所だけ。。。

  • OBSへ接続
OBSWebsocket obs;
obs = new OBSWebsocket();
obs.Connect(”ws://127.0.0.1:4444”, "パスワード");

Connect関数の第1引数の末尾"4444"はOBS側で設定した「サーバーポート」を書くこと。
第2引数"パスワード" もOBS側で設定したものを入力すること

Connectした後に下記関数を呼ぶとスクリーンショットが撮れる。

obs.TakeSourceScreenshot("ソース", "画像の拡張子", "ファイルパス");

第1引数のソースはOBS側のソース名 ※下記画像参照
第2引数の画像の拡張子は"jpg"、"png"などなど ※第3引数でファイルパスを書けばnullでもOK
第3引数のファイルパスは"C:\test\ss\hoge.png"こんな感じでファイル名まで書くこと。
f:id:YaliYalice:20210606234131p:plain

あとは煮るなり焼くなり好きにしよう。

実況動画制作を自動化したい② ~Softalk編~

面倒くさいことをやりたくないため、省エネに全力を尽くすのです。
お世話になります。
前回に引き続き自動化の記事です。

先日ひさびさ(?)にSoftalkを使用した実況動画(いわゆるゆっくり実況)を作りました。
生声よりも手間がかかるんじゃねって思っていましたが、仕組みさえ作っていればゆっくり実況のほうが楽でした。

作業内容の比較

~生声実況の場合~

①録音した音声を編集
 →音量調整
 →ノイズ低減(ホワイトノイズ、リップノイズ、マイクボフボフなど)
 →いらんところのカット
②動画と合わせてタイミングを調整
→1試合あたり約40分

~ゆっくり実況の場合~

Softalkで音声ファイルを作成 ★
②動画と合わせてタイミングを調整
→1試合あたり約25分

★のところが今回自動化したところです。
自動化すれば生声実況に比べ15分も短縮できます!

Softalk自動化

皆さんはSoftalkって使ったことはありますか?
そう!こんな感じのGUIです。
f:id:YaliYalice:20210129220016p:plain
テキストスペースに文章を入力し、下の方にある再生ボタンを押すとおなじみのあの声で、入力された文章をしゃべってくれます。
赤い方のボタンを押すと音声ファイルとして書き出すこともできます。
さくっと使えてすごく便利ですが、実況動画を作成するときは台本の文章を1行ずつ、いちいち手動でコピペ&録音を繰り返さないといけません。
これがとても面倒くさい。
ということで自動化してみました。

自動化の指針

GUIの自動化は難しいなあと思っていましたが、Softalkはなんとコマンドラインから実行できるようです。
こんな感じで実行できます↓ (「自動化できそう」としゃべってくれます)

C:\SofTalk.exe /W:自動化できそう

ということで、以下の手順でプログラムを組んでやれば自動化できるわけですね。

  • 台本から文章を1行抽出する
  • "/W:"引数に文章を指定
  • 台本の最終行まで上記を繰り返す

台本をエクセルに書くことが多いので、今回はエクセルマクロでさくっと実装しました。
テキストファイルに書いて、バッチファイルかなんかで読ませるとかでもいいと思います。

Softalkの引数について

今回使用したものだけ挙げます。詳しくはSoftalk付属のヘルプファイルをご覧ください。

引数 説明
/NM: 声の種類の指定(女性01とかロボットとか)
/O: 音程パラメータ
/S: 速度パラメータ
/V: 音量パラメータ
/X: 画面表示の有無(0:表示 1:非表示)
/R: 録音した音声ファイルの保存先の指定
(C:\result\hoge.wav みたいなファイルパス)
/W: 読み上げる文章

つまずいたところ

  • "/W:"引数の指定は最後にしよう

/W:"以降の文字をすべて読み上げ対象とする仕様なので、最後に書かないと引数指定がそのまま読まれちゃいます

NG:C:\SofTalk.exe /W:自動化できそう /O:120

→"/O:120"も読み上げられちゃう!

  • 録音が終了したらcloseオプションを実行しよう

closeオプションを実行しないと、SoftalkGUI操作ができなくなってしまいます。

C:\SofTalk.exe /close

おまじないみたいなもんですね。

課題

  • 間違いの訂正が面倒

→個別でGUIから訂正した
 →読み登録である程度回避できる
  →誤字脱字は知らん

  • 出力した音声ファイルを動画編集ソフトに読み込ませるのが結局手動

→音声ファイルを結合させるフリーソフトで対応?
 →Aviutlにはファイル一括読み込み用のプラグインあり

最後に

似たようなのがすでにありましたわ。。。
www.nicovideo.jp

以上です。
次は何を自動化しようか。

実況動画制作を自動化したい① ~GIMP編~

面倒くさい。ホントに面倒くさいんですよ。
動画作るの。。。
いつもお世話になっております。

 

動画制作が面倒くさすぎてどれだけ時間がかかっているのかざっくりまとめてみました。

f:id:YaliYalice:20210103202832p:plain

最速で8時間ですね。。。
これを週2は結構きついです。

どっか自動化できそうなところはないかと探しました。

f:id:YaliYalice:20210103203035p:plain

今回はNo.3の「素材用意」について自動化してみようと思います。
素材というのは、選出画面で使用してるこんなやつ↓です。

f:id:YaliYalice:20210117223758p:plain

ポケモンの画像と角が丸い四角形を組み合わせて作ります。
この画像はGIMPという画像編集ソフトで作っているのですが、GIMPスクリプト(python)で処理の自動化ができるようです。

ということで今回はGIMPの作業を自動化してみようと思います。

どんな作業をしているのか?

素材を作るときの手順はこんな感じです。

  1. ポケモンの画像をGIMPに読み込ませる
  2. 1で読み込ませた画像の大きさ・位置を調整する
  3. 角丸四角形からはみ出た部分をトリミングする
  4. 青色の角丸四角形と合わせてエクスポートする
  5. 黄色の角丸四角形と合わせてエクスポートする
  6. 2のポケモンの画像をグレースケール化する
  7. 黒色の角丸四角形と合わせてエクスポートする

赤字で書いているところが自動化できそうな作業です。

GIMPPythonで操作する

こちら(※1)を参考にGIMPPythonで操作してみました。

まずは、画像のトリミングです。
トリミングのGUI手順としては、、、
①角丸四角のレイヤーの不透明範囲を選択する
②選択範囲を反転する
ポケモンの画像を読み込ませたレイヤーをアクティブにする
④選択範囲を削除する

# 選択範囲を一度クリア
pdb.gimp_selection_none(image)
# 不透明範囲の選択
pdb.gimp_image_select_item(image, 0, base_layer)
# 選択範囲の反転
pdb.gimp_selection_invert(image)
# 選択範囲を削除
pdb.gimp_edit_clear(target_layer)
# 選択範囲をクリア
pdb.gimp_selection_none(image)

 ※ base_layer::角丸四角が描画されているレイヤー
   target_layer:ポケモンの画像を読み込ませたレイヤー

 

次に角丸四角形(青色、黄色、黒色)と合わせてpngファイルとしてエクスポートします。

GUI手順としては、、、
①合わせてエクスポートする角丸四角形(青色、黄色、黒色)のみ可視化する
②「ファイルタブ>名前を付けてエクスポートボタン」を実行

これだけなのですが、pythonでエクスポートする場合レイヤー単位でしかエクスポートできないようで、一工夫必要です。

# エクスポートするレイヤーの可視化
pdb.gimp_layer_set_visible(layer, TRUE)

# レイヤーを合体するため画像を複製する
new_image = pdb.gimp_image_duplicate(image)
# レイヤーを合体する
mergelayer = pdb.gimp_image_merge_visible_layers(new_image, CLIP_TO_IMAGE)

# エクスポートする
pdb.file_png_save2(new_image, mergelayer, filename, filename, 0,9,0,0,0,1,1,1,0)
# 複製したした画像を破棄
pdb.gimp_image_delete(new_image)
# レイヤーの不可視化
pdb.gimp_layer_set_visible(layer, FALSE)

レイヤーを合体するというのがポイントです。
レイヤーをそのまま合体させてしまうとエクスポートするたび角丸四角形を読み込ませないといけないので、いったん画像ごと複製しています。
複製した画像上でレイヤーを合体、合体したレイヤーをエクスポートという流れです。

 

最後にグレースケール化です。

GUI手順では、、、
①「色タブ>色相-彩度」を実行
②「彩度」パラメータを-100にする

pdb.gimp_drawable_hue_saturation(layer, 0, 0.0, 0.0, -100, 0.0)

これは非常に簡単で関数を一個呼ぶだけです。
引数は頭から、"描画領域(レイヤー指定でOK)", "調整する基準色", "色相", "輝度", "彩度", "オーバーラップ" です。
GUIの画面と見比べるとわかりやすいですね。

f:id:YaliYalice:20210114000659p:plain


ちなみに使用するライブラリ関数の仕様を知りたい場合は、
「ヘルプタブ>プロシージャ-ブラウザ」から調べることができます。
上記「gimp_drawable_hue_saturation」関数の仕様を調べるとこんな感じで出てきます。

f:id:YaliYalice:20210114001032p:plain
私はめっちゃ使いましたw

 

できたもの

f:id:YaliYalice:20210117223758p:plainf:id:YaliYalice:20210117223940p:plainf:id:YaliYalice:20210117223930p:plain

 

余談 

作ったPythonスクリプトデバッグするときは下記オプションをつけてGIMPを起動すると幸せになれます。

gimp-2.10.exe --console-messages

 デバッグログの出し方はこちら

gimp.message("ここにデバッグ用の文字列")

以上。。。

 

参考

※1

maywork.net

 

 

 

新規アカウントでニコニコ動画とYouTubeに動画投稿してみた結果

明けましておめでとうございます。
新年一発目のブログが何でこれなんかわかりませんが、実験の結果がまとまりましたので報告いたします。

ここから本題。。。

よっしゃ動画投稿するぞ~、というときニコニコ動画(以下ニコ動)かYouTubeかどっちに投稿すべきか悩むことありますよね?

私はもともとニコ動出身なので動画を投稿するならニコ動一択でしたが、YouTubeの視察(?)もかねて色々実験してみました。

実験内容

ニコニコ動画YouTubeにそれぞれ新規アカウントにて動画を投稿してから、①24時間後、②1週間後、③1か月後、で再生数を比較してみました。

動画内容に変化をつける必要があると思い、ある程度のクオリティのものと適当なクオリティのものの2種類を投稿しました。
ある程度のクオリティの動画は1本のみ投稿。
適当なクオリティの動画は1週間に1本を3週間実施(つまりは、3本投稿)。

それでは結果をご覧ください。

結果:ある程度のクオリティ

f:id:YaliYalice:20210101001548p:plain

結果:適当なクオリティ

f:id:YaliYalice:20210103154921p:plain



感じたこと

ニコ動は初動、その後の伸びはまあまあ良さげ。
ただ動画を投稿していくごとに再生数減少の傾向がみられる。
継続して動画を投稿することが実になるか?というと微妙な手ごたえ

YouTubeは初動も伸びも絶望的。
ただし、動画投稿を重ねるたびに再生数は徐々に上がっていく。
継続して動画を投稿することによってある程度伸びていきそうな気がする

 結論:単発ならニコ動、更新頻度が高いならYouTubeのほうがいいんじゃない?知らんけど。。。

終わりに

最近ニコ動に導入されたアナリティクスという機能で動画の再生数の推移やどこから動画までたどり着いたのか見られるようになりました。
YouTubeにも同様の機能があります
これを眺めていると、動画サイト内の検索から来てくれる人が多いようです。
今回はSNSでの宣伝等無しの状態だったので当然といえば当然ですが。。。

再生数を増やすための大きな手法として、SNSでの宣伝が欠かせないと思ってはいます。
しかし、TLで流れてくるリンクを踏む(受動的な視聴)場合と検索から動画までたどり着く(積極的な視聴)場合では後者の方が、投稿者目線では嬉しかったりします。※私だけかな?

他人からおすすめされた動画(or投稿者)よりも、自分が見つけた動画(or投稿者)のほうが愛着もわきやすいと思います。

ポケモンの実況動画自体が下火になってるので、わざわざ検索して探しに来てもらわないといけないわけですが、そういう人を増やすにはどうしたらいいんでしょうね
私もわかりません。

 

それでは2021年もよろしくお願いいたします。

 

ロジカル語法(~ですな、~ですぞ)のアクセント

ゆっくりボイスやボイスロイドでロジカル語法をつかうとき、発音がちょっと違うなーと思うときありますよね。

ということで、ロジカル語法のアクセントについて調べてみました。

・前提

ロジカル語法といってもいろいろあるんで、今回は「~ですぞ」「~ですな」のアクセントに注目します。

 

・アクセント

「ですぞ」「ですな」は三拍語なので、核の位置は "" になります。
つまり"すぞ", "すな"を低い音にすればよいということです。

 

SofTalkで確認してみましょう。
アクセントをつけたい場所に「'」(アポストロフィー)をつけると音程を低くできます。

 

ではお聞きください。。。

・デフォルト

「ですぞ」

「ですな」

 

・"すぞ", "すな"を低くつかせた版

「ですぞ」

「ですな」

 後者の方がいいような気がしますね!

 

・せっかくなので色々試してみた

アクセントだけでなくいろんなパターンを作ってみました。
どれが一番しっくりくるでしょう。聞き比べてみてください。

 

①アクセント無(デフォルト)※上でやったのと同じ

「ですぞ」

「ですな」

②"で”にアクセント(で↓すぞ、で↓すな)※上でやったのと同じ

「ですぞ」

「ですな」

③"す”にアクセント(です↓ぞ、です↓な)

「ですぞ」

「ですな」

 

④音節内部の上昇(ですぞ↑、ですな↑)

「ですぞ」

「ですな」

 

⑤音節内部の下降(ですぞ↓、ですな↓)

「ですぞ」

「ですな」

 

⑥"す"の無声化

「ですぞ」

「ですな」



個人的にはやっぱ②がいいかなと思います。

⑥にかんしては、だいぶ違和感ありますね。
"ぞ","な"がつくときの無声化は起こりにくいんでしょうか。

おしまい

"で"の核による音の下がりは気にしなくてもいいようなので、デフォルトでも間違ってはないと思います。
感覚の問題なので気になる人もいればそうでない人もいるでしょう。
発音やらアクセントの問題は嵌ると抜け出せなくなるので、あんまり深追いしない方がいいと思います。(経験談)
それにゆっくりやボイロは、人間ほど正確に発音できてないものと視聴者が最初から理解してくれてるので、ぶっちゃけ何もせずともOKな気がします。

 

それでは、よいロジカルライフを!

 

参考

日本語のアクセント

http://www5a.biglobe.ne.jp/~accent/accent.htm

 

ダメージ計算ツールを作る その②

なんとなく完成しました。
いつもお世話になっております。

こんな感じ ※gifです

 

f:id:YaliYalice:20200813231151g:plain

 

1つ何かを変更するたびに、ダメージ計算が走るようにしています。(アピールポイント)
結構この機能を実現するのが面倒でした。

Binding機能がうまいこといかず、なんで更新されへんねんってプンスカしてることが多かったです。
どこかしらのデータが更新される⇒関連データのプロパティの変更通知を出す、これが肝だと感じました。

また、本来の目的「対戦補助ツールの一環」を鑑みて、あらかじめ登録したデータを反映させるボタンを置いときました。
ゆくゆくは登録する画面を用意して、そこに入力したものをダメ計画面に反映させる、そんな構想でいます。

 

f:id:YaliYalice:20200813232239g:plain

最終的にMVVMの思想が崩れて(?)、ViewModelとModelが合体したような形になってしまいましたが、今回のように入力完了と同時に処理を走らせるようなアプリってどう切り分けるのが正解なんでしょう。

本チャンのツール作るまでにもうちょっと勉強しておきます。