VoiceText Web APIをHaskellから呼び出すためのライブラリを作った。
- GitHub: Network.VoiceText
備忘のために作成手順などを書いておく。
作成手順
cabal パッケージ雛形の作成
> mkdir network-voicetext
> cd network-voicetext
> cabal sandbox init
> cabal init
対話でパッケージの設定を聞かれるので、パッケージ名やライセンスなどを入力する。
全ての項目入力完了後、 cabal check
を実行して設定をチェックする。
source-repository セクションがないよ、という警告が出たので network-voicetext.cabal ファイルを直接編集してセクションを追加する。
依存ライブラリの追加
必要なものを network-voicetext.cabal の build-depends に追加し、cabal install --only-dependencies
でインストールする。
少し嵌ったのが、http-conduit をインストールしたかったが依存しているconduitがインストール中のビルドフェーズで失敗してしまった。
Data/Conduit/Internal.hs:394:4:
error: invalid preprocessing directive
#-}
conduitのissue124,147 などを参考に、以下のように解決。
> curl -O https://www.haskell.org/platform/ghc-clang-wrapper
> mv ghc-clang-wrapper /usr/local/bin/
> chmod +x /usr/local/bin/ghc-clang-wrapper
> vi /Library/Frameworks/GHC.framework/Versions/Current/usr/lib/ghc-7.6.3/settings
("C compiler command", "/usr/bin/gcc”), と書かれた行を ("C compiler command", "/usr/local/bin/ghc-clang-wrapper”), に変更。
Web API ポストリクエストを送信するコードの作成
network-qiitaを参考にさせていただいた。
パラメータは ByteString
にして Network.HTTP.Conduit.urlEncodedBody
に設定するため Data.ByteString.Char8.pack
を使っていたが、マルチバイト文字が正しく扱えていないようで作成される音声ファイルが入力と異なるテキストになっていたので、 Data.ByteString.UTF8.fromString
を使うようにしてみた。
パッケージの作成・確認
> cabal clean
> cabal sdist
> cd dist
> tar zxvf network-voicetext-0.0.0.1.tar.gz
> cabal sandbox init --sandbox ../../.cabal-sandbox
> cabal test
一応、他のディレクトリに別のsandbox環境を作り、インストールして実行できるか確認。
> mkdir network-voicetext-test
> cd network-voicetext-test
> cabal sandbox init
> cabal init
> cabal install network-voicetext-0.0.0.1.tar.gz
以下のような実行ファイルを作成する。
import Network.VoiceText
main = do
let b = basicAuth "basic_auth_username" ""
let p = ttsParams "Hello, world." Show
ttsToFile "./test.wav" b p
cabal run
を実行し、test.wav が作成されることを確認する。
が…作成された音声ファイルが壊れていて実行できない…。
以下のように cabal repl
で同じ事をすると正しい音声ファイルができるのだが、両者の違いが分からない…。
Prelude Main> import Network.VoiceText
Prelude Network.VoiceText Main> let b = basicAuth "basic_auth_username" ""
Prelude Network.VoiceText Main> let p = ttsParams "Hello, world." Show
Prelude Network.VoiceText Main> ttsToFile "./test.wav" b p
Right ()
toStrict
を呼んで遅延ByteStringを正格ByteStringにしてから書き込むことで、Main.hsを cabal run
しても正しい音声ファイルが作成されることが確認できた。
TODO
cabal repl
だと上手くいってcabal run
だと駄目な原因究明。(同じ事をやっているつもりだけど、そもそも Main.hs の書き方が間違っているのだろうか?)- emotion_levelは1または2, pitchは50~200など各パラメータには設定可能は数値の範囲がある。これを型で表現できないか検討。
- 単体テストを書いて、Travis CI で回す。