目的
Amazon Echoのようなデバイスを買うのが勿体無いので、SDKのサンプルアプリを使って余ってるWindows PCをAlexa搭載デバイスとして動かしてみたかった。
注意:設定ファイルの作成に必要となるconfig.jsonはAmazonの開発者ポータルサイトのAlexa Voice Serviceのページの「製品」リンク→登録済みの製品名→セキュリティプロファイル→他のデバイスやプラットフォーム→ダウンロード、をクリックするとダウンロードできるが、現在は新規にAVS商品を追加できなくなっている(AVSの一般提供は終了しているらしい)。ただし、過去に登録済みのAVS商品があれば、config.jsonがダウンロード可能なので、今回はそれを使用した。
事前準備
必要な機器
- WIndowsPC(今回はWindows11搭載PCを使用)
- マイク、スピーカー(今回はマイク搭載のBluetoothヘッドホンを使用)
必要なソフトのインストール
- Visual Studio 2017(「ワークロード」タブでC++によるデスクトップ開発とユニバーサルWindowsプラットフォーム開発を追加)
- cmake v3.26(新しすぎるとcmakeの互換性でエラーになる)
- gstreamer v1.28.4(インストールするものはデフォルトのまま)
- vcpkg(curl、sqlite3、opensslなどをvcpkgでインストールする。静的リンク版を指定。curlはhttp2対応を含むものが必要。)
.\vcpkg.exe install "curl[http2]:x64-windows-static" --recurse
- Python(サンプルアプリ起動時に指定する設定ファイルの生成で使用)
環境変数の設定
PKG_CONFIG_PATH
set PKG_CONFIG_PATH=C:\gstreamer\1.0\msvc_x86_64\lib\pkgconfig;%PKG_CONFIG_PATH%
PATH
- C:\Program Files\dotnet
- C:\Program Files\CMake\bin
- C:\Users\tempm\myfiles\develop\vcpkg
- C:\gstreamer\1.0\msvc_x86_64\bin
- C:\Users\tempm\myfiles\develop\avs\portaudio\Release
ソースコードのダウンロードとビルド用ディレクトリの作成
git clone https://github.com/alexa/avs-device-sdk.git
cd avs-device-sdk
git checkout v3.0.0
cd ..
mkdir build
ソースコードの修正
CMakeList.txtに以下を追加
# platform.winmdの検索パスをコンパイラフラグに安全に直接追加する
add_definitions("/AI\"C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/lib/x86/store/references\"")
add_definitions("/AI\"C:/Program Files (x86)/Windows Kits/10/UnionMetadata/10.0.19041.0\"")
# includeパス
include_directories("C:/Users/tempm/myfiles/develop/vcpkg/packages/curl_x64-windows-static/include")
include_directories("C:/Users/tempm/myfiles/develop/vcpkg/installed/x64-windows-static/include")
include_directories("C:/Users/tempm/myfiles/develop/avs/portaudio/include")
# curlは静的リンク
add_definitions("-DCURL_STATICLIB")
# リンクするライブラリの指定
link_libraries("Ws2_32.lib")
link_libraries("Wldap32.lib")
link_libraries("Crypt32.lib")
link_libraries("Normaliz.lib")
link_libraries("Iphlpapi.lib")
link_libraries("Bcrypt.lib")
link_libraries("Secur32.lib")
link_libraries("C:/Program Files/gstreamer/1.0/msvc_x86_64/lib/gstreamer-1.0.lib")
link_libraries("C:/Program Files/gstreamer/1.0/msvc_x86_64/lib/gstapp-1.0.lib")
link_libraries("C:/Program Files/gstreamer/1.0/msvc_x86_64/lib/glib-2.0.lib")
link_libraries("C:/Program Files/gstreamer/1.0/msvc_x86_64/lib/gobject-2.0.lib")
link_libraries("C:/Program Files/gstreamer/1.0/msvc_x86_64/lib/gstcontroller-1.0.lib")
link_libraries("C:/Users/tempm/myfiles/develop/vcpkg/packages/zlib_x64-windows-static/lib/zs.lib")
link_libraries("C:/Users/tempm/myfiles/develop/vcpkg/installed/x64-windows-static/lib/nghttp2.lib")
MediaPlayer/GStreamerMediaPlayer/src/MediaPlayer.cppの1248行目を修正
- return make_unique<const VectorOfTags>(vectorOfTags);
+ return std::make_unique<const VectorOfTags>(vectorOfTags);
ビルド手順
- DLL
cd build
Remove-Item -Recurse -Force *
cmake ..\avs-device-sdk\ -G "Visual Studio 15 2017" -DGSTREAMER_MEDIA_PLAYER="ON" -DACSDK_BUILD_TESTS="OFF" -DCMAKE_SYSTEM_VERSION="10.0.19041.0" -DCMAKE_VS_WINRT_BY_DEFAULT="OFF" -DPKG_CONFIG_EXECUTABLE="C:\Users\tempm\myfiles\develop\vcpkg\installed\x64-windows\tools\pkgconf\pkgconf.exe" -DCURL_INCLUDE_DIR="C:\Users\tempm\myfiles\develop\vcpkg\packages\curl_x64-windows-static\include" -DCURL_LIBRARY="C:\Users\tempm\myfiles\develop\vcpkg\packages\curl_x64-windows-static\lib\libcurl.lib" -DPORTAUDIO="ON" -DPORTAUDIO_INCLUDE_DIR="C:\Users\tempm\myfiles\develop¥avs\portaudio\include" -DPORTAUDIO_LIB_PATH="C:\Users\tempm\myfiles\develop\avs\portaudio\Release\portaudio.lib" -DSQLITE_LIBRARY="C:\Users\tempm\myfiles\develop\vcpkg\installed\x64-windows-static\lib\sqlite3.lib" -DSQLITE_INCLUDE_DIR="C:\Users\tempm\myfiles\develop\vcpkg\installed\x64-windows-static\include" -DCRYPTO_LIBRARY="C:\Users\tempm\myfiles\develop\vcpkg\installed\x64-windows-static\lib\libcrypto.lib" -DCRYPTO_INCLUDE_DIR="C:\Users\tempm\myfiles\develop\vcpkg\installed\x64-windows-static\include\openssl" -A x64
cmake --build . --config Release
- サンプルアプリ
SampleAppの中のslnをVisual Studioで開いてビルドする
実行方法
設定ファイルの作成
- スクリプトで雛形作成(要Python。スクリプト実行はMSYS2上で実行)
./genConfig.sh ‘C:/Users/tempm/myfiles/develop/avs/config.json’ 12345 ‘C:/Users/tempm/myfiles/develop/avs/db’ ‘C:/Users/tempm/myfiles/develop/avs/avs-device-sdk’ ‘C:/Users/tempm/myfiles/develop/avs/out.json’ -DSDK_CONFIG_MANUFACTURER_NAME=”MYCOMPANY” -DSDK_CONFIG_DEVICE_DESCRIPTION=”MYDEVICE” - 一部修正する
- デフォルトロケールとタイムゾーンの変更
37c42
< "defaultLocale":"ja-JP",
---
> "defaultLocale":"en-US",
68c81
< "defaultTimezone":"Asia/Tokyo"
---
> "defaultTimezone":"America/Vancouver"
- gstreamerの設定追加
84,94d96
< },
< "gstreamerMediaPlayer": {
< "audioSink": "directsoundsink"
< },
< "equalizer": {
< "databaseFilePath": "C:/Users/tempm/myfiles/develop/avs/db/equalizer.db"
< },
- curlの設定追加(cacert.pemはここからダウンロード)
<
< "libcurlUtils": {
< "http2Allowed": true,
< "caFile": "C:/Users/tempm/myfiles/develop/avs/cacert.pem"
実行
SampleApp.exe ..\..\..\out.json INFO
- 第二引数はログレベル
- zコマンドで初期化、tコマンドで音声入力開始、qで終了
- ワンタイムパスワードによる認証に用いるアカウントはAlexaアプリから登録済みのものを指定
問題点
- SampleApp.exeで認証後、停止し、再度起動しなおすと自動的に認証されるが、通信エラーになる。初期化して再認証すれば使えるようになる。
