---
title: VoiceText4JについてJJUGナイトセミナーでLTしてきました jjug
tags: ["JJUG", "Java", "VoiceText4J"]
categories: ["Programming", "Java", "am", "ik", "voicetext4j"]
date: 2014-08-22T19:08:48Z
updated: 2014-08-22T19:08:48Z
---

[8/22のJJUGナイトセミナー](http://jjug.doorkeeper.jp/events/13764)で[VoiceText4J](https://github.com/making/voicetext4j)についてLTしてきました。

### VoiceText4Jとは？

HOYAサービス株式会社の音声合成ソフトウェア「[VoiceText](http://voicetext.jp/)」の[Web API](https://cloud.voicetext.jp/webapi)版をJavaから使えるようにしたライブラリです。モヤモヤさま〜ずのナレーションで使われていることで有名です。

APIキーは[こちらのフォーム](https://cloud.voicetext.jp/webapi/api_keys/new)を埋めれば簡単に発行できます。

通常の使い方は

``` shell
$ curl "https://api.voicetext.jp/v1/tts" \
     -o "test.wav" \
     -u "YOUR_API_KEY:" \
     -d "text=おはようございます" \
     -d "speaker=hikari"
```
でwavファイルをダウンロードし、プレイヤーで再生する(または`play`コマンドにパイプする)形なのですが、VoiceText4Jを使うと、

``` java
System.setProperty("voicetext.apikey", "API_KEY");

EmotionalSpeaker.HARUKA.ready()
        .speak("おはようございます");
```
で音声再生までできます！

### 使い方

[Mavenセントラルレポジトリ](http://search.maven.org/#artifactdetails%7Cam.ik.voicetext%7Cvoicetext4j%7C0.10.0%7Cjar)にデプロイしてあります。

    <dependency>
        <groupId>am.ik.voicetext</groupId>
        <artifactId>voicetext4j</artifactId>
        <version>0.10.0</version>
    </dependency>

とか

    compile 'am.ik.voicetext:voicetext4j:0.10.0'

とか。

依存ライブラリはなく、標準APIのみで実装しています。(古き良き?Java Sound APIとか使っています)

オススメはGroovy + Grapeでスクリプト的に書く使い方。デモに最適。



    @Grab("am.ik.voicetext:voicetext4j:0.10.0")
    import am.ik.voicetext4j.*;
    
    System.setProperty("voicetext.apikey", "API_KEY");
    
    Speaker.SHOW.ready().speak("こんにちは");

と書いて、`groovy hello.groovy`で再生されます。

話者はシングルトンで

* `am.ik.voicetext4j.Speaker.SHOW`
* `am.ik.voicetext4j.EmotionalSpeaker.HARUKA`
* `am.ik.voicetext4j.EmotionalSpeaker.HIKARI`
* `am.ik.voicetext4j.EmotionalSpeaker.TAKERU`

の4名を利用できます。
`SHOW`がモヤさまの声で、残り3人は感情をコントロールできます。

    EmotionalSpeaker.HARUKA.ready().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().angry().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().very().angry().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().happy().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().very().happy().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().sad().speak("こんにちは");
    EmotionalSpeaker.HARUKA.ready().very().sad().speak("こんにちは");

あとは[APIマニュアル](https://cloud.voicetext.jp/webapi/docs/api)とメソッド名を照らし合わせれば大体使われると思います。

### 使い道

Twitter連携とかCI連携とか監視ログとか夢ひろがりんぐですね。

[Mashup Awards 10](http://mashupaward.jp/)の対象にもなっているのでアイデアがある人は是非使ってみてほしいです。

### 発表スライド

スライドは↓です。といっても内容ないですがw(なぜかLikeついてる・・)

<iframe src="//www.slideshare.net/slideshow/embed_code/38251003" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/makingx/java-38251003" title="喋るJava!" target="_blank">喋るJava!</a> </strong> from <strong><a href="http://www.slideshare.net/makingx" target="_blank">makingx</a></strong> </div>

本当は全編音声合成で発表したかったけど、想像だけで満足したので、やめましたw

発表で使用したスクリプトのを貼っておきます（最後のは実行できなかった）。

    export VOICE_TEXTAPIKEY=発行したキー

を事前に実行しています。

#### 00-hoge.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;

System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));

Speaker.SHOW.ready().speak("hoge");
```

#### 01-demo.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;

System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));

Speaker.SHOW.ready().speak("モヤモヤさまーず");
```

#### 02-konnichiha.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;

System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));

Speaker.SHOW.ready().speak("こんにちは。ショウです。");
EmotionalSpeaker.HARUKA.ready().speak("こんにちは。ハルカです。");
EmotionalSpeaker.HIKARI.ready().speak("こんにちは。ヒカリです。");
EmotionalSpeaker.TAKERU.ready().speak("こんにちは。タケルです。");
```

#### 03-emotional.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;

System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));

EmotionalSpeaker.HARUKA.ready().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().sad().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().very().sad().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().happy().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().very().happy().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().angry().speak("キレてないっすよ");
EmotionalSpeaker.HARUKA.ready().very().angry().speak("キレてないっすよ");
```

#### 04-java-sound-api.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;
 
System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));
 
Speaker.SHOW.ready().speak("""
VoiceText4Jは、他の言語のライブラリとは違って、
Java Sound APIを使用することにより、
WAVファイルを経由することなく、直接音声を発生することが出来ます。
""");
```

#### 05-end.groovy

```
@Grab("am.ik.voicetext:voicetext4j:0.10.0")
import am.ik.voicetext4j.*;

System.setProperty("voicetext.apikey", System.getenv("VOICETEXT_APIKEY"));

Speaker.SHOW.ready().speak("ご清聴ありがとうございました。");
```

----

バグなどあったらプルリクお願いします！


LT大会は毎年8月に開催しているんですが、半年に1回でもいいかな〜とおもってます。
