macのSoundflowerとLadioCastを同じことをWindowsでもしたかった
macで、たとえばSkypeでBGMを流しながら話すとか、Skypeの自分の声と相手の声を録音するとか、
そういうことをするための定番のやり方は、
Soundflowerで仮想オーディオデバイスを追加してLadioCast.appのミキサーで出力と入力の経路を設定するやり方である。
これをWindows7でもやりたかったのでそのメモ。
ググるとすぐ出てくる、標準の「ステレオミキサー」はなぜか入っていなかった。
仮想オーディオデバイス
http://netduetto.net/download/
NETDUETTO βをインストールする。
今回は本体の機能ではなく、くっついてくる仮想オーディオデバイスだけ使うので、インストールできれば起動はしなくてもよい。
ミキサー
【デスクトップ&ビデオキャプチャ】 旧版 アマレコTV Live アマミキ!
動画配信や実況動画の作成に使うソフトだけど、同梱されている「アマミキ」が一番簡単だった。
AmaMix.exe を実行する。
設定画面
簡単だった。
ありがとうございます。
Spy++(spyxx.exe)をインストールしたよメモ
Windows7です。
前回のエントリにおいて、VOICEROID2プロセスにキーコードを送るために、ウィンドウハンドルやその中の構造を知る必要があった。
こういうときは、MicrosoftのSpy++を使えば良いようだ。
https://msdn.microsoft.com/ja-jp/library/dd460756.aspxmsdn.microsoft.com
と思ったのだがどこにもSpy++をダウンロードするリンクがない。
Visual Studio 2017のツールとして存在しているようだ。
(これだけのためにごついアプリを入れないといけないのもなんかアレだが)
Visual Studio Community 2017をダウンロードしてインストールした。
インストールしただけだとSpy++は入っていないので、別途インストールする。
「ツール(T)」→「ツールと機能を取得(T)...」を選んで、 出て来るUACを「はい」する。
これは「すべてのプログラム」の中にも入っている「Visual Studio Installer」を起動しているだけっぽい。
起動したら、「個別のコンポーネント」タブを選択して、以下を選択して、「変更」する。
- Visual Studio C++ コア機能
- .NET Framework 4.7 SDK
- Visual C++ 2017 再頒布可能パッケージの更新プログラム
完了したらVisual Studio 2017は全部閉じて、エクスプローラから以下に降りる。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools
spyxx.exeを見つけてショートカットを作ってデスクトップに持ってきていつでも使えるようにする。
これでオッケー
参考
ありがとうございます。
Go言語でVOICEROID2を操作してみたかった(Windows7)
Go言語を初めてWindowsで使ったよ、初めてWindowsのAPIを使ったよメモ。(Windows7です)
VOICEROID2(結月ゆかり)を買ったので、なんとかして色々連携させてみたかった。
- 出版社/メーカー: AHS
- 発売日: 2017/06/09
- メディア: エレクトロニクス
- この商品を含むブログを見る
画面スクショ
うまくいった方法
喋らせたい文字をクリップボードに入れておいて、Ctrl+Vで貼り付けて、F5キーショートカットで再生して喋らせるやり方。
なんとかできたけど、いろいろ制約ができてしまった。
逆にうまくいなかった方法
SendMessage()やPostMessage()で文字を送ったり制御コードを送るやり方。
たぶんこちらの方が正攻法だと思うのだけど…。
なんでうまくいかなかったかはちょっとよくわからなかったです…。
VOICEROID2にCtrl+Vするコード
package main import ( "fmt" "syscall" "github.com/AllenDang/w32" ) const voiceroid2WindowTitle = "VOICEROID2" var mainHwnd w32.HWND func init() { // ウィンドウタイトルからVOICEROID2のウィンドウハンドルを取得する mainHwnd = findWindow(voiceroid2WindowTitle) if mainHwnd == 0 { mainHwnd = findWindow(voiceroid2WindowTitle + "*") if mainHwnd == 0 { panic("cannot find window of VOICEROID2") } } } func findWindow(wName string) w32.HWND { return w32.FindWindowW(nil, syscall.StringToUTF16Ptr(wName)) } func SayYukari() { w32.SetForegroundWindow(mainHwnd) ctlDown, ctlUp := inputKeys(w32.VK_CONTROL, 0x001D) bsDown, bsUp := inputKeys(w32.VK_BACK, 0x000E) aDown, aUp := inputKeys(0x0041, 0x001E) vDown, vUp := inputKeys(0x0056, 0x002F) f5Down, f5Up := inputKeys(w32.VK_F5, 0x003F) ipts := []w32.INPUT{ // Ctrl + A ctlDown, aDown, aUp, ctlUp, // BackSpace bsDown, bsUp, // Ctrl + V ctlDown, vDown, vUp, ctlUp, // F5 f5Down, f5Up, } ret := w32.SendInput(ipts) fmt.Println("w32.SendInput result:", ret) } func inputKeys(vk, scan uint16) (w32.INPUT, w32.INPUT) { down := w32.INPUT{ Type: w32.INPUT_KEYBOARD, Ki: w32.KEYBDINPUT{ WVk: vk, WScan: scan, }, } up := w32.INPUT{ Type: w32.INPUT_KEYBOARD, Ki: w32.KEYBDINPUT{ WVk: vk, WScan: scan, DwFlags: 0x0002, }, } return down, up }
だめだったパターン…
// Aを送る w32.SendMessage(mainHwnd, w32.WM_KEYDOWN, 0x0041, 1) w32.SendMessage(mainHwnd, w32.WM_KEYUP, 0x0041, 0x6000001)
やってみたメモ
WindowsのAPIを使ったといっても、 AllenDang/w32 を使わせてもらっただけである。
幸いこの中にあるものだけでうまくできた。
KEYBDINPUT構造体を押したいキーの分だけ作って、SendInput()で送る。
バーチャルキーコード(wvk)は、msdnのページを見たり、よくあるやつ(Aは41とか)ですぐわかったけど、スキャンコード(wscan)はよくわからなかったので、spy++で実際に送られてる中身を覗き見てそれをそのまま使った。
SendInput()はSendMessage()などと違って、ウィンドウハンドルを指定できない。
つまりその時点でアクティブになっているウィンドウに対してキーが送られる。
なので、邪道な感じだけど、喋らせるときにVOICEROID2ウィンドウをSetForegroundWindow()でアクティブにしている。
更に邪道な感じで、Ctrl+Vがうまく動くためには、テキスト入力枠にフォーカスが当たってCtrl+Vが押せる状態でなければならない。
(これどうしたらいいんだろうか?)
VOICEROID2は中身が一個のウィンドウっぽくて、メモ帳で試したときとは違い、入れ子のウィンドウになっていなかった。メモ帳は"Edit"というクラス名の子ウィンドウにキーをSendMessage()すれば動いた。VOICEROID2には唯一の親ウィンドウに送ればいいということかと思ったが、そういう感じでもないっぽい? よくわからなかった。
参考URL
- GitHub - AllenDang/w32: A wrapper of windows apis for the Go Programming Language.
- FindWindow 関数
- SendInput 関数
- GetLastError 関数
- PostMessage 関数
- https://msdn.microsoft.com/ja-jp/library/cc411022.aspx;title
- KEYBDINPUT structure (Windows)
- Virtual-Key Codes (Windows)
- Simulating a Ctrl-V keystroke in Win32 (C or C++) using SendInput | ad hocumentation • n. fast, instinctive documentation of ideas and solutions.
- C言語でwin32apiを使ってnotepadにpostmessageでcontrol aを送りたいが方法が分からない。