Mac OS X日本語Text-to-speechもどき say_jp.csh ...英語なまりでMac OS Xが喋る!

By Kuratate0

First report created: May 2, 2008

本ページは、Unixの知識があるMac OS Xユーザーで、なおかつText-to-speechで遊んでみたい、Appleの音声合成技術に興味のある人向けの内容です。

一般ユーザーで、だた単にMac OS Xで日本語音声合成を利用したいユーザー向きではありません。

アプリケーションとしてMac OS X上で日本語音声合成を利用したい人は、SSFactoryさんによるiSpeechという素晴らしいソフトがあるのでそちら使ってください(検索すればすぐヒットします)。iSpeechは形態素解析Chasenも含まれているので、かな・漢字まじりの文章でもそこそこ正確に読み上げてくれる上に、翻訳・要約機能もあり、ここで紹介するcshスクリプトとは比べ物になりません。


はじめに


往年のマックユーザーであれば、MacOS 8の頃に付録としてOSについてきた日本語Text-to-speech(TTS)を一度は体験したことと思います。 その後、日本語版MacOSには日本語TTSは付属されなくなってしまいましたが、英語版では常に英語TTSが付属されています。 私は仕事で、MacOS 9時代は日本語版よりはむしろ英語版を良く使っていたのですが、英語TTSがデフォルトでインストールされた上にアクティブになっていたりしたので、新規インストールをした後に突然英語でMacに喋りかけられたときにはちょっとびっくりしました。 (会社の帰り際に新規インストールを実行して翌朝続きを行おうとしたとき、一晩中Macが英語で喋りつづけてたと守衛さんが不安がっていた、なんてこともありました。)

さて、時は流れ、Mac OS Xになっても英語版TTSは健在で、かなり声の自然性も良くなってきているようです(LeopardのAlexはかなり良くなっていますね!...あくまで個人的な感想ですが...)。 Mac OSが単一インストーラーCD,DVDで多言語対応になったため、日本語ユーザーでも英語Text-to-speechがデフォルトで利用できるようになりましたが、それほど使用している日本語圏の人は少ないのではないでしょうか。(というか、私は現在海外の大学に勤務しているのですが、職場のMacユーザーでもあまりTTSを使っている人は少ないようです...使っていても時報とか警告メッセージの読み上げぐらいでしょうか..)

英語TTSが一般ユーザーにどれだけ有用かはともかく、面白いのは、最近のMac OS XではXcodeをインストールすると、"Repeat After Me"と呼ばれる合成音を調教(?)できるソフトまでついてくることです(*)。このソフトは英文をタイプすると、北米英語の音素(Phoneme)に分解してAppleの英語TTSで用いられている独自の音素表記の文字列へと変換し、さらにTTSによる合成音の音素の長さ・ピッチの時間変化をグラフとして表示してくれます。そしてこの音素の再生時間、ピッチの変化をGUIで自由に調整したり、さらにマイクから録音した音声や、AIFFファイルに予め記録してある音声を使って、発話時間やピッチの当てはめ(自動では音素の対応はそれほど正確ではない)を行ってくれます。 また、英文を打ち込まなくても、この音素表記をAppleの"Speech Synthesis Programming Guide"のAppendix Bを見て直接入力して同様の作業を行うことも可能です。

(*)/Developer/Applications/Utilities/Speech/にあるはずです


日本語仮名-英語訛り音声合成用cshスクリプト: say_jp.csh

たまたま仕事で既存の英語TTSをあれこれ調査・使用する機会があり、特にこの"Repeat After Me"を使って、録音した英語音声と同期した合成音を作る必要にせまられました。このためAppleの英語音素表記や調整方法を学ぶこととなり、その過程でこの"Repeat After Me"で調整できる音声合成のパラメータが、テキストベースで全て処理可能なことがわかりました。

と、いうことは...「入力文字列をテキスト処理で強引にこの英語音素に対応させてやれば、日本語だって話せるのではないか?」と思いつき、Unixのお家芸のひとつのテキスト処理で、単純なひらがな-> Apple英語TTS音素変換を行ってみたところ、まるで外人さんがたどたどしく日本語を喋るように、いとも簡単にMac OS Xが日本語をしゃべってくれるようになりました。

たいした中身では無いのですが、まぁ他の皆さんの参考にもなるように、そのcshスクリプトを公開しておきたいと思います。(なぜcshかと言うとtcsh好きの私の趣味だからです)

使用方法は、日本語の仮名の読みのテキストファイルを文字コードEUCで作成して、それを以下のようにターミナルやX11のxtermなどから打ち込んで使用します。 (実行フラグを立てて、自分のパスの中にコピーしておくと良いでしょう)

   % csh say_jp.csh <テキストファイル>
実行すると、テキストファイルと同じディレクトリにAppleの英語音素表記に変換された新しいテキストファイル(*_phoneme.txt)と、AIFFファイルが生成されます。 -vオプションで声のモデルを指定することも可能です。
   % csh say_jp.csh -v <声モデル> <テキストファイル>

声モデルは"システム環境設定"の"スピーチ"の"システムの声"から、どんな声モデルが使えるかを確認できます。(デフォルトは"ゴノレゴ"さんでも使われているであろうWhisperになっています)。 スクリプトの中身は至って簡単で、仮名からApple音素へ変換した後、Mac OS X組み込みの'say'コマンド(ターミナルから音声合成を行うコマンド)を呼び出し、'say'コマンドでAIFFファイルを作ってそれを別の'afplay'コマンドで再生しています。

ダウンロード

say_jp.csh (cshスクリプト本体)

合成例1(AIFF) - 「アメニモ マケズ...」 ------ 入力テキストファイル1(読み上げのため、原文とは少し異なります)

(宮沢賢治の有名な詩を英語訛りで朗読!- 声:Zarvox)

合成例2(AIFF) - 「うらにわにわ にわ...」 ----- 入力テキストファイル2

(「裏庭には二羽、庭には二羽、ニワトリが...」と喋らせたいが...出力は.... - 声:Whisper)

どうでしょう? いかにも「外人さんが喋りそうな日本語」を喋ってくれるではありませんか!

注意事項


上級者向け内部情報


参考

上にある例の「アメニモマケズ...」の出だしの一部を、"Repeat After Me"を使って記録音声から[[Inpt TUNE]]モードにて長さ(D *;)とピッチ(P *:* ..)を付加した例を以下に示します。 書式は次の例の通りで、周波数の指定位置は0(音素の開始点)から99(音素の終了点)の整数値で指定するようです(指定位置100は次の音素の0に対応するみたいですね)。また周波数と位置については例のようにスペースで区切って複数箇所指定可能です。
<音素> {D <ミリ秒での長さ> P <周波数>:<指定位置>}
Mac OS X上のブラウザからこのページを見ているのであれば、以下の部分をブラウザ上でセレクトし、アプリケーションメニュー(Safariなら左上のSafariメニュー)から"サービス"->"スピーチ"->"テキスト読み上げの開始"を選択すると、即読み上げてくれるはずです。

[[inpt TUNE]]
~
AA {D 111; P 132.0:0 164.4:90}
~
m {D 40; P 168.0:0}
EH {D 90; P 167.0:0 136.6:87}
~
n {D 70; P 132.0:0}
IY {D 70; P 121.0:0 108.7:88}
~
m {D 70; P 107.0:0}
OW {D 60; P 102.0:0 102.0:88}
~
m {D 70; P 102.0:0}
AA {D 50; P 102.0:0 102.0:88}
~
k {D 131; P 102.0:0 102.0:92}
EH {D 70; P 102.0:0 102.0:11 102.0:22 102.0:89 102.0:94}
~
z {D 101; P 102.0:0}
UW {D 151; P 102.0:0 102.0:88}
~
k {D 363; P 102.0:0 102.0:92}
AA {D 60; P 102.0:0 102.0:10 102.0:19 102.0:90 102.0:95}
~
z {D 60; P 102.0:0}
EH {D 60; P 148.0:0 151.0:88}
~
n {D 80; P 152.0:0}
IY {D 30; P 154.0:0 151.0:88}
~
m {D 72; P 151.0:0}
OW {D 79; P 113.0:0 113.0:90}
~
m {D 67; P 113.0:0}
AA {D 67; P 97.0:0 97.0:91}
~
k {D 106; P 97.0:0 97.0:92}
EH {D 67; P 97.0:0 96.6:10 96.0:24 93.4:90 93.2:95}
~
z {D 155; P 93.0:0}
UW {D 110; P 94.0:0 93.0:100}
% {D 217}
% {D 595}
~
y {D 68; P 113.0:0}
UW {D 68; P 106.0:0 106.0:88}
~
k {D 58; P 106.0:0 106.0:92}
IY {D 49; P 109.0:0 114.0:13 151.0:27}
~
n {D 39; P 151.0:0}
IY {D 57; P 136.0:0 119.0:87}
~
m {D 97; P 111.0:0}
OW {D 87; P 111.0:0 111.0:88}
~
n {D 87; P 111.0:0}
AA {D 67; P 111.0:0 111.0:88}
~
t {D 57; P 111.0:0 111.0:75 111.0:88}
s {D 67; P 111.0:0 111.0:13 111.0:27 111.0:93}
UH {D 57; P 112.0:0 113.0:17 115.0:33}
~
n {D 30; P 155.0:0}
OW {D 158; P 148.0:0}
~
AA {D 30; P 148.0:0 148.0:89}
~
t {D 30; P 148.0:0 148.0:75 148.0:88}
s {D 115; P 148.0:0 148.0:13 148.0:27 148.0:93}
UH {D 30; P 148.0:0 147.0:15 146.0:31 145.0:85}
~
s {D 30; P 113.0:0 109.0:94}
AA {D 30; P 109.0:0 109.0:12 105.0:24}
~
n {D 30; P 103.0:0}
IY {D 30; P 103.0:0 103.0:87}
~
m {D 30; P 103.0:0}
OW {D 56; P 103.0:0 103.0:88}
~
m {D 66; P 103.0:0}
AA {D 66; P 103.0:0 103.0:88}
~
k {D 105; P 103.0:0 103.0:92}
EH {D 37; P 103.0:0 103.0:14 103.0:29}
~
n {D 66; P 103.0:0}
UW {D 85; P 103.0:0 103.0:88 103.0:94}
~
J {D 177; P 103.0:0}
OW {D 140; P 127.0:0 148.0:54 149.6:90 149.8:95}
~
b {D 30; P 150.0:0 154.1:83}
UW {D 61; P 155.0:0 146.2:88}
~
n {D 30; P 145.0:0}
AA {D 112; P 141.0:0 136.0:88}
~
k {D 102; P 136.0:0 136.0:92}
AA {D 30; P 136.0:0 136.0:17 136.0:33}
~
l {D 30; P 136.0:0}
AA {D 51; P 136.0:0 136.0:90 136.0:95}
~
d {D 61; P 136.0:0 136.0:75}
AA {D 50; P 136.0:0}
~
OW {D 111; P 120.0:0 107.3:91}
~
m {D 93; P 106.0:0}
OW {D 144; P 103.0:0 104.8:91}
~
C {D 144; P 105.0:0 104.0:96}
IH {D 126; P 104.0:0 103.8:6 103.4:15 100.0:100}
% {D 30}
% {D 40}
. {D 1750}
[[inpt TEXT]]

どうでしょう?かなり良く聞こえますよね?(最後の方はピッチの調整が手抜きになってしまって前半ほど良くは無いですが...)

参考までに、最初の例にあるような本スクリプトによる音素指定のみだと以下のようになります。先の場合と同様に再生してみると、違いが歴然とするはずです。


[[inpt PHON]]
_AA_mEH_nIY_mOW _mAA_kEH_zUW _kAA_zEH_nIY_mOW _mAA_kEH_zUW @.%_yUW_kIY_nIY_mOW _nAA_tsUH_nOW_AA_tsUH_sAA_nIY_mOW_mAA_kEH_nUW _JOW_bUW_nAA_kAA_lAA_dAA_OW_mOW_CIH @.%
[[inpt TEXT]]

結局、このような調整は言語ごとに必要なので、Appleはそこまで多言語対応はできないので英語TTSのみを提供しているんでしょうかね。

ここでは、ごく基本的な制御機能しか利用していませんが、他にもアクセントなども指定可能なので、全ての機能をうまく使えばかなり高度な音声合成ができるのではないかと思われます。(ひょっとすると自家製ボーカロイドなんかも可能かも?...修士ぐらいの学生向けの研究テーマにちょうど良いかも?)

ちなみに最初に述べたiSpeechという素晴らしいフリーソフトですが、かな-\gt Apple音素変換は似たような感じですが(違っていたらごめんなさい)、UIの充実はもとより、形態素解析のChasenも組み込まれているので、通常の文章を読み上げるなど実用上非常に役立つソフトです。(Leopardでは動作してくれないようですね...少し残念です...)

ご意見等はまで

Kuratate0のホームページに戻る