2008年04月03日

ちりとてちん(151) 最終回

最終回だけに思い入れもあって、最初からの録画をところどころ見直したり、いろいろ書き足しているうちに、今頃になってしまった。最終回のレポートだけど、もう、あらすじとは呼べないくらい書いてしまった。

ちりとてちんでは、主人公の喜代美が全151話の最後の数話で、本当に自分のなりたいものを見つける。最終回一回前草々が言ったように今まで積み上げたものが全て無駄になってしまいかねない危険な展開だ。でもこんな急な展開なんだけれど、喜代美の選択がとても納得できてしまう。それは和久井映見演じる愛すべきお母ちゃんがいつもそこにいてくれたことが大きいだろう。そして、そこに着地しても違和感がないような伏線が、物語の最初の方からきちんと仕組まれていたからに他ならない。継承していくことの大切さ大変さ素晴らしさを描いた物語で、主人公がお母ちゃんになることを選ぶというのは、とてもふさわしい結末だと思う。

とにかくこのドラマは、一話一話の積み重ねがあるほど、より味わうことができる。NHKは例外的に番組枠を作って、再放送を始めるべき。第一週だけでも流すべき。録画したものを見直して、率直にそう思った。第1回の出だし、それは母ちゃんの歌声だった。それだけでもう感極まった。すぐに再放送は無理だろうけど、完全版DVD BOX 第一巻は早速5月に出る。最初から見てない人は、こんな投稿見ずに、DVDを買うべきだと思う。


では、主観的な最終回の内容と注釈
回想などの話数が分かるときは、書き込んでみた。


最終回はオープニングが無かった。いつもの「ちりとてちん」の文字が出てくるだけだった。いつもなら、落語家の紋など落語にまつわるもの、大阪に関するものが飛び出てくるアニメーションが、松下さんのピアノ演奏と共に流れるのに。今回はそれなしで始まった。今日は、喜代美の出産を中心に、上沼恵美子のナレーションによる未来の喜代美の視点での登場人物の後日談が語られていく。

かなり大きなお腹になった喜代美が庭を見ながら休んでいる。庭に順ちゃんが現れる。喜代美の様子を見ていよいよって感じだねと声を掛けると、それを言わんといてと喜代美が困った顔をする。

喜代美は出産の痛みを心配している。順ちゃんはとても痛いよって怖い顔をしてみせる。でもそのあと大変だからすぐに痛みを忘れると言う。どねしよと不安を漏らす喜代美。そんな覚悟もなしに決心したのかと順ちゃんは喜代美を叱る。お腹の子供と、草々さんのお弟子さんと、ひぐらし亭の落語家みんなのお母ちゃんになると決心したんじゃなかったのかと、いつも以上に厳しい口調で言う。そして、どねしよ禁止を喜代美は言い渡される。順ちゃんの勢いに圧倒されて、喜代美は「はい」と返事をする。順ちゃんは縁側に腰を下ろし、庭を眺める。その後ろ姿をニコニコしながら眺めてる喜代美。順ちゃんに出会わなかったら自分の人生はどうなっただろうと思うとぞっとするとナレーション。

魚屋食堂にランドセルを背負った小学生二人、順子の双子の息子が帰ってくる。テーブルにはその両方のおじいちゃんとおばあちゃんが向かい合わせで食事をしている。子供の一方が父親友春の焼いている魚を興味深そうに眺める。そしてもう一方は和田夫妻がもってきた新しいデザインの塗り箸を眺めている。順子の父ちゃんが、順平が食堂の跡取りに、春平が製作所の跡取りになるだろうなと頼もしそうに言う。ナレーションの未来の喜代美が、この二人はこの言葉通りにそれぞれの跡取りになると伝えてくれる。しかし順子のお母ちゃんはそれには不満らしく、二人を双子タレントで売り出したいと言い出す(ふたりっ子?)。夫婦げんかが始まりそうになると、友春が両手に焼鯖を持って、けんかの仲裁に入る。これは順子の父が趣味のようにしていた喧嘩の仲裁とそっくりだ。ナレーションで、焼き鯖による喧嘩の仲裁も受け継がれていくのだそうだ。ということは、順平君も未来でやっているんだろうな。

ひぐらし亭の高座。小草若が四代目草若襲名。相変わらず「底抜けにー」を使ってる。草若の部屋から兄弟弟子がみんなで眺めている。この部屋だけは以前のままで、高座の様子を覗くことができる。その後ろから天狗芸能会長が入ってきて、感慨深く、やっと草若に会えたと呟く。先代草若の遺影が映る。

和田家。電話でおめでとうございますと喜代美。電話を置くと、奈津子がやってくる。臨月の喜代美の取材。後から小次郎が喜代美の小さな頃の写真を持って入ってくる。喜代美が落語を目指した頃からやっている、奈津子の密着取材を出版する時に使う写真を探してきた。ナレーションによると、実際この本が出版されるが、あまり売れず、みちばたで小次郎おじさんが叩き売ることになるんだそうだ。二人はそれも楽しんでいる。

居酒屋「寝床」にエーコが現れる。襲名おめでとうございます。小草若は落語から逃げ出していた時期、エーコが小浜で企画したイベントに参加したおかげで(第139回)、落語への想いを取り戻し、新しい草若になる決意ができた。このときのことでエーコを感謝している。

エーコと草若の出会いはもっと前からで、草若がタレントとして売れっ子だった頃、エーコは番組のアシスタントをしていたことがある。昔「寝床」でエーコが一方的にビーコにキレられたのも、そのつながりで小草若が「寝床」に呼んだときに起きた。その頃はエーコに対しては気はなかった。どちらかというとビーコに対して気があった。

それはそうと、ナレーションでは、この二人はちょっといい感じに行くのですがなかなか結婚には至りませんという微妙な表現をしている。「なかなかいたらない」というのは、いたらないことが確定でもない表現。ナレーションをしているこの時期ではその顛末を十分知っているはずなのに、はっきり言わないところをみると、続編が可能になったらこのあたりのエピソードを使うつもりで残してあるんじゃないだろうか。

同じ「寝床」の中、散髪屋が草原に話しかける。草原兄さんは大阪府から賞をもらった。散髪屋が祝うと、もらったのは自分ではなく自分の落語を応援してくれた嫁だと、緑さんとその場で抱き合ってしまう。それを颯太君も感動しながら横で見てる。ナレーションでは、上方落語界一頼れる兄さんとなると評される。

草原兄さんと緑さんの馴れ初めも、とてもいい話だった(第102回)。草原は賞を取ったらプロポーズしようとしていたが、結局何年経っても取ることができなくて、たまりかねた師匠が草原の心を一押ししてやっと結婚できた。だからこそ、この賞というのは、草原にとって緑さんと祝うべきとても価値のあるものなんだろうな。草原兄さんが落語に戻る決心をしたのは颯太の「せをはやみー」だけでなく草原の落語を愛している緑さんからの後押し(第35回)があったからでもあった。

四草は、九官鳥の「平兵衛」を連れてきている。平兵衛は「瀬をはやみ」としゃべっている。これも四草が落語に戻ってくる頃のエピソード(第36回)を思い起こさせる。ナレーションによると「算段の平兵衛」の演目が十八番になっているそうだ。四草はこれを教わるために草若に弟子入りした。

そこへ、子連れ女が勢いよく入ってくる。女性は「芋たこなんきん」の藤山直美に似てなくもない。男前の四草にはちょっと不釣り合いな感じ。ただ子供は四草のように顔立ちのいい男の子。そしてその女性は「あなたの子供です」と言い放ってそのまま帰って行く。みんながあっけにとられているのに、四草は何事もなかったように、子供を自分の膝の上に招いて、平兵衛を紹介し、えさをやらせる。ナレーションによると四草はこの子を立派に育て上げるそうだ。

そして「寝床」の熊五郎と咲さん、散髪屋の磯七、仏壇屋の菊江さんの寝床のみんなはひぐらし亭と共にずっとずっとそこにあるとナレーション。これは落語を愛してくれる人たちがいつまでもいてくれるとも言っているのだと思う。そして彼らは落語の描く世界そのものの具現化でもあるのだろうから、落語がある限り落語の描く世界はいつまでも変わらずそこにあるということも言っているのだろう。

草々には小草々の他にも弟子が二人増えていた。相変わらず小草々は弟弟子に嘘を吐いたりしている。

喜代美の弟正平は小学校の教員から恐竜博物館に異動し、最終的には留学を経て、学芸員になることができたとナレーション。

いつも通りの和田家の夕食シーン。以前と違うのは食卓に正平がいない、かわりに奈津子がいる。小梅ちゃんがティラノザウルスは粋だという。そういえば以前小梅ちゃん似たようなシチュエーションでチャゲアスとか言ってたような(第8回)。いつまでも好奇心旺盛だとナレーション。

奈津子さんがお兄さんと声を掛けて、正典の箸を褒める。ほーけーとこたえる。正典はエーコが社長をしている若狭塗り箸製作所に行って若い者に教えている。おじいちゃんのような伝統塗り箸の名人になっていく。

すると突然、お母ちゃんが鼻をくんくんする。心構えしておきなさいよ。二、三日うちに産まれると予言する。ドラマ当初はよくやっていたお母ちゃんの特技。においでいろんなものが分かるらしい。その特技が最終回に再び見られるとは。見続けてきてくれたファンへのサービスに違いない。途中後半から見てきた人には、妊婦の臭いを嗅ぐなんてちょっと変なシーンだったろうな。

小浜に引っ越してきた直後どの段ボールにしまったか分からなくなったとき、鼻だけでスカートがどこか見つけてしまう(第1回)。夜中喜代美が一人どこかに行ってしまったときも臭いで探そうとしていた(第6回)。知らないはずの大阪での喜代美の居場所にたどり着けたのも(第17回)、この特技のおかげ。

ナレーションでは、お母ちゃんは毎日毎日お母ちゃんをやっていると言う。ここで、この喜代美が人生を振り返ってナレーションをしている時期が明らかになる。お母ちゃんになって20年ということは、つまり、2027年頃。その頃でも、やっぱり糸子お母ちゃんはお母ちゃんをしているのだそうだ。御壮健で何より。

喜代美が和田家の工房でカセットテープを聞いている。あのおじいちゃんのテープ。昭和43年10月6日の小浜市民会館で収録された草若師匠が演じる「愛宕山」。幼い頃おじいちゃんと一緒に聞いたテープ。そしておじいちゃんとお別れのときにも聞いたテープ。おじいちゃんが死んだ後、子供の喜代美が涙を流して何度も聞いているうちに切れてしまい(第6回)、正平が修理するまで(第30回)聞けない状態だったこともある。聞けないテープも喜代美はお守りとして大切にしていた。このテープがつながると物語も大きく動き出した。喜代美の運命も、みんなの運命も大きく変えてくれた。徒然亭一門も盛り返し、この声の主の草若も甦った。草若の夢だった常打ち小屋を作ることもでき、その場所で喜代美自身が最後の演目にこれを選ぶことにもなった。

物語が進むにつれだんだんこのテープにまつわる出来事もいろいろ分かってきた。これが録音された日の出来事が、このドラマの重要なところで、様々な視点で描かれていく(第6回、第47回、第139回)。どうしてこの日のテープをおじいちゃんがきいていたのか。実はこのテープはカセットテープでありながら、そういう想いをつなぐ象徴でもあるんだ。

喜代美がおじいちゃんのテープを聴いていると、また聞いてるのか、落語をやめなかったらよかったのにと草々の声がする。すぐに嘘や嘘やと、愛おしく喜代美の頭に触れる。草々は喜代美のお腹に近づいて、子供が無事に生まれたら、この子とひぐらし亭のお母ちゃんとしてしっかり働いてくれ。そして師匠の落語を伝えていこうと言うと、はいと答える。

突然、喜代美が苦しみだす。産気づく。草々は慌てふためいて救急車と叫びながら飛び出していく。苦しみながらも喜代美はお守り袋ををつかむ。

ここで静かに出演者のテロップが流れる。そして毎月曜日の上沼恵美子の口上が始まる。「ようこそのお運びで厚く御礼申し上げます。」

分娩室に運ばれる喜代美。草々も寄り添っていくが、閉め出されてしまう。もどかしく扉の前で待つ草々。そして草々は扉の前で喜代美に聞こえるように落語の一節を語り出す。「野辺へ出てまいりますと、・・・ひばりがぴーちくぱーちく・・・その道中の陽気なこと〜」。おじいちゃんのカセットテープから何度も何度も聞こえてきた一節。そこで、子供の頃の喜代美がにこにこしながらカセットテープを聴いている場面(第2回)が挿入される。すべてはこの少女の頃の出会いから始まった。

この産科の場面は、喜代美の生まれた時に似ている。大晦日、病院の待合室で紅白歌合戦を見ているとき、大好きな五木ひろしの歌の途中で糸子は分娩室に運び込まれてしまう(第74回)。その糸子のために、正典お父ちゃんが「ふるさと」を大声で歌った(第96回)。このエピソードのことを草々は思い出したのだろうか。

産声が聞こえてくる。いつもの松下奈緒のピアノのオープニング曲が流れる。今日のオープニングはこの新しい命の始まりのときこそふさわしい。こらえていた草々は顔をくしゃくしゃにして泣いている。幼い頃から天涯孤独だった草々だからこそ自分の子をもつことが、より一層心を揺さぶるのだろう。

そして、ベッドの上の若狭。上沼恵美子のナレーションで「おかしな人間達の珍道中はまだまだ続いていきますが、お時間です。またいつの日かお付き合い願います」。あんなに痛みを怖がっていた喜代美が、とてもすがすがしい顔でカメラ目線で優しく微笑む。

おしまい

生まれた子供は男の子なのだろうか。女の子なのだろうか。それをはっきりさせないままの最終回。喜代美の妄想の中では、女の子で確定だったけれど、実際は分からない。落子と名付けられたかどうかは続編を期待するしかない。


とても楽しませてもらった素晴らしい作品だった。スピンオフも決まったことだし、これからも、いつまでもお付き合いさせていただきます。


posted by takayan at 19:06 | Comment(3) | TrackBack(0) | ちりとてちん | このブログの読者になる | 更新情報をチェックする

2008年04月10日

xpNavoでMisakiさん

高音質な美声で評判のMisakiさんについての続編。以前「VoiceTextのMisakiさん」に書いたときには、PC-TalkerとxpNavoというスクリーンリーダーでMisakiさんが使えると書いた。今回はそのxpNavoについての話。

スクリーンリーダーPC-Talkerの最新版ではMisakiさんがしゃべってくれるが、これはSAPI5音声を使ったものではないので、僕的にはいろいろ遊べない。一方のxpNavoでは、SAPI5の音声として利用できるので、他のSAPI5を使うソフトで簡単にMisakiさんの声を利用できるようになる。これは面白そう。

そういうわけで購入してみた。

このスクリーンリーダーxpNavoはWindowsXP用。VISTAには対応していないので注意。価格は合成音声搭載のものとしてはかなり安い方になる。搭載されている合成音声は、misakiのほかに、同じペンタックス製のMiyu(女声)、Show(男声)、Kate(英語女声)。

他に比べて安価ではあるが、xpNavoはスクリーンリーダーとして基本的な機能はおさえている。IEはもちろん、ワードやエクセルの読み上げ機能もある。具体的な操作方法は、設定画面のヘルプ中に記されているショートカットキーの一覧を読んで調べればいい。

このスクリーンリーダーには「自動読み上げモード」と「ワンタッチ読み上げモード」がある。「自動読み上げモード」はメニューの選択から何から音声で教えてくれるものだ。つまり通常のスクリーンリーダーらしく使える。一方の「ワンタッチ読み上げモード」は指示したときだけ読み上げてくれる。こちらは視覚に障害はないが読み上げ機能は使いたいという人に便利な機能だろう。

xpNavoをメインのスクリーンリーダーとして使う場合はちょっと注意が必要。視覚障害者用のソフトであっても、そのソフトの側で各スクリーンリーダーへの対応をしていないと問題が生じる場合がある。常用するソフトがこのxpNavoで使用できるかどうかはちゃんと確認しておく必要がある。ただそれがSAPI5対応のソフトであれば音声エンジンとして使える可能性は高いだろう。他のソフトに比べて値段も安く、高音質の音声で画面を読んでくれるので、お薦めのソフトにかわりはない。

↓購入はこちらで、どうぞ




このブログでは以前からFirefoxの拡張「Fire Vox」、「Click,Speak」を紹介しているが(カテゴリ:Fire Vox)、この拡張でもSAPI5のMisakiさんの声を利用できる。Fire VoxはxpNavoではマニュアルにも利用方法が紹介されている。音声の選択はFire Voxでは直接できないので、コントロールパネルの音声認識を開いて、音声合成タブにある音声選択コンボボックスでVM Misakiを選んでおく。

xpNavoを起動させていない状態でもSAPI5は有効なので、そのままMisakiさんの音声を利用できる。しかしこれだと文字入力が音読されない。文字入力は読ませなくてもいいというのなら、これでもいいのだが、文字入力を読ませる必要があるときにはxpNavoを起動し「自動読み上げモード」にしておかないといけない。

ただ「自動読み上げモード」にした場合、Fire Voxのオプションでイベント読み上げがチェックされていると、メニューなどが二重読みされる。煩いので、このチェックは外しておいたほうがいい。


以前、「オープンソースのスクリーンリーダNVDA」で紹介したNVDAでもちゃんとSAPI5のmisakiさんの声を利用できる。NVDAの日本語版は「NVDAJp」においてあるので、ダウンロードして、解凍し、nvda.exeを起動する。初期設定では表示も音声も英語になっているので、次の手順でMisakiさんに切り替える。
・メニューバーの「Preferences」メニューを開き、「User Interface」項目を選択する。
・「User interface settings」ダイアログが開くので、「Language」コンボボックスの値を、「ja_Japanese」に切り替える。
・再起動の旨のメッセージが表示されるので、OKボタンを押す。しばらく待つと、メッセージが日本語に切り替わって戻ってくる。
・メニューバーの「設定」メニューを開き、「出力先の選択」項目を選ぶ。
・「出力先」ダイアログが開くので、「出力先」コンボボックスを「sapi5」に切り替えて、OKボタンを押す。
・メニューバーの「設定」メニューを開き、「音声設定」項目を選ぶ。
・「音声設定」ダイアログが開くので、音声コンボボックスから「VW Misaki」を選んで、OKボタンを押す。

これで、NVDAでmisakiさんがしゃべってくれるようになる。ウィンドウズキーを押して矢印キーを動かすと項目を読み上げてくれるし、アプリケーション実行中にALTキーを押すとメニューを読み上げてくれる。基本的な使い方は、操作ウィンドウに表示される「NVDAクイックスタートドキュメント」に書いてある。


ちょっと残念なのは、xpNavoに音声ファイルを作成する機能はついていないこと。アイネットの「らくらくボイス」というソフトを使えば便利に音声ファイルを作成できる。でも無料でやろうと思えばできなくもない。次回はその方法をまとめてみるつもり。


それから、スクリーンリーダーではないけれど、「電子かたりべプレイヤー」でもMisaiさんはしゃべってくれるらしい。これはスタパ氏の記事「今時の音声合成ソフトウェア」を読んで分かった。

関連リンク:
株式会社ナレッジクリエーション » xpNavo

当ブログ関連記事:
VoiceTextのMisakiさん
オープンソースのスクリーンリーダNVDA
カテゴリ:Fire Vox
WindowsXPにSAPI5音声を入れるには


posted by takayan at 19:29 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2008年04月12日

SAPI5の音声ファイルを作るWSHスクリプト

前回の続き。xpNavoを導入したので新しくSAPI5の音声が使えるようになった。この音声を使った音声ファイルを作るスクリプトを考えてみた。最初、pythonでpyTTSというモジュールを使ってやってみたら、意外に簡単にできた。でも、pythonよりもWSHで作った方が誰でも使えて便利だろう。WSHはWindowsXPならば標準装備の環境のはずだから、こっちのほうが役立つはずだ。

そういうわけでWSHで作ってみた。僕はBASICで考えるのが嫌いで嫌いでたまらないので、JScriptで書いてみた。JS拡張子は環境によってはスクリプトとして動かないので、wsf拡張子にした。なお、このスクリプトは、SAPI5が利用できるWindowsXPパソコンを対象としている。

お約束。私takayanは、このプログラムによって生じる一切の不具合、影響などに関する損害は一切感知しません。 それに同意いただいた方のみご利用ください。改変自由です。

↓↓↓ダウンロード
textvoice.zip

解凍ソフトを使って適当な場所で解凍すると二つのWSHのスクリプトが入っている。textvoice.wsfは文書ファイルを引数にして、それを音声ファイルに変換する。sendto.wsfは、このtextvoice.wsfのショートカットを「送る」メニューに登録する。

これがスクリプトの全文
var startTime = new Date();
var shell = WScript.CreateObject('WScript.Shell');
var fs = WScript.CreateObject('Scripting.FileSystemObject');
var voice = WScript.CreateObject('SAPI.SpVoice');
var stream = WScript.CreateObject('SAPI.SpFileStream');

var args = WScript.Arguments;
if ( args.length == 0 ){
shell.Popup( 'ファイル名を示す引数がないので、終了します'
, 0, '報告', 0 );
WScript.Quit();
}

var path = fs.GetParentFolderName( WScript.ScriptFullName );

for( var i = 0; i<args.length; i++ ) {

var name = args(i);

// ファイルの存在を確認しておく
if ( !fs.FileExists( name ) ) {
if ( fs.FolderExists( name ) ) {
shell.Popup( '"' + name + '"はフォルダなので変換をスキップします'
, 5, '報告', 0 );
} else {
shell.Popup( '"' + name + '"は存在しないので変換をスキップします'
, 5, '報告', 0 );
}
continue;
}

var txtName = name;
var wavName = name + '.wav';
var mp3Name = name + '.mp3';
var extendedName = txtName;

// 必要ならばテキストに変換
var extend = fs.GetExtensionName(txtName);
if ( extend != '' && extend != 'txt' ) {
// xdoc2txtがあれば、まずテキストに変換する
var d2t = fs.BuildPath( path, 'xdoc2txt.exe' );
if ( fs.FileExists( d2t ) ) {
extendedName = txtName + '.' + extend;
fs.CopyFile( txtName, extendedName );
var d2tcommand = '"' + d2t + '" -f -n "' + extendedName + '"';
shell.Run( d2tcommand, 0, true );
fs.DeleteFile( extendedName );
txtName += '.txt';
}
}

// wavファイルに変換
stream.open( wavName, 3 );
voice.AudioOutputStream = stream;
var h = fs.OpenTextFile( txtName );
while (!h.AtEndOfStream) {
var line = h.ReadLine();
voice.Speak( line, 0 );
}
h.Close();
stream.close();
var last = wavName;

// lameがあればさらにmp3に変換
var lame = fs.BuildPath( path, 'lame.exe' );
var lameoptions = '';
if ( fs.FileExists( lame ) ) {
last = mp3Name;
var lamecommand = '"' + lame + '" ' + lameoptions
+ ' "' + wavName + '" "' + mp3Name + '"' ;
shell.Run( lamecommand, 0, true );
fs.DeleteFile( wavName );
}

// 文書一時ファイルの削除
if (extendedName!=txtName) {
fs.DeleteFile( txtName );
}
}

// 経過時間の計算
var finishTime = new Date();
var timeStr = "";
var diff = finishTime.getTime() - startTime.getTime();
var hour = Math.floor(diff/(60*60*1000));
if (hour!=0) {
timeStr += hour + '時間';
}
diff -= hour * (60*60*1000);
var min = Math.floor(diff/(60*1000));
if (min!=0) {
timeStr += min + '分';
}
diff -= min * (60*1000);
var sec = diff / 1000;
if (timeStr) {
timeStr += Math.floor(sec+0.5) + '秒';
} else {
timeStr = sec + '秒';
}
WScript.Echo( '変換完了です\n経過時間:' + timeStr );



プログラムをみるとすぐに分かるが、外部実行ファイルとして、xdoc2txt.exeやlame.exeを使えるようにしてある。無くてもこのスクリプトは使えるが、あるといいことがある。

xdoc2txt.exeがスクリプトと同じフォルダにあると、PDFやワード文書などテキスト以外の文書ファイルでもまともに変換してくれるようになる。xdoc2txt.exeが無いと拡張子がなんであろうとテキストファイルとみなす。もう一つのlame.exeはwavファイルをmp3に変換するプログラム。これがスクリプトと同じフォルダにあると、最終的にできる音声ファイルはmp3形式になる。

これらは同梱していないので、必要ならばそれぞれ下記の場所からダウンロードしてスクリプトと同じフォルダに入れておく。

・xdoc2txt.exeの入手先
EB series support page

・lame.exeの主な入手先
Lame MP3 Encoder Binariesなど


青空文庫などにあるテキストファイルを音声ファイルに変換し、iPodなどで聞いてみるのもいい。ただそれをするにはこのままだと難しい。ルビもしくはルビが振られた漢字を正規表現を使って削除する操作が必要になるだろう。また章やサイズ毎にファイルを切り分ける工夫をしないと、まるのまま聞き続けるのは大変だろう。

ためしに、このスクリプトで「吾輩は猫である」を丸ごとmp3に変換してみた。すると完了するのに一時間以上かかってしまった。そんなものかもしれない。変換時間の見当が付かないときは、最初からあまり大きなファイルは変換しない方がいい。


おまけのスクリプトとして下に示す「送る」メニューに変換コマンドを登録するWSHスクリプトも作ってみた。手作業でやればいいことだけれど、自動化するとどうなるか、やってみた。

これを実行すると、textvoice.wsfを「音声ファイルに変換」という名前で登録する。文書ファイルを選択して、右クリックまたはアプリケーションキーでメニューを開き、送るメニューの「音声ファイルに変換」を選ぶと、選択されているファイルと同じ場所に生成してくれる。複数のファイルも選択できる。

下で配布しているファイルを適当な場所で解凍し、sendto.wsf を実行すると、「送る」メニューに登録をしてくれる。既に登録しているのであれば、今度は削除するかどうかを聞いてくる。そのあとで再度登録するかを聞いている。

var name    = '音声ファイルに変換';
var command = 'textvoice.wsf';

var shell = WScript.CreateObject('WScript.Shell');
var fs = WScript.CreateObject('Scripting.FileSystemObject');

var link = fs.BuildPath( shell.SpecialFolders('SendTo'), name + '.lnk' );

if ( fs.FileExists( link ) ) {
shell.Popup( '「' + name + '」は既に送り先に登録されています'
, 0, '報告', 0 );
var button = shell.Popup( '送り先から「' + name + '」を削除しますか?'
, 0, '確認', 4+32 );
if( button == 6 ) {
fs.DeleteFile( link );
shell.Popup( '送り先から「' + name + '」を削除しました'
, 0, '報告', 0 );
} else {
WScript.Quit();
}
}

var button = shell.Popup('送り先に「' + name + '」を登録しますか?'
, 0, '確認', 4+32 );

if( button == 6 ) {
var shortcut = shell.CreateShortcut(link);
var path = fs.GetParentFolderName( WScript.ScriptFullName );
shortcut.TargetPath = fs.BuildPath( path, command );
shortcut.Save();

shell.Popup( '送り先に「' + name + '」を登録しました', 0, '報告', 0 );
}



このスクリプトは僕が考えたものだけど、lame.exeやxdoc2txt.exeを使ったり、送るメニューなどを使うという手法は以前紹介した「ドキュメントトーカ」で使われているもの(関連記事:WindowsXPにSAPI5音声を入れるには)。misakiさんの声にこだわらなければ、「ドキュメントトーカ」は日本語合成音声の入手手段としておすすめである。このスクリプトを利用しなくても標準で音声ファイルに変換できるし、SAPI5だけでなくSAPI4の音声も使うことができる。

最近、「ドキュメントトーカ Plus V2.1」のフリー版が公開された。製品版に入っている日本語合成エンジンが入っていないなど、いくつかの制限がある。最初にアナウンスがはいるが音声ファイルも作成できる。

製品情報 ドキュメントトーカ 日本語音声合成エンジン for Windows - クリエートシステム開発株式会社


僕のプログラムは、基本的なことしかしていない。音質も生で聞くときよりも落ちている感じがする。他にもいろいろ改良の余地があるだろうが、とりあえず、ここまで。


更新:pathの獲得の仕方など、いろいろ気づいたところを修正(2008年4月12日23:50)


posted by takayan at 18:22 | Comment(8) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2008年04月15日

自分の声の合成音声

さっきNHKの9時のニュース「news watch 9」を見ていたら喉の癌で声帯を切除し自分の声を失った人が、自分の声の合成音声を使って仕事に復帰できたという話題をやっていた。この人は大学の先生なのだが、キーボードで文章を打ち込みながら、それを合成音声にしゃべらせて、講義をしていた。素晴らしいことだ。

大学の先生にとって声を失うということは、教壇に立て講義ができなくなるということ。この先生は声帯の摘出前にこのソフトを知ることができ、自分の声のデータベースを残すことができた。

そのご本人が牧 泉教授。ご自分のサイトでこのソフトについての説明している。
大阪芸術大学・牧泉先生のホームページ
ここには、以前の講演のときの音声と、それと同じ台詞を音声合成にしゃべらせた音声が公開されており、比較できる。

ここで使われているソフトが、ポルックスター。
販売窓口:AQUARIUS最先端研究所 Polluxstar
ここでは、サンプル音声や、この製品を取り上げた新聞記事なども紹介されている。

Mクラス80万円(期間限定)か。自分の声帯を失ってしまうというのならば、自分の声を残すためならこれくらい安いのかもしれない。ソフト開発はOKI。


posted by takayan at 23:08 | Comment(0) | TrackBack(0) | 音声合成 | このブログの読者になる | 更新情報をチェックする

2008年04月17日

青空文庫のテキストを音声ファイルにするWSHスクリプト

追記 2008.8.28
これを拡張した aozoravoice2.wsf というのを作りました。
青空文庫のテキストを音声ファイルにするWSHスクリプト2
新しい方は、いろいろ複雑な処理ができるようになっています。そのぶん、ちょっと時間はかかってしまいますが。
こちら aozoravoice.swf もまだ公開しておきますので、お好みでお使いください。
追記終わり


この前のスクリプトを拡張して作ってみた。簡易的に青空文庫で配布されているテキストを音声ファイルに変換できるようにしてみた。

免責事項。私takayanは、このプログラムによって生じる一切の不具合、影響などに関する損害は一切感知しません。 それに同意いただいた方のみご利用ください。改変自由です。

↓↓↓ダウンロード
aozoravoice.zip ver.1.0.4
※分割したとき(標準)、m3u形式のプレイリストも出力するようにしました。
※分割数の桁が最低桁数を超えるとエラーが出てしまう点を修正しました。

解凍ソフトを使って適当な場所で解凍すると二つのWSHのスクリプトが入っている。aozoravoice.wsfは青空文庫のテキストファイルを引数にして、それを音声ファイルに変換する。sendto.wsfは「送る」メニューに「青空文庫テキストを音声に変換」を登録する。WindowsXPでのみ動作確認をしている。


基本的に以前のtextvoice.wsfを素直に拡張したものなので、xdoc2txt.exe、lame.exeも使える。今回はxdoc2txtはなくてもいいけれど、とりあえずそのまま使えるようにしてある。詳しいことは、SAPI5の音声ファイルを作るWSHスクリプトに書いたことと同じだ。

前回書いたように、ルビを削除したり、複数ファイルに分割したりできるようにしてみた。
ただ、漢字をルビで置き換えられるようにしてみたが、ルビが振られる漢字は、近くでまた現れたときにはわざわざルビが振られない。そのため漢字をルビで置き換えるように設定しても、二度目からのものは漢字のままになってしまう。この対策として、漢字とルビの一時的なデータベースを作って置換していけばいいのだろうが、面倒なのでやっていない。

このaozoravoice.wsfの最初の方には次のような変数宣言文がある。
var ruby_mode = 2; // 青空文庫のルビへの対応 0:何もしない、1:ルビを削除、2:ルビに置換
var divide_flag = true; // 分割するかどうか
var numbering_flag = true; // ファイル番号を最初に読み上げるかどうか
var keta = 3; // 分割ファイルの番号最低桁数
var limit = 5000; // 分割の基準となる文字数
ここを書き換えることでいくつか動作を変えることができる。
ruby_modeはルビをどうするかを決める。モードは三種。0,1,2のどれかを入れる。分割フラグdivide_flagはtrueかfalseを指定する。falseならば分割しない。trueならば、limitの文字数を基準にファイルを分割する。改行単位で文章は処理されるので、このlimitをあふれたらファイルが分割される。分割が選ばれているときはファイルに番号がつけられる。このときketaの値で桁数をそろえられる。小さい数の時は桁をそろえるために左側が0で必要なだけ埋められる。それから、numbering_flagがtrueのときは、ファイルの先頭で番号を読み上げる音声が挿入される。

どの音声エンジンを使うか、読み上げ速度をいくつにするかは、このプログラムでは設定できない。コントロールパネルの音声認識を開いて音声合成タブを開いて設定する。

使い方
1. 青空文庫で作品のテキストファイルをダウンロードする。
2. aozoravoice.wsfを使って変換する。変換には二つの方法がある。aozoravoice.wsfのアイコンの上に、青空文庫テキストファイルをドラッグ&ドロップする。もしくは、テキストファイルで右クリックをして「送る」メニューから「青空文庫テキストを音声に変換」を選ぶ。

これで音声ファイルが、テキストファイルと同じフォルダにできるはず。

分割したときに一緒に作成されるプレイリストファイル(m3u形式)を、iTunesやWindows Media Playerで開くことで、連続再生させることができる。(ver1.0.2〜)

最後に、巨大なファイルを変換してしまうといつまで経っても終わらないので、問題が起きたのかどうか分からない。必ず短い作品で動作確認を。


posted by takayan at 03:18 | Comment(2) | TrackBack(0) | aozoraVoice | このブログの読者になる | 更新情報をチェックする

2008年04月18日

プレイリストとか

分割してファイルを出力できるようにしたのはいいけれど、これを連続再生させるようにしないと意味がない。

そこで、aozoravoice.wsfでm3u拡張子の付いたファイルも一緒に作成するようにしてみた。これを開くと順序通りに連続再生してくれる。

m3u形式のプレイリストとは言っても、ただファイルの名前を並べただけのもの。相対パスつまりファイル名だけ記述している。必要ならば、メモ帳とかのテキストエディタで開いて編集できる。

WindowsMediaPlayerが出力するものには「#EXTINF」とか曲の情報らしきものも書き込まれているけれど、それがなくてもプレイリストとしてはちゃんとはたらくので何もつけなかった。m3u形式は名前からして本来mp3のファイルを指定するためのものなのだろうが、wavファイルを指定してもなんとかなるみたいだ。

Windows Media Playerに関連づけされていている場合、ダブルクリックで連続再生が開始される。

m3uファイルがitunesに関連づけされていている場合、つまりダブルクリックでiTunesが起動する場合は、ライブラリにプレイリストに書かれている曲が追加され、連続再生が開始される。

iTunesのメニューを使う場合は次の二つの方法がある。「ファイル」メニューの「ファイルをライブラリに追加」(CTRL+O)を選んでm3uファイルを開くと、そのプレイリストに書かれている曲がライブラリに登録される。再生は始まらない。もう一つ、ファイルメニューの「インポート」(CTRL+SHIFT+O)を選んでm3uファイルを開くと、プレイリストとして登録される。



このスクリプトのサンプルとして、「走れメロス」
前半部分

青空文庫の下記のテキストを、スクリプトを使ってルビを読みとして用いて音声にファイルに変換した。使っている合成音声はScanSoft Kyoko_Full_22kHz。

全音声ファイル:merosu.zip

朗読原文:図書カード:走れメロス - 青空文庫


posted by takayan at 04:01 | Comment(0) | TrackBack(0) | aozoraVoice | このブログの読者になる | 更新情報をチェックする

2008年04月19日

M3U形式プレイリストを作るWSHスクリプト

テキストエディタで編集できるプレイリストというのは便利だな。ということで、フォルダを放り込んだらそこにある音楽ファイルのリストを作るスクリプトを作ってみた。

選択したファイルやフォルダ内に含まれる音楽ファイルのリストを作ってくれる。曲順が気に入らなければ、メモ帳なんかで開いて、切り取り・貼り付けで動かせばいい。要らない曲は削除すればいい。


免責事項。私takayanは、このプログラムによって生じる一切の不具合、影響などに関する損害は一切感知しません。 それに同意いただいた方のみご利用ください。改変自由です。

↓↓↓ダウンロード
playlistup.zip ver.1.0.1
※冗長なところをちょと修正

解凍ソフトを使って適当な場所で解凍すると二つのWSHのスクリプトが入っている。playlistup.wsfはプレイリストを作るスクリプト本体。sendto.wsfは「送る」メニューに「簡易プレイリストの作成」を登録するもの。WindowsXPでのみ動作確認をしている。

いつものように「送る」メニューに登録して使う。フォルダが一つだけだとその中にプレイリストを作る。ファイルが一つだけか複数のファイルやフォルダのときはプレイリストをそれが置いてあるところに作る。プレイリスト内のファイルは相対パスで表記される。フォルダの中は再帰的に検索される。ファイルは名前順で並べ替えてある。

プレイリストのファイル名はそれが作られるフォルダ名に".m3u"が付いたものになる。既に同じ名前のファイルがあるときは上書きされる。

音楽ファイルかどうかは拡張子だけで判断している。どの拡張子を音楽ファイルと見なすかは、最初の方に宣言している変数extensionsに記述してある。

プレイリストを作る機能はそれぞれのミュージックプレイヤーについていて、マウスで簡単に順序を入れ替えたりできるから、それがちゃんと使いこなせる人にとってはこのスクリプトは不要だと思う。




<job id="playlistup"><script language="JScript">
var extensions = "wav|mp3|wma";
var fs = WScript.CreateObject('Scripting.FileSystemObject');
var args = WScript.Arguments;
if ( args.length == 0 ){
WScript.Echo( 'パラメータがないので終了します' );
WScript.Quit();
}

function filelist( full, path ) {
var list = new Array();
if ( fs.FolderExists( full ) ) {
var folder = fs.GetFolder( full );
var files = new Enumerator( folder.files );
var name = fs.GetFileName( full );
for ( ; !files.atEnd(); files.moveNext() ){
list.push( fs.BuildPath( path,
fs.BuildPath( name, fs.GetFileName( files.item() ) ) ) );
}
var folders = new Enumerator( folder.SubFolders );
for ( ; !folders.atEnd(); folders.moveNext() ) {
list = list.concat(
filelist( folders.item(), fs.BuildPath( path, name ) ) );
}
} else if ( fs.FileExists( full ) ) {
list.push( fs.BuildPath( path, fs.GetFileName( full ) ) );
}
return list;
}

var list = new Array();
var m3ufile;
var args0 = args(0);
if ( args.length == 1 && fs.FolderExists( args0 ) ) {
m3ufile = fs.BuildPath( args0, fs.GetBaseName( args0 ) + ".m3u" );
var folder = fs.GetFolder( args0 );
var files = new Enumerator( folder.files );
for ( ; !files.atEnd(); files.moveNext() ){
list.push( fs.GetFileName( files.item() ) );
}
var folders = new Enumerator( folder.SubFolders );
for ( ; !folders.atEnd(); folders.moveNext() ) {
list = list.concat( filelist( folders.item(), "" ) );
}
} else {
var parent = fs.GetParentFolderName( args0 );
m3ufile = fs.BuildPath( parent, fs.GetBaseName( parent ) + ".m3u" );
for ( var i = 0; i<args.length; i++ ) {
list = list.concat( filelist( fs.GetAbsolutePathName( args(i) ), "" ) );
}
}
list = list.sort();

var re = new RegExp( "\.(" + extensions + ")$", "i" );
var music = new Array();
var data;
while ( data = list.shift() ) {
if ( re.test(data) ) {
music.push( data );
}
}
if ( music.length ) {
var f = fs.CreateTextFile( m3ufile, true );
var data;
while ( data = music.shift() ) {
// WScript.Echo( data );
f.WriteLine( data );
}
f.Close();
WScript.Echo( "プレイリスト「", fs.GetFileName(m3ufile), "」を",
fs.GetParentFolderName(m3ufile), "に作成しました" );
} else {
WScript.Echo( "音楽ファイルはありませんでした" );
}
</script></job>


posted by takayan at 02:32 | Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年04月22日

Fire VoxでSAPI4音声を使う

SAPI5を使ったWSHスクリプトを書いて遊んでいたら、SAPI4でやり残していることを思い出した。Fire Voxを改造してSAPI4でも使えるようにしたのはいいのだが、CTRL+SHIFT+Aで連続読みをさせると突っ走ってしまうという問題があってまともに使えていなかった。それをちょっと修正してみた。もちろんclick,speakも対応させた。

Fire Voxで日本語をしゃべらせるには日本語SAPI5音声を用意しないといけない。SAPI4は無料で配布されているものもあるので、それでも使えるようにならないかといろいろやっている。

※先日までこのページで配布していたものは、まだまだ未完成なので、ここからのダウンロードリンクは削除した。このページからアドインをインストールした人は削除してください。

この試みにまだ興味がある人は、経過報告をこのブログか、Fire Vox - et-web開発室で書いていくので、よければまた見てください。現在はLH KenjiとLH Naokoを選ばないようにするものを置いている。

先のサイトでは「Fire Vox」を日本語化したものを二種類公開している。表示されるもしくは発音される英語の文字列を日本語に単純に置き換えた必要最小限の改造のものと、実験的に本家にない細かな改造を施したものの二つ。今回紹介するのはこの拡張版のほうだ。


Fire Voxは、Firefoxに最先端のWebアクセシビリティ機能を実装させる機能拡張。Charles L. Chen氏が開発している。
Fire Vox: A Screen Reading Extension for Firefox

本家のものも日本語のsapi5合成エンジンさえあればそれだけで日本語でちゃんと実用できる。ただメニューを読むたびに「has sub menu.」としゃべったりするのを気にしなければいいだけのこと。

Fire Vox本家は3.6にバージョンが上がっているが、今回こちらはまだ3.4のまま。Firefox3betaにも対応していない。

SAPI4での連続読みで起きる現象は最初から分かっていたが解決方法が分からないままだった。そのまま放置して忘れてしまっていた。今回いろいろ調べたら、問題は話し中かどうかの確認をTextDataDoneというのを使って捕まえていたせいだった。これだと読み終わりのタイミングがつかめないので、こうなってしまう。かわりにAudioStopという関数を使えばいいことに気づいた。

※いろいろ内容変更 2008/04/24


posted by takayan at 04:56 | Comment(0) | TrackBack(0) | Fire Vox | このブログの読者になる | 更新情報をチェックする