| 書籍化されたで! | 監修したで!(`ω´) | 絶版なってしもた | 大好評発売中です! | 少し書いたデ!(`ω´) | これにもな!(`ω´) | |
|
|
|
|
![]() |
![]() |
| YaneuLabs / YaneuraoGameSDK.NET / 掲示板 / やねうらおにメール / twitter / プロフィール |
クローズアップ現代で「初音ミク特集」をやるらしく、番組のディレクター自らが捨て身で番宣をしている動画がYouTubeにアップされている。
ところで、私も高校のとき(20数年前)に某社からとある麻雀ゲームをPCに移植できないかと言われて、それを検討するために音声合成のプログラムを書いたことがある。
当時、音声合成と言えばCSM音声合成(CSM = Composite Sinusoidal Modeling : 複合正弦波モデル)が主流だったと思う。当時ゲームアーツで働いていた三橋正邦氏が開発したCSM音声合成システムが特に有名だ。『シルフィード』(1986年)にはじまり、『ぎゅわんぶらあ自己中心派』(1987年)、『ゼリアード』(1987年)・『ヴェイグス』(1988年)といったゲームで採用されていた。*1
CSM音声合成自体は結構古い技術で1979年ごろにはすでにあった。*2
CSM音声合成はデータのサイズは比較的小さくなるのだが、使いこなすのが技術的にハードルが高く、また、再生データーの生成のために離散コサイン変換をしないといけないので当時のパソコンではデータを変換するのにとても時間がかかった。あと、宇宙人がしゃべっているような声になるのもその特徴だった。
NRTDRV(+CSM音声合成)で「もってけ!セーラーふく」を作ってみた
私は当時、CSM音声合成はハードルが高いと判断し、普通のADPCM(Adaptive Differential Pulse Code Modulation)で再生することにした。ところがADPCMだとメモリを結構食うので当時のPC(16KBぐらいしかメモリが使えない)にはきつく、ビットレートを落とすか何らかの工夫をせざるを得なかった。
そこで私は同じ小さい区間を数回ずつ再生するという方法をとった。「あー」という波形はずっと変わらないと仮定できるから、小さな「あ」のサンプリングしたものを繰り返し再生させるという方法だ。子音+母音で構成されている音ならば、256バイトのデータ(区間)を5回再生して、次の256バイトのデータを5回再生して、またその次の256バイトを…みたいな方法で必要なデータ量を削減した。
そうやって音素ごとにつなげると一応は何かしゃべっているようには聞こえるのだが、音質はすこぶる悪く、しかし、何度もデバッグと調整のために聴いているとだんだん自分の耳が慣れてきて、「ああ、これくらいならまだ判別可能だな」とか思いながらチューンしていくと、やがてどんどん音声が崩れて行った。
それを麻雀ゲームの移植が出来ないかと私に相談してきた某社の社長のところに持って行って「こんな音質なら出来るんですけど」とデモして聴かせたのだが、その社長は宇宙人の声にしか思えなかったらしく、麻雀をPCに移植するのは無理だという判断になり、麻雀を移植する話自体はお流れになった。
いまにして思えば、その音声合成たるや、とてもひどい出来で、上の「もってけ!セーラーふく」の動画の音声以下の、「宇宙人のおもしろボイス集」とでも言うべきものに仕上がっていた。
私が大学に入ったころには、もうそんな自分の高校時代の黒歴史みたいな音声合成のことはすっかり忘れていたのだが、『C Magazine』(1994年3月号)にリコーの人が作った音声合成プログラム「VC2」というのが付録についていて、しかもそれが結構よく出来ていたので感動して、「ああ、いまのPCならメモリも潤沢にあるし(注 : 当時のPCのフリーメモリは数百KB程度でしたが、フリーメモリが数10KBの世界から移り住んできたのでそれが無限に近いメモリのように思っていました)、これだけメモリがあれば俺にも出来るんじゃね?」と思い、サクっと作ってみたのだが、どうも音素と音素のつなぎ目(たとえば、音素「い」と音素「く」を個別にサンプリングして「いく」という単語を再生させる)が綺麗につながらない。
ちなみに、Cマガに載っていたリコーのプログラムは、このつなぎ目も結構のパターンを持っていて、何やらうまくやっているようだった。
その記事の内容はよく覚えていないのだが、たぶん、
1) 「い」を再生して
2) 「い」と「く」との間の音を再生して
3) 「く」を再生する
といった感じだったのだと思う。1)と2)の音はクロスフェードさせる。すなわち、1)を次第に弱くしていき、それと入れ替わるように2)を次第に強くしていく。同様に、2)と3)の音もクロスフェードさせる。そんな感じ。
現代の音声合成技術がその当時からどれほど技術的に進歩したのかは私はよく知らない。このつなぎ目をなめらかにする部分が音声合成におけるひとつの大きなハードルだと思うのだが、そこはすでに超えているのだと思う。
私が初音ミクで不自然だと感じるのは、普通、人間だと直前の音を引きずることがあるのだが、初音ミクにはそれがないことだ。
直前の音を引きずるというのは、例えば、「water」という単語をネイティブスピーカーが /wˈɔːṭɚ/の/t/音を発音しきれずに/r/に近い音として発音するケースだ。(このとき日本人には「ワラー」と聴こえる) 同様に「writer」なら/rάɪṭɚ/の/t/が/r/に近い音になる。(このとき日本人には「ライラー」と聴こえる)
初音ミクにはこれがない。前の音を決して引きずらない。これは短所であり、長所でもある。特に、『初音ミクの消失』ではこれが初音ミクらしい早口言葉になっており、これが長所として活かされていると思う。
【PV完全版】 初音ミクの消失 DEAD END 【MotionGraphics】
それでは、音声合成では、どうやれば前の音を「引きずる」ことが出来るようになるのかという話になるのだが、人間の発声の仕組みに相当する物理モデルを組み立てて、それをシミュレーションしてはどうかと思う。声帯の筋肉に相当するパラメーターを動かしてみて、それが発声される音が狙った音素に近づくようにパラメーターを機械学習で調整する。
そこまで出来れば、あとは音を連続的に、変化させることは可能だろうし、声帯の筋肉をあまり無理せずに動かすように制約を入れれば、前の音を引きずったりするのではないかと思う。人間の発声の仕組みがどれくらい解明されているのか私は知らないので、適当なことを言ってるかも知れない。ごめん。
そんなことを考えていたら20年ぶりに音声合成プログラムを書いてみたくなった。
.
*1:http://nrtdrv.sakura.ne.jp/index.cgi?page=CSM%B2%BB%C0%BC%B9%E7%C0%AE%A4%C8%A4%CF%A1%A9
*2:嵯峨山茂樹先生の論文「複合正弦波モデル化 (1979)」 → http://hil.t.u-tokyo.ac.jp/~sagayama/profile/contributions.html

口・歯・舌・喉の形と動き、それに伴う口中の空気の流れとその変化が重要なのではと思っています。
過去に音楽情報処理に足をつっこんでいて今はゲームプログラマさせてもらっています。
ちょっと気になる点があったので質問です。
CSMは合成時にはフーリエ変換は必要ないと記憶しています。(分析時には各正弦波に積算する振幅を計算するのに必要でしたが)
もしかしてそのゲームではゲーム内で分析も行なっていたのでしょうか?
分析していないにしても昔のゲームで音声合成が採用されていたことにはだいぶ驚きですが。
はい、合成時の問題ではなくデータ生成時の問題です。
再生するためのデータを作成する時に、当時のPCでは1秒の再生データを作成するために(離散コサイン変換で)数時間かかるらしかったのです。(私が試したわけではないので「数時間かかる」というのは伝え聞きなのですが。まあ、CPUのクロックが4MHzの時代ですから…)
あとは、CSM音声合成のためのドライバーの実装上、YAMAHAのFM音源チップ(YM2151など)のCSMモードを使いたかったのですが(当時のYAMAHAのFM音源チップにこのCSMモードが備わっていました)、インターバルタイマー(タイマー割り込み)が使えないPCですと、これを使うのがすこぶる難しく、現実的には不可能じゃないかと言われていました。
あとは、当時、YM2151の資料が私の手元にはなくて、『試験に出るX1』(故 祝 一平氏)の著書だけが頼りでしたので、そのへんの仕様も私にはよくわかってなくて、まあ、そんなYM2151のCSMモードなんか使わずに自前でサイン波合成してCSMすればいいんですけど、当時、CSMについてそこまで私の理解が至ってなくて…。
いま思い返すといろいろとgdgdな感じでどう考えても黒歴史っぽいのですが、そろそろ20年前のプログラムのリベンジをしないといけませんかね、これは。
謹んでお詫び申し上げます。
懐かしい話題に思わずコメント付けてしまいます。
CSMは、技術としては元々あったものですから、「開発」というより「実装」ですかね。また、私はデータ作りのほうを担当していて、88SRで鳴らすほうのプログラムは、昨年夏に亡くなった宮路武氏が作っていました。
当時は、そもそも音声データ取り込みのためのA/Dコンバータのボードから自作でした。解析プログラムはPC-9801で動かしていたのですが、どうすると正しいデータが出てくるのか模索しながらの解析プログラム作成だったのでBASICで動かしていました。1秒分の音声データ解析に2時間くらいかかっていたでしょうか。
もっとも、セリフ一つの解析は、帰るときにプログラム立ち上げたら、次の朝には終わっており、そもそも延々とセリフをしゃべらせるようなモノもなかったので、時間はさほど苦になりませんでした。
問題は変換が終わった後、ピークを4つ拾う作業のほうでした。
当時のセリフはほんとんど社内の人間がしゃべっていました。(音質がアレなので、プロの声優を雇ってもしょうがない。その割に、録音機材は社内に転がっていた2トラ38のオープンリールなんて大げさなものを使っていたのですが・・・)
しかし、声質によって、キレイにピークが4つ拾える人、うまく拾えない人がいて、社内での声優?の選定基準は、基本的に「変換でピークがうまく拾える人」でした。
(ワタシの声もそこそこうまく拾えたので、シルフィードでは宇宙の帝王ザカリテをやらせてもらっています)
ちなみに、88SRでは、CSMモードの付いた音源チップ搭載が、セールスポイントの一つになっていたようですが、肝心のNECがCSMモードを使いこなせておらず、アーツのゲームが(音質はちょっとアレながら)しゃべりまくるのに驚いた、という逸話もあるようです。
前のコメントだと、手作業でピークを拾っていたと誤解されるかもしれない書き方でしたが、もちろん、ピークを拾う作業も変換プログラムの中でやっていました。
人によっては、パワースペクトルが明確な山を持つのですが、うまく出ない人もいて、拾うのが一苦労でした。一度プログラムで拾った後、手作業で修正を加えることも考えたのですが、作業量が膨大になって、さすがに無理でした。
> 当時は、そもそも音声データ取り込みのためのA/Dコンバータのボードから自作でした。
あー、そうですね。私はX68000の発売直後(1988年ごろ)に音声合成をやっていたので、音声の取り込みはX68000を持っている友だちにお願いしていました。『シルフィード』の発売は1986年(製作はその1年ぐらい前から?)ですから、A/Dコンバーターのボードを自作するところからなのですね。私は何か業務用の機材があるのかと思っていましたが、まさか自作とは…。
こうして、ときとしてITの歴史上の人物(?)に直接コメントをいただけたりするのが、インターネットの凄いところで、歴史的傍証と言いますか、今日の私の記事が単なる私の与太話だったものが、一瞬にして音声合成の歴史として資料的価値の高い記事に昇華されたのであります。
> ちなみに、88SRでは、CSMモードの付いた音源チップ搭載が、セールスポイントの一つになっていたようですが、肝心のNECがCSMモードを使いこなせておらず
そうですね。CSMモードは設計がピーキーだったのもあって…。
CSM音声合成では『ゼリアード』のオープニングにあった「我二千年の眠りより蘇り、再びこの世に君臨せん」という台詞が私の一番のお気に入りで、プログラマー同士のオフ会ではこの台詞をよく口真似して笑いをとったものです。
いまYouTubeを探してたらゼリアード実況プレイの動画があって、1:23〜1:34にこの台詞がありました。
http://www.youtube.com/watch?v=WCfEWE1z3TI
長々とすみません。
A/Dコンバータは、81年ごろ、東大マイコンクラブの駒場祭で「音階認識システム」を作るために一度自作しています。当時のPC-8001では、音声認識はさすがに難しいけれど、音程を認識して、歌を楽譜にするくらいのことは出来るのでは、ということから始まったプロジェクトでした。マイクに向かって歌うと、8001の画面に楽譜が出るという、まあ、今の技術からみるとなんともたわいも無いものでしたが、NHKやフジテレビの番組にも取り上げてもらった記憶があります。(フジの番組では、松田聖子に歌わせたのではなかったかな)
そのときのA/Dコンバータを、9801に繋ぐために改造したか、ほぼ同じモノを9801用に作ったか、このどちらかが手元に合ったのを使いました。
このA/Dコンバータは、シルフィードよりさらに前、ASCIIでPC-6001用のAXシリーズを作ったときに一度使っています。
AX-7のデモンストレーションプログラムでは「AX-7 by ASCII」としゃべっているのですが、これは、6001のPSGを使ったもので、最大周波数で音を鳴らしておいて、16段階のボリュームを細かくコントロールして4ビットのPCM再生を試みるという荒業でした。
画面が出ていると割り込みで再生レートが乱れるので、AX-7のデモでは、音声が出ている時には画面が出ないという無茶な仕様になっています。
彼は、教会の「アーメン」、武器屋の「冷やかしなら出て行け」、宿屋の「はい一名さんご案内」、賢者の「レベルアップの呪文」も担当しています。
これらの声は、先日発売になったゲームアーツベストコレクション
http://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%BC%E3%83%84-%E3%83%99%E3%82%B9%E3%83%88%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-VA/dp/B006QU1XUE
に全部収録されています。
ゼリア−ドのBGMは、今回初のCD化です。よろしかったら是非どうぞ(と、ここで軽く宣伝。とはいっても、売れてもワタシにはお金が入るわけじゃないんだけど)
そうそう、賢者の呪文は、ちょっとしたセリフの逆再生になっています。
納品されたセリフを普通に解析して、吐き出されたデータを逆から再生するだけなので、作業は簡単でした。
どんなセリフの逆回しか?
うーん。それは、ネットに転がっている音声ファイルや、先のCDから取り込んで、逆に再生してみてください。
ちなみに呪文は2種類納品されて、片方がボツ、片方が採用になったのですが、ボツになったほうのセリフは「寿限無寿限無五劫の擦り切れ」の逆再生でした。
> 6001のPSGを使ったもので、最大周波数で音を鳴らしておいて、16段階のボリュームを細かくコントロールして4ビットのPCM再生を試みるという荒業でした。
そう言えば、PC-8001のような、beep音しか鳴らないマシンでMMLで定義した音楽を再生するプログラムが当時(1985年ごろ)、PCマガジン等に同時多発的に掲載されていて、ソースコードを見るとbeep音のon/offだけでやっていたように思います。(PC-8001のbeep音にはボリューム調整がなかったんでしょうね。)
音量調整が出来る場合、おっしゃるような、ボリュームレジスタに値を書きこんで、擬似的にPCMを実現しているソースコードも私はいろいろ見たことがあります。このテクニック、当時、流行ったんですかね…。
ただ当時のことを思い返すに、ボリュームは、あまり線形性がよろしくて、ずいぶんひずんだ音になっていた気がします。
http://simesabat.blog.shinobi.jp/Entry/9/
連続音をデータベースで持つというのはあるみたいですね
http://akita-neru.at.webry.info/200908/article_2.html
diphone合成というらしい
ttp://d.hatena.ne.jp/keyword/UTAU%CF%A2%C2%B3%B2%BB%B2%BB%B8%BB
http://ja.wikipedia.org/wiki/%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90
というかWIKIPEDIAが
もちろん、そのまま4bitのPCMデータとして扱ったらダメです。ボリュームは対数目盛になっているので。
ボリューム0と1の差に対して、ボリューム14と15の差は、何十倍もあります。なので、256段階でサンプリングしたデータを、0〜5まではボリューム0で、6〜12まではボリューム1で・・・・160〜200はボリューム14で、201〜255をボリューム15で、というようなテーブルを作って変換してデータを作っています。
当時は、PC-6001でボリュームを直線的に変化させて鳴らした音を、A/Dコンバータで取り込み直してテーブルの値を決定していました。
ちなみに、ボリュームコントロールが無い状態でも、8bitでサンプリングしたデータを、128を境界線としてプラスとマイナスに分けてオンオフで再生するやり方で(かなり強引な方法ですが)なんとか聞ける音を作ることが可能です。言ってみれば、1ビットのPCMですね。
・・・あと、調べてみたらAXシリーズのデモで音声を出したのは、AX-7ではなくてAX-6でした。
そんなことが実現できたら、フォルマント兄弟が大変喜びます。
> 当時は、PC-6001でボリュームを直線的に変化させて鳴らした音を、A/Dコンバータで取り込み直してテーブルの値を決定していました。
うわ!!当時にそこまでされてたんですか。いやー、脱帽です。フィードバック制御にも通ずるものがありますね。
> 128を境界線としてプラスとマイナスに分けてオンオフで再生するやり方で(かなり強引な方法ですが)なんとか聞ける音を作ることが可能です。
こっちは私も自分でプログラムを書いたことがあります。X68000で広まっていた萌えボイス(?)のデータをフロッピーに入れてもらってきたものをX1で再生するときにそういうプログラムを書きました。昭和初期のラジオ放送のような「さらさら」した(?)ノイズが乗っていて、あれはあれで味がありました。
> 連続音をデータベースで持つというのはあるみたいですね
それはまあ、リコーのVC2以前からある一番お手軽でそれらしく聴こえる実装でして。いまどきのPCならメモリも潤沢にあるので、よく出現する連続した音素の組み合わせは長いもの(3音素とか4音素とか…)も持っておけば、かなり自然に聴こえるでしょうね。録音するのが大変でしょうけども。
↑*2
> そんなことが実現できたら、フォルマント兄弟が大変喜びます。
フォルマント兄弟って私、知らなくて、いま初めて↓の動画を見たのですが、面白すぎてドミノ・ピザが食べたくなってきました!
http://www.youtube.com/watch?gl=JP&hl=ja&v=FFvFlpVjEjM
この場合、128で分けるのではなく、1ビットDAC的な動作をさせたほうが音質的に有利なはずです。(可能なかぎり高周波で動作させて値によって0と1を割り振る。たとえば64なら0を3回で1を1回というふうに。)PC-9801のBEEP音でPCM再生する方法として使われていました。
はい、まあ、mitsuさんはゲームの製作者サイドですから(音声素材自体も自分たちで用意できる立場ですから)、「1ビットDAC的な動作」をさせるぐらいなら、サンプリングレートを上げた音声素材を用意しなおすというのは、前提条件としてあるのではないでしょうか。
要するに、
1) 8bitでサンプリングしたデータを「1ビットDAC的な動作」で再生させる
2) 8倍のサンプリングレート × 1bit でサンプリング したものをbeepのオン/オフで再生させる
のとでは、同じデータ量ですが2)のほうがいい音質になるという…。
つまり、
既存の8bitでサンプリングされた音声データをなるべく忠実にbeepで再生したいなら → 1)
音声素材自体を作りなおして良いなら → 2)
という話。
僕自身もATRに行って、人間の発声の様子のレントゲン動画を見ましたが、難しいだろうことは容易に想像出来ました。
で、フィジカルに発声させる口腔のモデルの場合でも、現在の所、こんな面白く不気味な感じのものしか出来てません。
https://www.youtube.com/watch?v=J_R7fgo0FLc
このモデルだと、ペペローションでも含ませない限り、口の中カラッカラですね。
http://www.splab.ee.sophia.ac.jp/Vocal_Tract_Model/index-j.htm
flashで音声合成する音声合成もどきが面白いです。
まずは母音のフォルマントがキーワードというかんじですが数式の意味がさっぱりわかりません(汗
http://wonderfl.net/c/nHqP
https://twitter.com/#!/tekisuke/status/175798044602798081
> tekisuke やねうらおさんのところでCSM音声合成話が。 t.co/lVA4iQY2 VSTプラグイン化したXacaliteの話をしたい気もするがおそれおおくて書き込めないw t.co/ypCrzUIW
CSM音声合成のVSTプラグインですか!素敵!