Raspberry Pi で音声合成(2)

Raspberry Pi で音声合成 のつづき&
OpenJTalkでwavファイルを作らずに直接再生する のバージョンアップ
なネタです。
OpenJTalk-1.06+ALSAで直接合成音を再生するアプリケーションを作成して、Raspberry Piで問題なく動作しました。
もちろんx86-Linuxでもディストリの違いを除いては同じ手順で動作します。

準備

ALSAのライブラリが必要です。

# apt-get install libasound2-dev

ソースコード

https://github.com/penkoba/open_jtalk-app

hts_engine_API-1.07-tk01.patch

HTS_engine-1.07に以下のAPIを追加します。

/* HTS_Engine_get_generated_speech_size: obtain generated speech size */
unsigned int HTS_Engine_get_generated_speech_size(HTS_Engine * engine)
{
   return HTS_GStreamSet_get_total_nsamples(&engine->gss);
}

/* HTS_Engine_get_generated_speech: obtain generated speech */
void HTS_Engine_get_generated_speech(HTS_Engine * engine, short * buf)
{
   size_t i;
   double x;
   HTS_GStreamSet *gss = &engine->gss;

   for (i = 0; i < HTS_GStreamSet_get_total_nsamples(gss); i++) {
      x = HTS_GStreamSet_get_speech(gss, i);
      if (x > 32767.0)
         buf[i] = 32767;
      else if (x < -32768.0)
         buf[i] = -32768;
      else
         buf[i] = (short) x;
   }
}
play.c

alsa-utilsのaplay.cをベースにしたALSA出力ルーチンです。

tts_app.c

OpenJTalk-1.06のopen_jtalk.cをベースにしたアプリケーションです。-owオプションを無くし、直接音声再生しています。

コンパイル

手順は https://github.com/penkoba/open_jtalk-app のREADMEを参照してください。
ただしライブラリのインストールをしないで進めたい場合は前回の記事も参照してください。
coonfigureのオプションを少し追加する必要があります。

使用方法

以下にサンプルバッチファイル sample-batch.sh の内容を示しますが、最低限-xと-mを指定すれば実行できます。以前のバージョンに比べるとだいぶすっきりしましたね。

#!/bin/sh

VOICE_FILE='/usr/local/share/hts_voice/nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice'
DIC_DIR='/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.06'

TTS_TEXT="おはようございます。"

CMD="tts_app"
CMD=$CMD" -x  $DIC_DIR"
CMD=$CMD" -m  $VOICE_FILE"

echo $TTS_TEXT | $CMD

注意事項

音声合成がすべて終わってから出力してるので、長い文章を喋らせようとすると喋るまでに時間がかかってしまいます。
これは要改善ですね。