LoginSignup
1

More than 5 years have passed since last update.

VoiceText Web API の Haskell 用ライブラリを作った

Last updated at Posted at 2014-07-18

VoiceText Web APIをHaskellから呼び出すためのライブラリを作った。

備忘のために作成手順などを書いておく。

作成手順

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

以下のような実行ファイルを作成する。

Main.hs
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 で回す。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1