特開2002-221978の帰趨#3

 

特開2002-221978「ボーカルデータ生成装置、ボーカルデータ生成方法および歌唱音合成装置」とは、初音ミクに実装されていると思われる発明で、母音のタイミングを音符のタイミングと一致させる為に、子音を先行して発音させるものです。

【課題】 音節を構成する音素のうち、子音に対向する音素を音符の発生タイミングにあわせて発声することにより、伴奏に合わせたバーチャルシンガによる自然な歌唱を実現する。
【解 決手段】 歌詞に対応した音節毎の発音タイミングデータを含むボーカルデータを予め記憶する。再生処理を始めると、音符「ド」に対応した音節「さ」を発声させると き、子音「s」の発声動作を音符の発音タイミングよりも前に始め、母音「a」の発音タイミングを音符「ド」の発音タイミングに合わせる。これにより、伴奏 に遅れることなく、バーチャルシンガによる自然な歌唱を可能にする。

当該特許出願の、最初の拒絶理由通知(17条の2第1項1号)にて引用された発明 特開平10-319993 「データ編集装置」 の権利化後である特許3518253 「データ編集装置」 の請求項1を見てみました。特許発明の技術的範囲の判断は、原則として請求範囲が基準となるためです。(特許法70条1項) 括弧部分は請求項の理解のために付記しました。

【請求項1】

(公知部分1) 再生テンポに非依存のデュレーションデータにより発生時間が規定された複数の音素データから構成される音節データを含む音声データと

(公知部分2) 該音声データの発音タイミングを規定する再生テンポに依存したタイミングデータとを含むソングデータにおける

(公知部分3) 前記音節データを編集することができるデータ編集装置であって、

(特許要件1) 前記音節データを構成する前記複数の音素データのうちの1つを指定する音素指定手段と、

(特許要件2)
 前記音素指定手段により指定される音素データに対応するデュレーションデータを前記再生テンポの指定とは独立して指定される発生時間に変更する変更手段と

 を有するデータ編集装置。

特開平10-319993 の権利化後である特許3518253 「データ編集装置」 のデータ編集装置とは、Vocaloid Editor の編集機能などを指すと思われます。

 これを、特開2002-221978「ボーカルデータ生成装置、ボーカルデータ生成方法および歌唱音合成装置」の請求項1と対比します。

【請求項1】
(公知部分1) メロディおよび歌詞に対応するボーカルデータを生成するボーカルデータ生成装置であって、

(特許要件1) 歌詞の音節を前記メロディに対応する音符に割り当てる歌詞割当手段と、

(特許要件2) 前記音節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミングを前記音符に対応する発音タイミングに合わせるべく各音節に対応する発音タイミングデータを生成する発音タイミングデータ生成手段と、

(特許要件3) 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高データをボーカルデータとして生成し、このボーカルデータを出力するデータ出力手段と、

 を備えたことを特徴とするボーカルデータ生成装置。

特開2002-221978 のボーカルデータ生成装置とは、Vocaloid Editor の音声出力機能を指すと思われます。最も大きな相違点は、引用発明は音素データの指定手段を有するのに対して、当該発明は音素データの指定手段が無い事です。
 出願人は、最初の拒絶理由通知に対する意見書で音素データの指定無しに発音タイミングを自動調整できることを主張しています。しかし、先願の特許要件を削除したならば、それは上位概念の発明となるため、拒絶査定(特許法49条)を受ける理由となると思います。
 出願人のヤマハ(株)は、Vocaloid の発声タイミングの自動調整機構は、特許3518253 「データ編集装置」 ではカバーされていないことに気づいたのだと思います。そして、特開2002-221978 を審査請求して特許権取得を狙ったが、特許3518253 「データ編集装置」 の権利化前である 特開平10-319993 「データ編集装置」で極めて近い発明が公知化されていた為、相違点は当業者に容易に想到できるとして審査官に拒絶査定を受けたのだと推定します。


 さて、今回の件で、特開平10-319993 「データ編集装置」 及び権利化後の特許3518253 「データ編集装置」 を見てみました。

H10319993_fig4
 これを Vocaloid1 Editor のPhonome編集画面と対比してみてください。酷似しているので驚いてしまいました。

 図4      - Phonome編集画面
 ノート     → (対応なし)
 発音時間   ⇔ POSITION
 歌詞      ⇔ LYRICS
 音素列データ ⇔ PHONETIC SYMBOLS
 呼気      → (対応なし)
 (対応なし)  ← PROTECT

Phenome_edit

段落0050は、ブレス音の実装を記載しています。Vocaloid2 の実装では、ブレスは音素として扱われていますが、当該発明では音素データの属性として扱われています。

【0050】呼気データ65は、息継ぎを表現することを示すデータである。音素データPDの後に呼気データ65が位置すると、その音素データPDを発音した後、息継ぎ表現を行うのため発音を無音状態に変化させることを示す。呼気データ65は、音素列データ55の最後に位置する場合に限らず、音素データPDと他の音素データPDの間に位置してもよい。

段落0052は、ベロシティ(VEL)の実装を記載しています。50音の音素ごとに子音の長さを調整するのではなく、更に細かな音素に分解し、その発音長(デュレーション)を変更可能としてます。

【0052】音節編集機能とは、該各音素のデュレーションを編集することができる機能である。例えば、音素「kha」のデュレーションを4×7.5msから、3×7.5ms又は5×7.5msに変更することができる。この機能を使えば、デュレーションを自由に設定することができるため、例えば音節「か」を発音する場合にも、多様な「か」の発音を行うことができる。

段落0053は、VOCALOIDには全く実装されていない機能について言及しています。

【0053】また、音節編集機能は、音節を構成する音素列データに新たな音素を付け加えることができる。例えば、音素列「CL+kha+aj」に新たな音素を付け加えることにより、鼻にかかったような「か」の発音を実現することも可能になる。さらに、音素を付け加える代わりに、音節を付け加えるようにしてもよい。

 上記のことを総合すると、特開平10-319993 「データ編集装置」 は、VOCALOID のプロトタイプを元に特許出願したものと推定します。VOCALOIDの編集ウインドウと酷似した画面が掲載されており、VOCALOIDに搭載された機能の多くが記載されており、かつVOCALOIDの技術発表(2003年)以前だからです。
 この推定が正しいとすると、特開平10-319993 「データ編集装置」の出願日の1997年5月22日には、既にVOCALOIDプロトタイプが開発済みであったことになります。

| | コメント (0) | トラックバック (0)

特開2002-221978の帰趨#2

特開2002-221978「ボーカルデータ生成装置、ボーカルデータ生成方法および歌唱音合成装置」とは、初音ミクに実装されていると思われる発明で、母音のタイミングを音符のタイミングと一致させる為に、子音を先行して発音させるものです。

【課題】 音節を構成する音素のうち、子音に対向する音素を音符の発生タイミングにあわせて発声することにより、伴奏に合わせたバーチャルシンガによる自然な歌唱を実現する。
【解 決手段】 歌詞に対応した音節毎の発音タイミングデータを含むボーカルデータを予め記憶する。再生処理を始めると、音符「ド」に対応した音節「さ」を発声させると き、子音「s」の発声動作を音符の発音タイミングよりも前に始め、母音「a」の発音タイミングを音符「ド」の発音タイミングに合わせる。これにより、伴奏 に遅れることなく、バーチャルシンガによる自然な歌唱を可能にする。

特開2002-221978が拒絶査定を受けたので、ヤマハ株式会社は拒絶査定不服審判(特121条)を請求し、同時に手続補正書を提出しました。最初の拒絶理由通知の「引用文献1のものはノートオン/オフのタイミングを直接かえて、このタイミングを実現しているが、これを、ノートオン/オフのタイミングは変えずに、音声波形の読み出し時期を制御することにより実現することは当業者が容易に発明をすることができたものである。」の意見に真っ向から反論しています。


【書類名】      手続補正書(方式)
【提出日】      平成17年 1月17日
【あて先】      特許庁長官 殿
【事件の表示】
  【審判番号】   不服2004-25743
  【出願番号】   特願2001- 19141
【補正をする者】
  【識別番号】   000004075
  【氏名又は名称】 ヤマハ株式会社
【代理人】
  【識別番号】   100098084
  【弁理士】
  【氏名又は名称】 川▲崎▼ 研二
  【電話番号】   03-3242-5481
【発送番号】     415026
【手続補正1】
 【補正対象書類名】 審判請求書
 【補正対象項目名】 請求の理由
 【補正方法】    変更
 【補正の内容】
  【請求の理由】
  【手続の経緯】
   出願            平成13年1月26日
   拒絶理由の通知(発送日)  平成16年6月8日
   意見書(提出日)      平成16年8月6日
   手続補正書(提出日)    平成16年8月6日
   拒絶査定(起案日)     平成16年11月8日
   同謄本送達(送達日)    平成16年11月16日
   手続補正書(提出日)    平成17年1月17日

  【拒絶査定の要点】
(a)原査定の拒絶理由は、本願の請求項1~8に係る発明は、特開平10-31999
3号公報(以下、引用例という)に記載された発明に基づいて、その出願前にその発明の
技術の分野における通常の知識を有する者が容易に発明をすることができたものであるか
ら、特許法第29条第2項の規定により特許を受けることができない、というものである

(b)その理由は、要するに、引用例には、音声波形を通常のノートオンタイミングで読
み出すと、子音の発音時間分だけ聴取者には発音が遅れたように聞こえる課題を解決する
ため、ノートオンのタイミングが母音の発音開始点となるように音声素片の読み出しタイ
ミングを調整することが記載されているため、本願発明は、この引用例に記載された発明
に基づき容易に発明することができたものである、というものである。
  【本願発明が特許されるべき理由】
(a)本願発明の説明
 請求項1に係る発明は、「メロディおよび歌詞に対応するボーカルデータを生成するボ
ーカルデータ生成装置であって、歌詞の音節のデータ数と前記メロディに対応する音符の
データ数とを合わせて、該歌詞の音節を該メロディに対応する音符に割り当てる歌詞割当
手段と、前記音節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミ
ングが前記音符に対応する発音タイミングに合うように各音節の発音タイミングを指示す
る発音タイミングデータを生成する発音タイミングデータ生成手段と、前記音節の音素列
データ、前記発音タイミングデータおよび前記音節に対応した音高データをボーカルデー

タとして生成し、このボーカルデータを出力するデータ出力手段と、を備えたことを特徴
とするボーカルデータ生成装置」を要旨とするものである。
 かかる発明によれば、歌詞の音節のデータ数とメロディに対応する音符のデータ数とを
合わせて、該歌詞の音節を該メロディに対応する音符に割り当て、歌詞の音節を音素に分
け、母音の音素の発音タイミングが音符に対応する発音タイミングに合うように各音節の
発音タイミングを指示する発音タイミングデータを生成するので、操作者の手を全く煩わ
せることなく、歌詞に含まれる音節のうち子音および母音からなる音節のみを対象とし、
音符のタイミングより遅れて聞こえることのないよう自動的に音節の発音タイミングを調
整することができる。
 請求項2は、この請求項1におけるボーカルデータの出力態様に関し、「ボーカルデー
タをシステムエクスクルーシブメッセージに含ませて出力する」なる技術的限定を加えた
ものである。
 請求項3~6は、請求項1または2にさらなる技術的限定を加えて従属項、請求項7お
よび8は請求項1および2を各々方法のカテゴリに書き換えた請求項である。
(b)補正の根拠の明示
 同時に提出する手続補正書により、請求項1、2、7および8における歌詞割当手段ま
たは歌詞割当工程は、「歌詞の音節のデータ数と前記メロディに対応する音符のデータ数
とを合わせて、該歌詞の音節を該メロディに対応する音符に割り当てる」ものであること
を明らかにする補正を行った。この補正は、本願の出願当初の明細書における段落004
2の記載を根拠とするものである。
(c)引用発明の説明
 引用例の段落0060~0065には、音節毎に発音タイミングを早める程度を示すク
ロック数を定めた変換テーブルを記憶し、各音節の音声データの発生タイミングをその変
換テーブルに定められたクロック数だけ早める旨が開示されている。また、引用例の段落
0059および0060には、音節が音として聞こえるタイミングが子音のデュレーショ
ンにより遅れる旨が開示されている。また、引用例の段落0063には、子音の音素を含
まない音節については、発音タイミングを早める程度を示すクロック数を変換テーブルに
おいて定める必要がない旨が開示されている。
(d)本願発明と引用発明との対比
 引用発明は、子音のデュレーションにより聴取者には発音が遅れたように聞こえる課題
を解決するため、音節の発音タイミングを早めるものである点において、請求項1に係る
発明と共通の特徴を有する。

 しかしながら、請求項1に係る発明と引用発明との間には、次の相違点がある。すなわ
ち、請求項1に係る発明は、「音節を音素に分け、各音節を構成する音素のうち、母音の
音素の発音タイミングが前記音符に対応する発音タイミングに合うように各音節の発音タ
イミングを指示する発音タイミングデータを生成する」
に当たり、「歌詞の音節のデータ
数と前記メロディに対応する音符のデータ数とを合わせて、該歌詞の音節を該メロディに
対応する音符に割り当てる」という技術的特徴を有するのに対し、引用発明はこの技術的
特徴を有しない。
 音節には、母音のみからなる音節と、子音および母音のみからなる音節とがあるが、請
求項1に係る発明によれば、「歌詞の音節のデータ数と前記メロディに対応する音符のデ
ータ数とを合わせて、該歌詞の音節を該メロディに対応する音符に割り当てる」ため、各
音符には1つずつ音節が割り当てられ、それらのうち子音および母音からなる各音節につ
いては、「母音の音素の発音タイミングが前記音符に対応する発音タイミングに合うよう
に各音節の発音タイミングを指示する発音タイミングデータを生成する」ことができる。
このように請求項1に係る発明によれば、歌詞の中に含まれる音節のうち子音および母音
からなる音節のみを自動的に選択して調整対象とし、音符より遅れて聞こえることのない
ようにその音節の発音タイミングを調整することができる、という引用発明からは得られ
ない格別な効果が得られる。
このような特徴は、引用例には開示されておらず、示唆すら
されていない。

 よって、請求項1に係る発明は、引用発明に基づき容易に発明することができたもので
はなく、特許要件を具備すると確信する次第である。
 他の請求項に係る発明は、請求項1に係る発明にさらなる技術的限定を加えたもの、あ
るいは請求項1に係る発明のカテゴリのみを変更したものである。
 よって、これらの請求項に係る発明も、請求項1と同様の理由により、特許要件を具備
すると確信する次第である。
  【むすび】
 以上のように、本願発明は引用例に記載された発明とは全く別異であり、引用例から容
易には想到し得ないものであるから特許要件を具備するものと確信致します。よって本願
に対し、特許査定を賜りますようお願いする次第です。

これに対しての前置報告書は以下のものです。

                前置報告書

 審判番号         不服2004-25743
 特許出願の番号      特願2001-019141
 特許庁審査官       渡邊 聡         8622 5D00
 作成日          平成17年 2月23日

 この審判請求に係る出願については、下記の通り報告する。

                 記
 平成17年1月17日付け手続補正書にて新たに付加された構成(歌声生成時
に音符数と音節数とを対応させてメロディ付き音声を出力する点)は下記の周知
文献に記載されている。

本願出願前周知の技術事項を示す文献
特開2000-105595号公報

前置審査で、審査官は新たな先行技術として特開2000-105595「歌唱装置及び記録媒体」を指摘しました。出願人は日本ビクター株式会社です。この先行技術の要約を見てみます。

【課題】 任意のテキストファイルを自動的にメロディ にのせて歌にしてしまう歌唱装置がなかった。
【解決手段】 供給されるテキストデータはテキスト解析部4によってその音節データに変換され、供給されるテキストデータと共にメロディ 生成部6に出力される。また、音楽生成用SMF2aもメロディ 生成部6に出力される。そして、音節データは音楽生成用SMF2aのメロディ ーに割り当てられてシーケンサ部8に出力され、ソフトシンセ12によって、音節データを音声に変換して音程を変化させながらサウンド出力部14から出力する。

 VOCALOIDを先取りしたような発明を日本ビクターが出願していたものだと感心してしまいました。しかし、日本ビクターは、この発明が単発だったらしくてあとが続いていません。

 さて、拒絶査定不服審判は請求棄却審決となりましたが、その理由を見てみます。まずは引用発明との一致点と相違点を認定し、相違点について当業者が容易に想到することの論理を構築しております。このあたりは審査基準を厳格に守っていますね。

(一致点)
 「メロディおよび歌詞に対応するボーカルデータを生成するボーカルデータ生成装置であって、
 歌詞の音節のデータと前記メロディに対応する音符のデータとを合わせて、該歌詞の音節を該メロディに対応する音符に割り当てる歌詞割当手段と、
 前記音節を音素に分け、音節を構成する音素のうち、母音の音素の発音タイミングが前記音符に対応する発音タイミングに合うように音節の発音タイミングを指示する発音タイミングデータを生成する発音タイミングデータ生成手段と、
 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高データをボーカルデータとして生成し、このボーカルデータを出力するデータ出力手段と、
を備えたボーカルデータ生成装置。」
である点で一致し、次の各点で相違する。

(相違点1)
 本願補正発明は、歌詞の音節のデータ数とメロディに対応する音符のデータ数とを合わせて、歌詞の音節をメロディに対応する音符に割り当てているのに対し、引用例に記載された発明は、歌詞の音節のデータとメロディに対応する音符のデータとを合わせて、歌詞の音節をメロディに対応する音符に割り当てるものではあるが、歌詞の音節のデータ数とメロディに対応する音符のデータ数までを合わせるとは明記しない点。

(相違点2)
 本願補正発明は、各音節を構成する音素のうち、母音の音素の発音タイミングが音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音タイミングデータを生成しているのに対して、引用例1に記載された発明は、音符の発生タイミングに対して発音の遅れを感じた歌詞(例えば、「か」)についてのみ音節の発生タイミングを指示して発音タイミングデータを生成している点。

(4)判断
(相違点1について)
 上記相違点1について判断するに、(i)通常、メロディを構成する音符の総数と歌詞を構成する音節の総数とは、ほぼ同数とされていることは、歌を愛好する人なら誰でも経験していることである。
(ii) また、メロディを構成する音符の総数と歌詞を構成する音節の総数とを、ほぼ同じ数とし、メロディが奏でられている間中、歌詞を歌唱することは、例えば、特開2000-105595号公報(特に、段落【0039】~【0041】の記載を参照。)にその旨の記載があるように当業者のみならず歌を愛好する人には周知自明な技術常識である。
 以上のことに鑑みると、引用例1に記載された発明に上記周知技術常識を適用して、本願発明の如く構成することは、当業者が適宜なし得ることである。

(相違点2について)
 上記相違点2について判断するに、(i)引用例1に記載されているように(前掲(ア)~(ウ)参照。)、音節が母音と子音からなる場合、母音の発声タイミングを音符の発生タイミングに合わせると音符が示す音の発生から遅れて、音節の音が聞こえる現象は、当分野の当業者の間に広く認識されている音現象であり、しかもこの問題を解消するためには音符の発生タイミングよりも子音の発声タイミングを少し前にずらせば解決すること(このことは人間が歌を歌うとき無意識に行っていることは、本願補正発明の明細書の段落【0004】における記載でも指摘されている。)も当業者の間に広く知られている自明な技術事項である。(ii)そして、引用例1に記載された発明は、音節及び音声データ編集時の操作性を高めるために、母音と子音とからなる音節すべてに対して等しく母音の発声タイミングを変更する構成を採用せず、敢えて、音符の示す音の発生から遅れを感じた歌詞のみに対して母音の発声タイミングを変更する構成を採用しているのであるから、音印象の如何にかかわらず一律に発声タイミングの変更を行うようにすることは、当業者が適宜なし得ることである。そして、その奏する効果の程も当業者の当初の予測の範囲を超えるものではない。

(5)むすび
 以上のとおり、本願補正発明は、引用例1に記載された発明及び周知技術に基づいて当業者が容易に発明をすることができたものであるから、特許法第29条第2項の規定により特許出願の際、独立して特許を受けることができるものではなく、特許法第17条の2第5項で準用する同法126条第5項の規定に違反するものであるから、平成17年1月17日付けの手続補正は、特許法第159条第1項で準用する同法第53条第1項の規定により却下すべきものである。

自分は、特開2000-105595「歌唱装置及び記録媒体」の図面に驚いてしまいました。まるで「初音ミク」の予言のように感じてしまいます。


20080514232703141204_2
20080514232703255814

 ついでに、最初の拒絶理由通知に記載された特開平10-319993 「データ編集装置」 を調べてみました。この特許の出願人はヤマハ(株)じゃないですか!しかも権利化されています。だったら、特開2002-221978 の権利化に拘らなくてもよかったのではと思います。

| | コメント (2) | トラックバック (0)

特開2002-221978の帰趨

特開2002-221978の帰趨について hidonさんからご質問を受けましたので、調査してみました。データベースは特許電子図書館の経過情報検索です。

特開2002-221978「ボーカルデータ生成装置、ボーカルデータ生成方法および歌唱音合成装置」とは、初音ミクに実装されていると思われる発明で、母音のタイミングを音符のタイミングと一致させる為に、子音を先行して発音させるものです。

【課題】 音節を構成する音素のうち、子音に対向する音素を音符の発生タイミングにあわせて発声することにより、伴奏に合わせたバーチャルシンガによる自然な歌唱を実現する。
【解 決手段】 歌詞に対応した音節毎の発音タイミングデータを含むボーカルデータを予め記憶する。再生処理を始めると、音符「ド」に対応した音節「さ」を発声させると き、子音「s」の発声動作を音符の発音タイミングよりも前に始め、母音「a」の発音タイミングを音符「ド」の発音タイミングに合わせる。これにより、伴奏 に遅れることなく、バーチャルシンガによる自然な歌唱を可能にする。

表1、特開2002-221978の経過情報

                                                                                                                                                                
出願記事特許 2001-019141 (平13.1.26) 出願種別(通常)
公開記事2002-221978 (平14.8.9)
発明の名称ボーカルデータ生成装置およびボーカルデータ生成方法
出願人ヤマハ株式会社 <YAMAHA CORPORATION>
発明・考案・創作者劔持 秀紀
公開・公表IPC
国際分類 第7版
   G10L 13/00         
国際分類 第4版
   G10L  3/00        J
出願細項目記事査定種別(拒絶査定)
審判記事登録記録査定不服審判 2004-025743 請求日(平16.12.16) 審判(判定含む) 請求不成立 最終処分日(平19.7.26)

この特許出願は、拒絶査定(特49条)を受けたのち、ヤマハ(株)は平成16年12月16日に拒絶査定不服審判(特121条)を請求しましたが、平成19年7月26日に請求棄却審決を受け、拒絶が確定したようです。よって、この特許出願は不成立のまま終わりました。

 最初の拒絶理由通知書は以下のものです。特開平10-319993号公報を理由に進歩性欠如(29条2項)で拒絶しています。

              拒絶理由通知書

 特許出願の番号      特願2001-019141
 起案日          平成16年 5月31日
 特許庁審査官       渡邊 聡         8622 5C00
 特許出願人代理人     川▲崎▼ 研二 様
 適用条文         第29条第2項


 この出願は、次の理由によって拒絶をすべきものである。これについて意見が
あれば、この通知書の発送の日から60日以内に意見書を提出して下さい。

                理 由

 この出願の下記の請求項に係る発明は、その出願前日本国内又は外国において
頒布された下記の刊行物に記載された発明に基いて、その出願前にその発明の属
する技術の分野における通常の知識を有する者が容易に発明をすることができた
ものであるから、特許法第29条第2項の規定により特許を受けることができな
い。

     記   (引用文献等については引用文献等一覧参照)
(請求項1乃至10について)
 下記の引用文献1には楽音合成装置において、ボーカル信号を合成するときの
タイミングについて、ボーカルの子音については人が聞き取りにくく、発音タイ
ミングは母音の発音開始時点に調整した方がよいことが記載されている。
 引用文献1のものはノートオン/オフのタイミングを直接かえて、このタイミ
ングを実現している
が、これを、ノートオン/オフのタイミングは変えずに、
声波形の読み出し時期を制御することにより実現すること
は当業者が容易に発明
をすることができたものである。
 上記以外の構成は、楽音発生装置の技術分野において周知の技術事項である。

 この拒絶理由通知書中で指摘した請求項以外の請求項に係る発明については、
現時点では、拒絶の理由を発見しない。拒絶の理由が新たに発見された場合には
拒絶の理由が通知される。

           引 用 文 献 等 一 覧
1.特開平10-319993号公報
------------------------------------
           先行技術文献調査結果の記録            
                                                                        
・調査した分野  IPC第7版  G10L13/00
                        DB名   
・先行技術文献                             
                                    
 この先行技術文献調査結果の記録は、拒絶理由を構成するものではない。

 これに対する2004年8月6日付けの意見書は以下のものです。先行技術文献が1件だけということは、審査官が相当の自信をもって拒絶理由通知を打ってきていると思われます。よって、出願人側は、本腰を入れて掛からないと特許を受けることはできません。
 しかし、出願人の代理人による意見書はなんだかベクトルがぶれている感じがします。当該発明の優位性を「音素の選択が不要である」ことならば、その点を重点的に述べて有利な効果を主張し、かつ補正により主張した点が明確になるようにすべきですが、そのような対処はなされていません。

【書類名】      意見書
【提出日】      平成16年 8月 6日
【あて先】      特許庁審査官 渡邊 聡 殿
【事件の表示】
  【出願番号】   特願2001- 19141
【特許出願人】
  【識別番号】   000004075
  【氏名又は名称】 ヤマハ株式会社
【代理人】
  【識別番号】   100098084
  【弁理士】
  【氏名又は名称】 川▲崎▼ 研二
  【電話番号】   03-3242-5481
【発送番号】     202468
【意見の内容】
(1)審査官殿は、本願の請求項1~10に係る発明は、その出願前に日本国内又は外国
において頒布された特開平10-319993号公報(以下、引例という)に記載された
発明に基づいて当業者が容易に発明することができたものであるから、特許法第29条第
2項の規定により特許を受けることができない、とのご認定である。
 しかしながら、本出願人は、この認定には承服できず、別紙手続補正書により本願発明
の要旨を明確にするとともに、以下に意見を申し述べる。
(2)本願の請求項1に係る発明は、別紙手続補正書により明らかにしたように「前記音
節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミングが前記音符
に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音タイミン
グデータを生成する」ものである。なお、この補正は、本願の出願当初の明細書の段落0
045、0053の記載および図面の図9を根拠としている。
 引例の段落0060~0065の記載によると、引例のものは、音節毎に発音タイミン
グを早める程度を示すクロック数を定めた変換テーブルを記憶し、子音の音素を含む音声
データの発生タイミングをその子音に対応したクロック数だけ早めるものである。しかも
引例によると、この子音に対応したクロック数だけ早める処理は、操作者が発音の遅れ
た歌詞(例えば「か」)を指定することにより行われる(段落0065)

 しかしながら、本願の請求項1に係る発明は、このように、操作者からの指示に従い、
変換テーブルを利用して、音声データの発生タイミングを早めるものではない。本願の請
求項1に係る発明の特徴は、「母音の音素の発音タイミングが音符に対応する発音タイミ
ングに合うように各音節の発音タイミングを指示する発音タイミングデータを生成する」
点にある。

 かかる発明によれば、音節が子音と母音からなる場合であっても、母音の発音タイミン
グが音符の発音タイミングに合ったボーカルデータが自動的に作成されるため、操作者の
手を全く煩わせることなく各音節の母音の発音タイミングが音符のタイミングとが整合し
たボーカルデータが得られる。

 このような技術的特徴は、引例には開示されておらず、示唆もされていない。他の独立
請求項2、7、8も同様である。
(3)結論
 従って、本願発明は特許要件を具備するものと確信致します。よって本願に対し、特許
査定を賜りますようお願いする次第です。

2004年8月6日付けの手続補正書は以下のものです。

【書類名】      手続補正書
【提出日】      平成16年 8月 6日
【あて先】      特許庁長官 殿
【事件の表示】
  【出願番号】   特願2001- 19141
【補正をする者】
  【識別番号】   000004075
  【氏名又は名称】 ヤマハ株式会社
【代理人】
  【識別番号】   100098084
  【弁理士】
  【氏名又は名称】 川▲崎▼ 研二
  【電話番号】   03-3242-5481
【発送番号】     202468
【手続補正1】
 【補正対象書類名】 明細書
 【補正対象項目名】 発明の名称
 【補正方法】    変更
 【補正の内容】
  【発明の名称】ボーカルデータ生成装置およびボーカルデータ生成方

【手続補正2】
 【補正対象書類名】 明細書
 【補正対象項目名】 特許請求の範囲
 【補正方法】    変更
 【補正の内容】
【特許請求の範囲】
  【請求項1】 メロディおよび歌詞に対応するボーカルデータを生成するボーカルデ
ータ生成装置であって、
 歌詞の音節を前記メロディに対応する音符に割り当てる歌詞割当手段と、
 前記音節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミング
前記音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音
タイミングデータを生成する発音タイミングデータ生成手段と、
 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高デ
ータをボーカルデータとして生成し、このボーカルデータを出力するデータ出力手段と、
を備えた
 ことを特徴とするボーカルデータ生成装置。
  【請求項2】 メロディおよび歌詞に対応するボーカルデータを生成するボーカルデ
ータ生成装置であって、
 歌詞の音節を前記メロディに対応する音符に割り当てる歌詞割当手段と、
 前記音節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミング
前記音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音
タイミングデータを生成する発音タイミングデータ生成手段と、
 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高デ
ータをボーカルデータとして生成し、このボーカルデータをシステムエクスクルーシブメ
ッセージに含ませて出力するデータ出力手段と、を備えた
 ことを特徴とするボーカルデータ生成装置。
  【請求項3】 請求項1または2記載のボーカルデータ生成装置において、前記デー
タ出力手段は、前記ボーカルデータをコーラス毎に分けて出力することを特徴とするボー
カルデータ生成装置。
  【請求項4】 請求項1または2記載のボーカルデータ生成装置において、前記デー
タ出力手段は、前記ボーカルデータをフレーズ毎に分けて出力することを特徴とするボー
カルデータ生成装置。
  【請求項5】 請求項1または2記載のボーカルデータ生成装置において、前記デー
タ出力手段は、前記ボーカルデータを各息継ぎ区間毎に分けて出力することを特徴とする
ボーカルデータ生成装置。
  【請求項6】 請求項1または2記載のボーカルデータ生成装置において、前記デー
タ出力手段は、前記ボーカルデータを小節毎に出力することを特徴とするボーカルデータ
生成装置。
  【請求項7】 メロディおよび歌詞に対応するボーカルデータを生成するボーカルデ
ータ生成方法であって、
 歌詞の音節を前記メロディに対応する音符に割り当てる歌詞割当工程と、
 前記音節を音素に分け、各音声を構成する音素のうち、母音の音素の発音タイミング
前記音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音
タイミングデータを生成する発音タイミングデータ生成工程と、
 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高デ
ータをボーカルデータとして生成し、このボーカルデータを出力するデータ出力工程と、
を備えた
 ことを特徴とするボーカルデータ生成方法。
  【請求項8】 メロディおよび歌詞に対応するボーカルデータを生成するボーカルデ
ータ生成方法であって、
 歌詞の音節を前記メロディに対応する音符に割り当てる歌詞割当工程と、
 前記音節を音素に分け、各音声を構成する音素のうち、母音の音素の発音タイミング
前記音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音
タイミングデータを生成する発音タイミングデータ生成工程と、
 前記音節の音素列データ、前記発音タイミングデータおよび前記音節に対応した音高デ
ータをボーカルデータとして生成し、このボーカルデータをシステムエクスクルーシブメ
ッセージに含ませて出力するデータ出力工程と、を備えた
 ことを特徴とするボーカルデータ生成方法。

【手続補正3】
 【補正対象書類名】 明細書
 【補正対象項目名】 0001
 【補正方法】    変更
 【補正の内容】
   【0001】
  【発明の属する技術分野】
 本発明は、例えばパソコンによるコンピュータ・ミュージックに用いて好適なボーカル
データ生成装置およびボーカルデータ生成方法に関する。

【手続補正4】
 【補正対象書類名】 明細書
 【補正対象項目名】 0010
 【補正方法】    変更
 【補正の内容】
  【0010】
 本発明は、以上の問題に鑑みてなされたものであり、伴奏に合わせたバーチャルシンガ
による自然な歌唱を実現することのできるボーカルデータを生成するボーカルデータ生成
装置およびボーカルデータ生成方法を提供することを目的としている。

【手続補正5】
 【補正対象書類名】 明細書
 【補正対象項目名】 0011
 【補正方法】    変更
 【補正の内容】
   【0011】
  【課題を解決するための手段】
 上記目的を達成するために、この発明は、歌詞の音節をメロディに対応する音符に割り
当て、音節を音素に分け、各音節を構成する音素のうち、母音の音素の発音タイミングが
音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する発音タイ
ミングデータを生成し、音節の音素列データ、発音タイミングデータおよび音節に対応し
た音高データをボーカルデータとして生成するボーカルデータ生成装置およびボーカルデ
ータ生成方法を提供する。

 出願人が意見書で反論し、手続補正書で引用文献との差異を出そうとしたにも係わらず、審査官による拒絶査定を受けました。
 審査官は、進歩性(29条2項)を否定し得る論理として、「音素を選択せずに全てに処理を適用することは当業者にとって自明である」という点を指摘しており、当該拒絶査定は妥当とおもいます。

              拒絶査定


 特許出願の番号      特願2001-019141
 起案日          平成16年11月 8日
 特許庁審査官       渡邊 聡         8622 5D00
 発明の名称        ボーカルデータ生成装置およびボーカルデータ生
              成方法
 特許出願人        ヤマハ株式会社
 代理人          川▲崎▼ 研二


 この出願については、平成16年 5月31日付け拒絶理由通知書に記載した
理由によって、拒絶をすべきものである。
 なお、意見書並びに手続補正書の内容を検討したが、拒絶理由を覆すに足りる
根拠が見いだせない。

備考
 出願人は意見書にて下記のとおり主張している。
    記
 引例の段落0060~0065の記載によると、引例のものは、音節毎に発音
タイミングを早める程度を示すクロック数を定めた変換テーブルを記憶し、子音
の音素を含む音声データの発生タイミングをその子音に対応したクロック数だけ
早めるものである。しかも、引例によると、この子音に対応したクロック数だけ
早める処理は、操作者が発音の遅れた歌詞(例えば「か」)を指定することによ
り行われる(段落0065)。
 しかしながら、本願の請求項1に係る発明は、このように、操作者からの指示
に従い、変換テーブルを利用して、音声データの発生タイミングを早めるもので
はない。本願の請求項1に係る発明の特徴は、「母音の音素の発音タイミングが
音符に対応する発音タイミングに合うように各音節の発音タイミングを指示する
発音タイミングデータを生成する」点にある。
 かかる発明によれば、音節が子音と母音からなる場合であっても、母音の発音
タイミングが音符の発音タイミングに合ったボーカルデータが自動的に作成され
るため、操作者の手を全く煩わせることなく各音節の母音の発音タイミングが音
符のタイミングとが整合したボーカルデータが得られる。
 出願人の主張する、操作者が発音遅れの歌詞を指定する必要性については、引
用文献のものにおいて、
単にすべての歌詞を指定すれば本願発明のものと同じと
なることは自明のこと
であり、引用文献1のものは操作者の自由度を高めるため
に、あえて、遅れを感じた歌詞のみ指定できるようになっているのであるから、
あらかじめこのような機能を設けずにすべての歌詞について、一律に、発音タイ
ミングの変更を行うようにすることは当業者が適宜なしえたこと
である。
 そして、引用文献1にの【0059】、【0060】の記載を見れば、その技
術思想は、結局本願発明と同じ、音声波形を通常のノートオンタイミングで読み
出すと、子音の発音時間分だけ聴取者には発音が遅れたように聞こえる課題を解
決するため、ノートオンのタイミングが母音の発音開始時点となるように音声素
片の読み出しタイミングを調整することが記載されているから、本願発明は上記
拒絶理由通知書に記載された発明に基づき当業者が容易に発明をすることができ
たという拒絶の理由は解消していない。
                                 以上
続きは明日にでも記載します。

| | コメント (1) | トラックバック (0)

MIKU_TALK 0.2.1 ソース(VSQ生成部)

 MIKU_TALK 0.2.1 のVSQ生成部ソースを公開します。サーバ上のCGIスクリプトとして動作しますが、ローカルPC上で動くように変更するのは、それほど難しくはないと思います。説明なくとも理解できるよう、できるだけ沢山のコメントを入れました。これを参考に更に良いものが世の中に生み出されればと思います。

#!/usr/local/bin/perl
BEGIN { unshift(@INC, "/cgi-bin/lib"); }
########################################################################
#
#    Filename : miku_talk021.cgi @infoseek
#    Charcode : UTF-8
#
#    Released on 26/Apr/2008, Programmed by A.Izumi
#
#
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Jcode;
use MIDI;        # MIDI-Perl のインストールを要する。(非標準モジュール)
#
#    プロバイダ固有部分:ワークファイルの相対書込み先
#
my $myWorkFolderPath = "work";

#
#    プロバイダ固有部分:URL
my $myUrl = "work";
my $myAdv = "";

$CGI::POST_MAX = 1024*1024*100;

#
#    ワークファイル書込みフォルダを作成しておく。
mkdir($myWorkFolderPath, 0777);

my $q = new CGI;
my $mySessionId = GetSessionId($q->remote_host);

my $myPostedString = $q->param("myText1");
my $myDebugMode    = $q->param("debug");

if( !defined($myDebugMode) ) {
  $myDebugMode = 0;
}
# 改行記号が \x0d の場合に \x0d\x0a に正規化する。
$myPostedString =~ s/\x0d\x0a/\x0d/g;
$myPostedString =~ s/\x0d/\x0d\x0a/g;
$myPostedString =~ s/%([0-9a-f][0-9a-f])/pack("C",hex($1))/egi;
$myPostedString = Jcode->new($myPostedString)->utf8;

#
#    入力された形態素のチェック
#
  my $maErrorLine = checkMa($myPostedString,$mySessionId);
  if( $maErrorLine > 0 ) {
    print $q->header(-type=>'text/html; charset=UTF-8');
    print $q->start_html(-lang=>'ja',
                     -charset  => 'UTF-8',
                     -encoding => 'UTF-8',
                     -title    => 'MIKU_TALK Ver. 0.2.0');
    print $myAdv, "\n";
    print $q->br;
    print $q->h1('MIKU_TALK はエラーを検出しました。'),
          $q->hr;
    print "MIKU_TALK は、".$maErrorLine."行目の形態素を読み取れません。\n";
    print $q->br;
    exit();
  }
  if( $myDebugMode != 0 ) {
    print $q->header(-type=>'text/html; charset=UTF-8');
    print $q->start_html(-lang=>'ja',
                     -charset  => 'UTF-8',
                     -encoding => 'UTF-8',
                     -title    => 'MIKU_TALK Ver. 0.2.0');
    print $myAdv, "\n";
    print $q->h1('MIKU_TALK がVSQファイルを生成しました。'),
          $q->hr,
          $q->br;
  }
  my $lockdir = "miku_lock";
  my $retry = 20;                            # リトライ回数セット
  while (!mkdir($lockdir, 0755)) {           # ロック作成。出来なければ待つ
    if (--$retry <= 0) {
       last;
    } # 20秒間ダメならあきらめて強行
    sleep(1);                              # 1秒待つ
  }
  my $myDebugPath = "./". $myWorkFolderPath. "/". $mySessionId. ".txt";
  my $myVsqPath = "./". $myWorkFolderPath. "/". $mySessionId. ".vsq";
  my $myVsqUrl  = $myUrl. "/". $mySessionId. ".vsq";

  WriteMA("ma000.txt",$myPostedString);
  $myPostedString = Hankaku2Zenkaku($myPostedString);
  WriteMA("ma001.txt",$myPostedString);
  $myPostedString = JoinTyouonKigou($myPostedString);
  WriteMA("ma002.txt",$myPostedString);
  $myPostedString = AddPhonetic($myPostedString);
  WriteMA("ma003.txt",$myPostedString);
  $myPostedString = AddSeparator($myPostedString);
  WriteMA("ma004.txt",$myPostedString);

  $myPostedString = ParseSentence($myPostedString);
  WriteMA("ma005.txt",$myPostedString);
  mecab2VsqGenerate( $myPostedString, $myVsqPath );

  my @myStatVsq = ();
  @myStatVsq = stat $myVsqPath;
  rmdir($lockdir);                           # ロックの削除

#
#    正常にVSQ生成できた。
#
  if( $myDebugMode != 0 ) {
#
#    デバッグモードでは、ダウンロードリンクを表示する。
#
    my $myVsqCgi = "miku_talk_dl021.cgi";
    $myVsqCgi   .= "?download_name=". $mySessionId. ".vsq";
    $myVsqCgi   .= "&source_path="  . $myVsqPath;
    $myVsqCgi   .= "&debug="        . $myDebugMode;
    print $q->a({href=> $myVsqCgi }, "VSQファイルのダウンロード");
    print $q->br;
    print "↑ ここをクリックしてください。";
    print $q->br;
    print $q->end_html;

  } else {
#
#    正常にVSQ生成できたなら、ダウンロードする。
#
    print $q->header(
        -content_type        => "audio/midi",
        -content_disposition => "attachment;filename=". $mySessionId. ".vsq"
      );
    my $contents;
    my @srcStat = stat $myVsqPath;

    open(hFile,"< ".$myVsqPath);
    binmode hFile;
    read hFile,$contents, $srcStat[7] + 1024;
    print $contents;
    close(hFile);
#
#    元ファイルは消す。
#
    unlink $myVsqPath;
  }
  exit;
########################################################################
#
#   サブルーチン名:WriteMA
#
#   第1引数:出力するファイルパス
#   第2引数:出力データ
#
sub WriteMA {
  open hFile,">".$_[0];
  my @myWords = split(/\n/, $_[1]);
  my $i=0;
  for($i=0; $i<@myWords-1; $i++) {
    print hFile $myWords[$i]."\n";
  }
  close hFile;
  return $_[1];
}
########################################################################
#
#   サブルーチン名:Hankaku2Zenkaku
#
#   形態素解析の読みが半角カナならば全角カナに変換する。
#
#    Mecab拡張形式入力
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
#
sub Hankaku2Zenkaku {
  my @myWords = split(/\n/, $_[0]);

  my $i=0;
  for($i=0; $i<@myWords; $i++) {
    #
    # 現在着目している単語
    #
    my $thisWord = $myWords[$i];
    chomp($thisWord);
    $thisWord =~ s/\x0d//g;
    my( $midasi, $thisWord19 ) = (split( /\t/, $thisWord ))[0,1];

    if( !defined($thisWord19) || length($thisWord19)==0 ) {
      $myWords[$i] = sprintf("%s\x0d\n",$thisWord);
    } else {
      my( $hinsi, $yomi ) = (split( /,/, $thisWord19 ))[0,8];
#
#   Mecab対策・・・カタカナ記載は読みを出力しない場合があるので、
#  $midasi をそのまま読みとする。
#
      if( $hinsi eq "名詞" && $yomi eq "" ) {
        $yomi = $midasi;
      }
      my $yomi_sj = Jcode->new($yomi,'utf8')->sjis;
      $yomi = Jcode->new($yomi_sj,'sjis')->h2z->utf8;
      $myWords[$i] = sprintf("%s\t%s,,,,,,,,%s\x0d\n", $midasi, $hinsi, $yomi );
    }
  }
  my $result = "";
  for($i=0; $i<@myWords; $i++) {
    my $thisWord = $myWords[$i];
    $result .= $thisWord;
  }
  return $result;
}
########################################################################
#
#   サブルーチン名:JoinTyouonKigou
#
#    単独の長音記号を直前の語に付けて、発音を確定させる。
#
#    Mecab拡張形式入力
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
#
sub JoinTyouonKigou {
  my @myWords = split(/\n/, $_[0]);

  my $i=0;
  for($i=0; $i<@myWords-1; $i++) {
#
# 現在着目している単語の各要素を切り出す。
#
    my $thisWord = $myWords[$i];
    chomp($thisWord);
    $thisWord =~ s/\x0d//g;
    my( $midasi, $thisWord19 ) = (split( /\t/, $thisWord ))[0,1];

    if( !defined($thisWord19) || length($thisWord19)==0 ) {
      $myWords[$i] = sprintf("%s\x0d\n",$thisWord);
    } else {
      my( $hinsi, $yomi ) = (split( /,/, $thisWord19 ))[0,8];

#
# 次に着目する単語が長音記号ならば、見出しと読みに追加してゆく。
#
      my $j=0;
      for($j=$i+1; $j<@myWords; $j++) {
        my $nextWord = $myWords[$j];
        chomp($nextWord);
        $nextWord =~ s/\x0d//g;
        my( $nextMidasi, $nextWord19 ) = (split( /\t/, $nextWord ))[0,1];
        if( length($nextWord19)!=0 ) {
          my( $nextHinsi, $nextYomi ) = (split( /,/, $nextWord19 ))[0,8];

          if( $nextMidasi eq "ー" || $nextMidasi eq "-" ) {
            $midasi .= $nextMidasi;
            $yomi   .= $nextMidasi;
            $myWords[$j] = "";
          } else {
            last;
          }
        }
      }
      $myWords[$i] = sprintf("%s\t%s,,,,,,,,%s\x0d\n", $midasi, $hinsi, $yomi );
    }
  }
  my $result = "";
  for($i=0; $i<@myWords; $i++) {
    my $thisWord = $myWords[$i];
    if( length($thisWord) != 0 ) {
      $result .= $thisWord;
    }
  }
  return $result;
}
########################################################################
#
#   サブルーチン名:AddPhonetic
#
#    機能:発音を付加する。
#
#    Mecab拡張形式入力
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
#
#
#    Mecab拡張形式出力
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
# ● 9,ミク発音と歌詞      :$lyricPhonetics
# ●10,発音数          :$phoneticCount
#
#
sub AddPhonetic {
  my @myWords = split(/\n/, $_[0]);
my %phonetic = (
"あ"=>"a",  "い"=>"i",   "う"=>"M",    "え"=>"e",    "お"=>"o",
"ぁ"=>"a",  "ぃ"=>"i",   "ぅ"=>"M",    "ぇ"=>"e",    "ぉ"=>"o",
"か"=>"k a","き"=>"k' i","く"=>"k M",  "け"=>"k e",  "こ"=>"k o",
"さ"=>"s a","し"=>"S i", "す"=>"s M",  "せ"=>"s e",  "そ"=>"s o",
"た"=>"t a","ち"=>"tS i","つ"=>"ts M", "て"=>"t e",  "と"=>"t o",
"な"=>"n a","に"=>"J i", "ぬ"=>"n M",  "ね"=>"n e",  "の"=>"n o",
"は"=>"h a","ひ"=>"C i", "ふ"=>"p\\ M","へ"=>"h e",  "ほ"=>"h o",
"ま"=>"m a","み"=>"m' i","む"=>"m M",  "め"=>"m e",  "も"=>"m o",
"や"=>"j a",             "ゆ"=>"j M",  "いぇ"=>"j e","よ"=>"j o",
"ら"=>"4 a","り"=>"4' i","る"=>"4 M",  "れ"=>"4 e",  "ろ"=>"4 o",
"わ"=>"w a","ゐ"=>"w i",
#        "ゑ"=>"w e",
"を"=>"o","うぃ"=>"w i",             "うぇ"=>"w e",
"ん"=>"n",
#"んが"=>"N a",   "んぎ"=>"N i",   "んぐ"=>"N M",   "んげ"=>"N e",   "んご"=>"N o",
#"んにゃ"=>"N' a","んにぃ"=>"N' i","んにゅ"=>"N' M","んにぇ"=>"N' e","んにょ"=>"N' o",

"が"=>"g a",   "ぎ"=>"g' i",  "ぐ"=>"g M",   "げ"=>"g e",   "ご"=>"g o",
"ざ"=>"dz a",  "じ"=>"dZ i",  "ず"=>"dz M",  "ぜ"=>"dz e",  "ぞ"=>"dz o",
"だ"=>"d a",   "ぢ"=>"dZ i",  "づ"=>"dz M",  "で"=>"d e",   "ど"=>"d o",
"ば"=>"b a",   "び"=>"b' i",  "ぶ"=>"b M",   "べ"=>"b e",   "ぼ"=>"b o",
"ぱ"=>"p a",   "ぴ"=>"p' i",  "ぷ"=>"p M",   "ぺ"=>"p e",   "ぽ"=>"p o",
"きゃ"=>"k' a","きぃ"=>"k' i","きゅ"=>"k' M","きぇ"=>"k' e","きょ"=>"k' o",
"しゃ"=>"S a", "しぃ"=>"S i", "しゅ"=>"S M", "しぇ"=>"S e", "しょ"=>"S o",
"ちゃ"=>"tS a","ちぃ"=>"tS i","ちゅ"=>"tS M","ちぇ"=>"tS e","ちょ"=>"tS o",
"にゃ"=>"J a", "にぃ"=>"J i", "にゅ"=>"J M", "にぇ"=>"J e", "にょ"=>"J o",
"ひゃ"=>"C a", "ひぃ"=>"C i", "ひゅ"=>"C M", "ひぇ"=>"C e", "ひょ"=>"C o",

"ふゃ"=>"p\\' a","ふぃ"=>"p\\' i","ふゅ"=>"p\\' M","ふぇ"=>"p\\' e","ふょ"=>"p\\' o",
"みゃ"=>"m' a","みぃ"=>"m' i","みゅ"=>"m' M","みぇ"=>"m' e","みょ"=>"m' o",
"りゃ"=>"4' a","りぃ"=>"4' i","りゅ"=>"4' M","りぇ"=>"4' e","りょ"=>"4' o",
"ぎゃ"=>"g' a","ぎぃ"=>"g' i","ぎゅ"=>"g' M","ぎぇ"=>"g' e","ぎょ"=>"g' o",
"じゃ"=>"Z a", "じぃ"=>"Z i", "じゅ"=>"Z M", "じぇ"=>"Z e", "じょ"=>"Z o",
"じゃ"=>"dZ a","じぃ"=>"dZ i","じゅ"=>"dZ M","じぇ"=>"dZ e","じょ"=>"dZ o",
"ぢゃ"=>"dZ a","ぢぃ"=>"dZ i","ぢゅ"=>"dZ M","ぢぇ"=>"dZ e","ぢょ"=>"dZ o",
"びゃ"=>"b' a","びぃ"=>"b' i","びゅ"=>"b' M","びぇ"=>"b' e","びょ"=>"b' o",
"ぴゃ"=>"p' a","ぴぃ"=>"p' i","ぴゅ"=>"p' M","ぴぇ"=>"p' e","ぴょ"=>"p' o",
"ふぁ"=>"p\\ a","ふぃ"=>"p\\ i","ふぅ"=>"p\\ M","ふぇ"=>"p\\ e","ふぉ"=>"p\\ o",
"てゃ"=>"t' a","てぃ"=>"t' i","てゅ"=>"t' M","てぇ"=>"t' e","てょ"=>"t' o",
"でゃ"=>"d' a","でぃ"=>"d' i","でゅ"=>"d' M","でぇ"=>"d' e","でょ"=>"d' o",
"ぁ"=>"h\\ a", "ぃ"=>"h\\ i",  "ぅ"=>"h\\ M","ぇ"=>"h\\ e", "ぉ"=>"h\\ o",
"っ"=>"tS  ",
"すぃ"=>"s i", "ずぃ"=>"dz i", "とぅ"=>"t M","どぅ"=>"d M",

"ア"=>"a",  "イ"=>"i",   "ウ"=>"M",    "エ"=>"e",    "オ"=>"o",
"カ"=>"k a","キ"=>"k' i","ク"=>"k M",  "ケ"=>"k e",  "コ"=>"k o",
"サ"=>"s a","シ"=>"S i", "ス"=>"s M",  "セ"=>"s e",  "ソ"=>"s o",
"タ"=>"t a","チ"=>"tS i","ツ"=>"ts M", "テ"=>"t e",  "ト"=>"t o",
"ナ"=>"n a","ニ"=>"J i", "ヌ"=>"n M",  "ネ"=>"n e",  "ノ"=>"n o",
"ハ"=>"h a","ヒ"=>"C i", "フ"=>"p\\ M","ヘ"=>"h e",  "ホ"=>"h o",
"マ"=>"m a","ミ"=>"m' i","ム"=>"m M",  "メ"=>"m e",  "モ"=>"m o",
"ヤ"=>"j a",             "ユ"=>"j M",  "イェ"=>"j e","ヨ"=>"j o",
"ラ"=>"4 a","リ"=>"4' i","ル"=>"4 M",  "レ"=>"4 e",  "ロ"=>"4 o",
"ワ"=>"w a","ヰ"=>"w i",
#        "ヱ"=>"w e",
"ヲ"=>"o",  "ウィ"=>"w i",             "ウェ"=>"w e",
"ン"    =>"n",
#"ンガ"  =>"N a", "ンギ"=>"N i",   "ング"=>"N M",   "ンゲ"=>"N e",   "ンゴ"=>"N o",
#"ンニャ"=>"N' a","ンニィ"=>"N' i","ンニュ"=>"N' M","ンニェ"=>"N' e","ンニョ"=>"N' o",
"ガ"=>"g a",   "ギ"=>"g' i",  "グ"=>"g M",   "ゲ"=>"g e",   "ゴ"=>"g o",
"ザ"=>"dz a",  "ジ"=>"dZ i",  "ズ"=>"dz M",  "ゼ"=>"dz e",  "ゾ"=>"dz o",
"ダ"=>"d a",   "ヂ"=>"dZ i",  "ヅ"=>"dz M",  "デ"=>"d e",   "ド"=>"d o",
"バ"=>"b a",   "ビ"=>"b' i",  "ブ"=>"b M",   "ベ"=>"b e",   "ボ"=>"b o",
"パ"=>"p a",   "ピ"=>"p' i",  "プ"=>"p M",   "ペ"=>"p e",   "ポ"=>"p o",
#                             "ヴ"=>""p M",
"キャ"=>"k' a","キィ"=>"k' i","キュ"=>"k' M","キェ"=>"k' e","キョ"=>"k' o",
"シャ"=>"S a", "シィ"=>"S i", "シュ"=>"S M", "シェ"=>"S e", "ショ"=>"S o",
"チャ"=>"tS a","チィ"=>"tS i","チュ"=>"tS M","チェ"=>"tS e","チョ"=>"tS o",
"ニャ"=>"J a", "ニィ"=>"J i", "ニュ"=>"J M", "ニェ"=>"J e", "ニョ"=>"J o",
"ヒャ"=>"C a", "ヒィ"=>"C i", "ヒュ"=>"C M", "ヒェ"=>"C e", "ヒョ"=>"C o",

"フャ"=>"p\\' a","フィ"=>"p\\' i","フュ"=>"p\\' M","フェ"=>"p\\' e","フョ"=>"p\\' o",
"ミャ"=>"m' a",  "ミィ"=>"m' i",  "ミュ"=>"m' M",  "ミェ"=>"m' e",  "ミョ"=>"m' o",
"リャ"=>"4' a",  "リィ"=>"4' i",  "リュ"=>"4' M",  "リェ"=>"4' e",  "リョ"=>"4' o",
"ギャ"=>"g' a","ギィ"=>"g' i","ギュ"=>"g' M","ギェ"=>"g' e","ギョ"=>"g' o",
"ジャ"=>"Z a", "ジィ"=>"Z i", "ジュ"=>"Z M", "ジェ"=>"Z e", "ジョ"=>"Z o",
"ジャ"=>"dZ a","ジィ"=>"dZ i","ジュ"=>"dZ M","ジェ"=>"dZ e","ジョ"=>"dZ o",
"ヂャ"=>"dZ a","ヂィ"=>"dZ i","ヂュ"=>"dZ M","ビェ"=>"dZ e","ビョ"=>"dZ o",
"ビャ"=>"b' a","ビィ"=>"b' i","ビュ"=>"b' M","ビェ"=>"b' e","ビョ"=>"b' o",
"ピャ"=>"p' a","ピィ"=>"p' i","ピュ"=>"p' M","ピェ"=>"p' e","ピョ"=>"p' o",
"ファ"=>"p\\ a","フィ"=>"p\\ i","フゥ"=>"p\\ M","フェ"=>"p\\ e","フォ"=>"p\\ o",
"テャ"=>"t' a", "ティ"=>"t' i", "テゥ"=>"t' M", "テェ"=>"t' e", "テォ"=>"t' o",
"デャ"=>"d' a", "ディ"=>"d' i", "デゥ"=>"d' M","デェ"=>"d' e",  "デォ"=>"d' o",
"ァ"=>"h\\ a", "ィ"=>"h\\ i",   "ゥ"=>"h\\ M", "ェ"=>"h\\ e",   "ォ"=>"h\\ o",
"ッ"=>"tS  ",
"スィ"=>"s i", "ズィ"=>"dz i", "トゥ"=>"t M","ドゥ"=>"d M",

","=>"br1","、"=>"br1", "。"=>"br2","!"=>"br2","?"=>"br2",
"("=>"br4","『"=>"br4","「"=>"br4"
);
  my $i=0;
  for($i=0; $i<@myWords; $i++) {
    #
    # 現在着目している単語
    #
    my $thisWord = $myWords[$i];
    chomp($thisWord);
    $thisWord =~ s/\x0d//g;
    my( $midasi, $thisWord19 ) = (split( /\t/, $thisWord ))[0,1];

    if( !defined($thisWord19) || length($thisWord19)==0 ) {
      $myWords[$i] = sprintf("%s\x0d\n",$thisWord);
    } else {
      my( $hinsi, $yomi ) = (split( /,/, $thisWord19 ))[0,8];
      my $lyricPhonetics = "";    # 歌詞と発音の構造体
      my $phoneticCount = 0;
#
# 読みに対応したミクの歌詞と発音記号の構造体を得る
#
      my $idxYomi;
      for($idxYomi=0; $idxYomi<(length($yomi)-1);) {
#
# UTF8 の3文字(9bytes)→2文字→1文字の優先順で
# カタカナとミクの発音テーブルから、発音記号を取得する。
#
        my $myLyric = "";
        my $myPhonetic = "";
        my $myLyricLen = 0;
        for($myLyricLen=9; $myLyricLen>=3; $myLyricLen-=3) {
          $myLyric = substr($yomi,$idxYomi,$myLyricLen);
          if( exists($phonetic{$myLyric}) ) {
            $myPhonetic = $phonetic{$myLyric};
            $phoneticCount++;
            last;
          } elsif( $myLyricLen<=3 ) {
            $myPhonetic = "";
            last;
          }
        }
        $idxYomi += $myLyricLen;
#
# 発音の直後が長音記号「ー」「-」のときは歌詞に長音記号を付加する。
#
        if( $myPhonetic ne "" ) {
          for(;;) {
            my $myLyric_appendix = substr($yomi,$idxYomi,3);
            if( $myLyric_appendix ne "ー" && $myLyric_appendix ne "-" ) {
              last;
            }
            $phoneticCount++;
            $myLyric .= $myLyric_appendix;
            $idxYomi += 3;
          }
          $lyricPhonetics .= $myLyric.":".$myPhonetic.";";
        } else {
          $lyricPhonetics .= ":;";
        }
      }
      $myWords[$i] = sprintf("%s\t%s,,,,,,,,%s,%s,%d\x0d\n",
        $midasi, $hinsi, $yomi, $lyricPhonetics, $phoneticCount );
    }
  }
  my $result = "";
  for($i=0; $i<@myWords; $i++) {
    my $thisWord = $myWords[$i];
    $result .= $thisWord;
  }
  return $result;
}
########################################################################
#
#   サブルーチン名:AddSeparator
#
#    区切りを入れる。
#
#    発音区切 "W575", 息継区切 "BR", 文末区切 "EOS"
#    区切りの場合にはタブ等は無く、そのまま改行記号が入る。
#
sub AddSeparator {
  my @myWords = split(/\n/, $_[0]);
  my $phoneticCountFromW575 = 0;
  my $myHinsiLast = "";

  my $i=0;
  for($i=0; $i<@myWords; $i++) {
#   
# 現在着目している単語の各要素を切り出す。
#   
    my $thisWord = $myWords[$i];
    chomp($thisWord);
    $thisWord =~ s/\x0d//g;
    my( $midasi, $thisWord19 ) = (split( /\t/, $thisWord ))[0,1];
    if( !defined($thisWord19) || length($thisWord19) == 0 ) {
#
#     区切りそのものだった場合は次の語の判断に入る
#
      $myHinsiLast = "";
      $phoneticCountFromW575 = 0;
      next;
    }
    if( $i == @myWords - 1) {
#
# 終端の単語は常に文末とする。
#
      $myWords[$i] = sprintf("%s\x0d\n%s\x0d\n", $thisWord, "EOS" );
      next;
    }
    my( $hinsi, $yomi, $lyricphonetics, $phoneticCount )
      = (split( /,/, $thisWord19 ))[0,8,9,10];
    $phoneticCountFromW575 += $phoneticCount;

    my $nextWord = $myWords[$i+1];
    chomp($nextWord);
    $nextWord =~ s/\x0d//g;
    my( $nextMidasi, $nextWord19 ) = (split( /\t/, $nextWord ))[0,1];

    if( (!defined($nextWord19) || length($nextWord19) == 0)
    &&    $nextMidasi eq "EOS" ) {
#    
#       既にMecabが文末 "EOS" を判定したら、新たな判定は不要。
#    
      next;
    }
    my( $nextHinsi ) = (split( /,/, $nextWord19 ))[0];

    my $mySeparator = "";
    if( $midasi eq "。" ||  $midasi eq "!" ||  $midasi eq "?" ) {
      $mySeparator = "EOS";
    } elsif( 0 <= index($lyricphonetics,"br") ) {
      $mySeparator = "BR";
    }
    if( length($mySeparator) == 0 ) {
      if( $phoneticCountFromW575 < 5 ) {
#
# 何もしない。
#
        ;
      } elsif( 5 <= $phoneticCountFromW575 && $phoneticCountFromW575 <= 7 ) {
#
# 5音節~7音節を発音し、かつ文節の頭となる単語だったら、そこで区切って発音する。
#
        if(($hinsi ne "名詞"     && $hinsi ne "形容詞" && $hinsi ne "形容動詞"
        &&  $hinsi ne "接頭詞"   && $hinsi ne "感動詞" && $hinsi ne "接頭辞"
        &&  $hinsi ne "副詞" )
        && ($nextHinsi eq "名詞"     || $nextHinsi eq "形容詞" || $nextHinsi eq "形容動詞"
        ||  $nextHinsi eq "接頭詞"   || $nextHinsi eq "感動詞" || $nextHinsi eq "接頭辞"
        ||  $nextHinsi eq "副詞" ) ) {
          $mySeparator = "W575";
        }
      } else {
#
# 発音があまりに長く8音節以上継続する場合には、次が名詞等(動詞を含む)ならば区切る。
#
        if(($nextHinsi eq "名詞"   || $nextHinsi eq "形容詞" ||  $nextHinsi eq "形容動詞"
        ||  $nextHinsi eq "接頭詞" || $nextHinsi eq "感動詞" ||  $nextHinsi eq "接頭辞"
        ||  $nextHinsi eq "副詞"   || $nextHinsi eq "動詞" ) ) {
          $mySeparator = "W575";
        }
      }
    }
    $myHinsiLast = $hinsi;
    $myWords[$i] = sprintf("%s\x0d\n", $thisWord );
    if( defined($mySeparator) && length($mySeparator) != 0 ) {
      $phoneticCountFromW575 = 0;
      $myHinsiLast = "";
      $myWords[$i] .= sprintf("%s\x0d\n", $mySeparator );
    }
  }
#
#
#
  my $result = "";
  for($i=0; $i<@myWords; $i++) {
    my $thisWord = $myWords[$i];
    if( length($thisWord) != 0 ) {
      $result .= $thisWord;
    }
  }
  return $result;
}
########################################################################
#
#   サブルーチン名:ParseSentence
#
#    文章全体を解析する。
#
#    Mecab拡張形式入力
#
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
#   9,ミク発音         :$lyricPhonetics
#    10,発音数          :$phoneticCount
#
#    Mecab拡張形式出力(●部分)
#
#    意味             :変数
#-------------------------------------------------
#    見出し            :$midasi
#    タブ区切り
#     0,品詞           :$hinsi
#     8,読み           :$yomi
#   9,ミク発音         :$lyricPhonetics
#    10,発音数          :$phoneticCount
# ●11,文章終端までの形態素数  :$eosCount
# ●12,息継ぎまでの形態素数   :$brCount
# ●13,575区切りまでの形態素数:$w575Count
#
#
sub ParseSentence {
  my @myWords = split(/\n/, $_[0]);
  my $myEosCount  = 0;
  my $myBrCount   = 0;
  my $myW575Count = 0;

  my $i=0;
  for($i=@myWords-1; $i>=0; $i--) {
    #
    # 現在着目している単語
    #
    my $thisWord = $myWords[$i];
    chomp($thisWord);