IK.AM

@making's tech note


VoiceText4JについてJJUGナイトセミナーでLTしてきました jjug

🗃 {Programming/Java/am/ik/voicetext4j}
🏷 JJUG 🏷 Java 🏷 VoiceText4J 
🗓 Updated at 2014-08-22T19:08:48Z  🗓 Created at 2014-08-22T19:08:48Z   🌎 English Page

8/22のJJUGナイトセミナーVoiceText4JについてLTしてきました。

VoiceText4Jとは?

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

APIキーはこちらのフォームを埋めれば簡単に発行できます。

通常の使い方は

$ curl "https://api.voicetext.jp/v1/tts" \
     -o "test.wav" \
     -u "YOUR_API_KEY:" \
     -d "text=おはようございます" \
     -d "speaker=hikari"

でwavファイルをダウンロードし、プレイヤーで再生する(またはplayコマンドにパイプする)形なのですが、VoiceText4Jを使うと、

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

EmotionalSpeaker.HARUKA.ready()
        .speak("おはようございます");

で音声再生までできます!

使い方

Mavenセントラルレポジトリにデプロイしてあります。

<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マニュアルとメソッド名を照らし合わせれば大体使われると思います。

使い道

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

Mashup Awards 10の対象にもなっているのでアイデアがある人は是非使ってみてほしいです。

発表スライド

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

本当は全編音声合成で発表したかったけど、想像だけで満足したので、やめました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回でもいいかな〜とおもってます。


✒️️ Edit  ⏰ History  🗑 Delete