  The Linux Text-To-Speech mini-HOWTO
  Author: Rhandeev Singh rhandeev@comp.nus.edu.sg
  <mailto:rhandeev@comp.nus.edu.sg>
  Version 0.02, Last update: 99/05/14
  Hideki Shirafuji, shirafuji@mail.com <mailto:shira-
  fuji@mail.com>
  Version 0.02 : 2000/08/03

  この文書では RedHat 6.0 のシステムで Festival と MBROLA を使ってテキス
  ト読み上げ装置を設定する方法を解説しています。原文は
  <http://leb.net/pub/blinux/doc/blinux/my-tts-linux.txt>にあります。
  ______________________________________________________________________

  目次

  1. イントロダクション
  2. ソフトウェアの入手
  3. インストール
  4. 設定とテスト
     4.1 基本設定
     4.2 音声スタイルのサポート
     4.3 スクリプトの中で音声の質を変える
     4.4 音声出力装置の選択
     4.5 ガーベージ コレクション メッセージの音を消す
     4.6 質問と貢献

  5. 付録
     5.1 A.1.  /usr/lib/festival/lib/siteinit.scm 用のテンプレート
     5.2 A.2.  /etc/festival.conf 用のテンプレート
     5.3 A.3.  スタイルのサポートを追加したスクリプト

  ______________________________________________________________________

  1.  イントロダクション

  この文書は、音声出力ができる Linux システムで、商用ソフトウェアに頼ら
  ずにいろいろなドキュメントを読み上げられるようにするため、私がしたこと
  を書いたものです。いろいろなフリーのテキスト読み上げ（TTS）システムを
  試してみましたが、これまで聴いた中では MBROLA と Festival の組み合わせ
  が一番良かったです。

  また、スピードやピッチ（声の高さ）の設定を変更できるようにいくつのかス
  キームファイル [ 訳注: festival の動作を制御する専用のスクリプトファイ
  ル（拡張子 scm） ] をちょっと変えたり、lynx がさまざまなフォーマット
  （html, text, postscript）を読み上げられるように機能を追加しました。

  2.  ソフトウェアの入手

  これを書いている時点では、Blind Linux Archive もしくはミラーサイトから
  必要なソフトが入手できます。たとえば

          ftp://leb.net/blinux/festival/cstr.mirror/Linux-1.3.1/redhat/RPMS/i386/glibc2
          ftp://leb.net/blinux/mbrola/blinux/RPMS/

  それとも rpmfind.net では：

          http://rpmfind.net/linux/RPM/Utilities_Speech.html
          http://rpmfind.net/linux/RPM/Utilities_Sound.html

  もっと情報が必要なら Blind Linux ホームページ を見てください：

          http://leb.net/blinux/index.html

  i386 用の Red Hat 6.0 では、以下の RPM が必要でしょう：

          festival-1.3.1-2.i386.rpm
          festlex_POSLEX-1.3.1-1.noarch.rpm
          festvox_en1-1.3.1-1.noarch.rpm
          speech_tools-libs-1.1.1-2.i386.rpm
          festlex_OALD-1.3.1-1.noarch.rpm         # for british english
          festlex_CMU-1.3.1-1.noarch.rpm          # for american english

  また mbrola と、音声データベースを少なくともひとつ選ぶ必要があります。
  （ブリティッシュ・イングリッシュが一番設定が簡単です）：

          mbrola-3.01g1-1.i386.rpm
          mbrola-en1-2.0-1.i386.rpm               # british english
          mbrola-us1-980512-1.i386.rpm            # american (male)
          mbrola-us2-980812-1.i386.rpm            # american (female)

  ターボールが必要な場合は Festival project を見てください：

          http://www.cstr.ed.ac.uk/projects/festival.html

  それと MBROLA project へ行ってください：

          http://tcts.fpms.ac.be/synthesis/mbrola.html

  3.  インストール

  ここでは、あなたの Linux のサウンド・ハードウェアはすでに設定してある
  ものとします。設定していない場合は、the Linux Sound-HOWTO を見てくださ
  い。特に、 /dev/dsp が正確に動作している必要があります。

  RedHat RPMs のインストールはとても簡単です：

          bash$ rpm -Uhv fest* mbrola*

  次にブリティッシュ・イングリッシュ用のシンボリックリンクをはります：

          cd /usr/lib/festival/lib/voices/english/rab_mbrola
          ln -s /usr/lib/mbrola/en1/en1
          ln -s /usr/lib/mbrola/en1/en1mrpa

  [訳注: RedHat 6.1 用の RPM では
          cd /usr/share/festival/lib/voices/english/en1_mbrola/
          mkdir en1
          cd en1
          ln -s /usr/lib/mbrola/en1/en1
  ]

  それか、上記の "en1" をそれぞれのデータベース名に置き換えて、MBROLA に
  ほかの diphone データベースをインストールすることもできます；けれど
  も、私はどれもやってみたことがありません、それに、まず Festival がそれ
  らの言語を話せるように設定する必要があるでしょう。この文書を書いている
  時点で、同じくフランス語 、ドイツ語、スペイン語、そのほかの言語の
  MBROLA diphone データベースも利用可能でした。Blind Linux ホームページ
  を見てください。

  4.  設定とテスト

  4.1.  基本設定

  /usr/lib/festival/lib/voices.scm に１行追加します：

  [ 訳注: RedHat 6.1 用の RPM では /usr/lib/festival/ を
  /usr/share/festival/ と読み替える ]

          (defvar default-voice-priority-list
            '(rab_mbrola                     ; <= この行を追加
              rab_diphone                    ; （もちろん
              ked_diphone                    ;  セミコロンはいりません）

  さてできました。これで Festival は最初に MBROLA を使おうとします。

  このように festival を走らせると、設定をテストできます：

          bash$ festival
          festival> (SayText "Type any text here.  Sounds cool?")
          festival> (quit)

  いろいろなファイル形式、たとえば HTML をもっと「読みやすく」するため
  に、ファイルを前処理するように Festival を設定できます。どのように設定
  するかは /usr/doc/festdoc-1.2.0/festival/festival.info にある festival
  のドキュメントを見てください。 "Text modes" のセクションに書いてありま
  す。

  自分では、代わりにテキストを前処理する、古き良き sed スクリプトを書く
  ことしました。

  ファイルを指定して festival をテキスト読み上げモードで走らせることがで
  きます：

          festival --tts <filename>

  またはストリームを処理することもできます：

          lynx -dump <URL> | tee /tmp/x | festival --tts & sleep 1; less /tmp/x

  もしこれで満足できて、役にたっているなら、ここでやめてかまいません。
  が、ちょっと工夫した使い方があるので興味があれば先へどうぞ :)

  4.2.  音声スタイルのサポート

  このセクションでは、ピッチや話す速さの調節をどうやって決め、選択するか
  述べます。

  音声「スタイル」を扱うのに必要な構文生成を定義するために、付録 A.1 の
  テキストを /usr/lib/festival/lib/siteinit.scm という名前の新規ファイル
  に保存してください。システム全般のスタイルを定義するために、付録 A.2
  を /etc/festival.conf に保存してください。

  次に、以下の１行を /usr/lib/festival/lib/init.scm の終わりの方に挿入し
  ます：

          ;;; Default voice (have to do something cute
          ;;; so autoloads still work)
          (eval (list voice_default))
          (Style style_default)           ; <= この行を追加
          (provide 'init)

  このように $HOME/.festivalrc に追加すると、デフォルト以外にユーザー定
  義の「スタイル」も指定できます：

          ;; ユーザー定義スタイル
          (NewStyle 'my_slow      100 24 1.0) ; ゆっくりしたバリトンの声
          (NewStyle 'my_fast      140 50 0.8) ; 速いテナーの声

          (set! style_default 'my_slow)       ; デフォルトのスタイル

  最初の数字はピッチ（Hz）を意味します。２番目の数字はピッチの標準偏差
  （それとも分散？）で、３番目の数字はスケール要素で、小さい数字ほど速く
  なります。

  4.3.  スクリプトの中で音声の質を変える

  festival をスクリプトからバッチモードで使っている場合、現在の「スタイ
  ル」をスクリプトの中でこんなふうに変えることができます：

          (Style 'male_faster)

  たとえば付録 A.3 のスクリプトを見てください。このスクリプトは festival
  のテキスト読み上げのコマンドライン・インターフェイスに、スタイルを選択
  するサポートを追加します。もしこれを変更してほかの機能を追加したら、ぜ
  ひ私に教えてください！

  4.4.  音声出力装置の選択

  人によっては、MP3 をサウンド・ハードウェアで聴きながら同時に festival
  が使えるように NCD のネットワーク音響システム（NAS）を使うことを選ぶで
  しょう。

  そのためには、以下の行を /etc/festival.conf に挿入してください：

          ;;; ===================
          ;;; Audio Output Method
          ;;; ===================

          (Parameter.set 'Audio_Method 'Audio_Command)
          (Parameter.set 'Audio_Required_Rate 16000)
          (Parameter.set 'Audio_Required_Format 'snd)
          (Parameter.set 'Audio_Command "/usr/X11R6/bin/auplay -volume 100 $FILE")

  4.5.  ガーベージ コレクション メッセージの音を消す

  対話的な設定を使い、ウェッブ・ページを lynx に読み上げさせているような
  場合（lynx.cfg の中で指定できます）は、ガーベージ コレクション メッセ
  ージの音を消すと便利です。

  ガーベージ コレクション メッセージの音を消すには、/etc/festival.conf
  か $USER/.festivalrc のどちらかに以下の行を追加します：

          (gc-status nil)

  4.6.  質問と貢献

  もし festival を動かすときに問題がおきたり、この mini-HOWTO に何か貢献
  できることがあれば、この文書の著者に接触してもかまいません：

   Rhandeev Singh                   http://www.comp.nus.edu.sg/~rhandeev
   Linux User Group                 http://linux.comp.nus.edu.sg
   National University of Singapore

  5.  付録

  5.1.  A.1.  /usr/lib/festival/lib/siteinit.scm 用のテンプレート

  （警告：Scheme code が続きます；理解する必要はありません）

          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
          ;;;  Site Initialisation file
          ;;;  This is loaded near the end of init.scm,
          ;;;  just before user initialisation file
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

          ;;; ==========================
          ;;; Style Management Functions
          ;;; ==========================

          (defvar Styles '((default 140 22 1.0))
            "Available voice styles")

          (defvar style_default 'default
            "Default voice style")

          (defvar current_style 'none
            "Current voice style")

          (define (Style selected_style)
            "(Style DEFINED_STYLE)
             Sets the pitch, pitch variance, and speed of the current voice.
             Type 'Styles' for a list of defined styles."
            (let ((style (assoc selected_style Styles)))
              (if (not style)
                  (set! style (assoc 'default Styles)))
              (let ((model_mean (cadr (assoc 'model_f0_mean  int_lr_params)))
                    (model_std  (cadr (assoc 'model_f0_std   int_lr_params)))
                    (new_mean (cadr style))
                    (new_std (cadr (cdr style)))
                    (new_stretch (cadr (cdr (cdr style)))))
                (set! int_lr_params
                      (list
                       (list 'target_f0_mean new_mean)
                       (list 'target_f0_std  new_std)
                       (list 'model_f0_mean  model_mean)
                       (list 'model_f0_std   model_std)))
                (Parameter.set 'Duration_Stretch new_stretch)
                (set! current_style (car style))
                (list (car style) new_mean new_std new_stretch)
                )
              )
            )

          (define (NewStyle style_name mean std stretch)
            "(NewStyle STYLE_NAME MEAN STD STRETCH)
             Defines a new style; MEAN and STD refer to pitch mean and variance,
             while STRETCH refers to inverse speed, 1.0 being the standard."
            (set! Styles (cons (list style_name mean std stretch) Styles)))

          (if (probe_file "/etc/festival.conf")
              (load "/etc/festival.conf"))

  5.2.  A.2.  /etc/festival.conf 用のテンプレート

          ;;; =================
          ;;; Style Definitions
          ;;; =================

          (NewStyle 'male_frozen      80 10 1.5 )
          (NewStyle 'male_slow       100 22 1.1 )
          (NewStyle 'male_tenor      140 60 1.0 )
          (NewStyle 'male_baritone   100 40 1.0 )
          (NewStyle 'male_bass        70 25 1.0 )
          (NewStyle 'male_relaxed    100 24 0.95)
          (NewStyle 'male_newscaster 140 32 0.85)
          (NewStyle 'male_hurried    117 22 0.80)
          (NewStyle 'male_stressed   150 30 0.70)
          (NewStyle 'male_fast       110 22 0.70)
          (NewStyle 'male_faster     110 22 0.60)
          (NewStyle 'male_panic      170 20 0.60)
          (NewStyle 'male_fastest    110 22 0.55)
          (NewStyle 'the_flash       110 22 0.45)

  5.3.  A.3.  スタイルのサポートを追加したスクリプト

  これは festival のテキスト読み上げのインターフェイスに声質の「スタイ
  ル」のサポートを追加するスクリプトです。ほかの機能を追加するためのテン
  プレートとしても使えます。何か追加したらぜひ教えてください。

  スクリプト名を saytext として、ごく簡単に使い方を説明しておきましょ
  う。

          saytext -h              # （なぞめいた）ヘルプメッセージがでます

          saytext [-s <スタイル>] [<ファイル名>]  # ファイルもしくは標準入力を読み上げます

  <スタイル>は、存在するものなら何でもかまいません。<ファイル名 >が指定
  されない場合は、標準入力が使われます。

          例      saytext -s male_baritone myfile.txt

  そしてこれがスクリプトのコードです：

          #!/usr/lib/festival/src/main/festival --script
          ;;;  Here is a Festival script that adds voice "style"
          ;;;  support to the text-to-speech command-line interface.
          ;;;
          ;;;  Type "saytext -h" for help, including a list of available styles.
          ;;;
          ;;;  User-defined "styles" can be declared in ~/.festivalrc like this:
          ;;;
          ;;;             (NewStyle <name> <mean_pitch> <pitch_SD> <speed>)
          ;;;  E.g:       (NewStyle 'mystyle 100 23 0.9)   ; Defines a baritone
          ;;;
          ;;;  You can also set default styles:
          ;;;
          ;;;             (set! style_default 'my_style)
          ;;;
          ;;;  Styles may be selected within a script via:
          ;;;
          ;;;             (Style <name>)
          ;;;  E.g.:      (Style 'my_style)

          ;;; ==============
          ;;; INITIALIZATION
          ;;; ==============

          ;;; Because this is a --script type file I have to explicitly
          ;;; load the initfiles: init.scm and user's .festivalrc
          (load (string-append libdir "init.scm"))

          (if (probe_file (format nil "%s/.festivalrc" (getenv "HOME")))
              (load (format nil "%s/.festivalrc" (getenv "HOME"))))

          ;;; Clear rotten rendered speech from tmp
          (system "/bin/rm -f /tmp/est_*")

          ;;; Process command-line arguments

          (defvar TTS_Filename "-"
            "This variable stores the name of the file to be read,
            \"\" for stdin")

          (while argv
                 (let ((option (car argv)))
                   (set! argv (cdr argv))
                   (cond

                    ((eq? option '-s)
                     (if (length argv)
                         (let ((style (car argv)))
                           (if (not (assoc style Styles))
                               (format t "No style '%s, " style))
                           (Style style)
                           ; (format t "Using style %s\n" current_style)
                           (set! argv (cdr argv))
                           )
                         (error "Syntax error in option: -s <style>" nil)))

                    ((eq? option '-h)
                     (format t "Usage: saytext [-s <style> | -h]\n")
                     (format t "Available styles are:\n")
                     (format t " %l\n" Styles)
                     (quit))

                    (t
                     (set! TTS_Filename (string-append "" option))))))

          (tts TTS_Filename nil)

