トップページ > 過去ログ > 記事閲覧
関数の連続使用
日時: 2007/10/20 23:41
名前: ラッキー

現在、テキスト音声合成を作成しているラッキーです。
AquesTalkDa_Playの関数を連続して利用する場合に関
する点で分からないことがありまして、書き込みさせ
て頂きます。

文章の「。」を1つの解析単位として、言語処理して、
その単位毎に、ループを使ってを呼び出す形で、連続
して音声合成しています。

すなわち、

while (全解析単位) {
解析単位の切り出し
解析単位内の言語処理
AquesTalkDa_Play(言語解析結果の発音文字列);
}
のような形で、呼び出しています。このように処理し
ている理由は、非常に長文の場合には解析単位毎でな
いと、都合が悪いためです。

ここで、分からないのが、このような形で、ループを
使ってAquesTalkDa_Playを連続使用した場合に、発音
文字列の最後には、必ず「。」が入っているにも関わ
らず、合成される音声では、各解析単位の最後の「。」
のポーズ長が非常に短くて、各文がくっついて聞こえ
てしまう点です。

同じ発音文字列でも、ループでAquesTalkDa_Playを呼
び出すのでなく、全文の解析結果を1度にこの関数で
処理させた場合などは、各文の最後の「。」のポーズ
長は、正しい長さとなり聞きやすくなります。

何か、プログラム上のヒントなどお教え頂ければ、幸
いです。

Page: 1 |

Re: 関数の連続使用 ( No.1 )
日時: 2007/10/21 19:42
名前: 管理人

音声合成の際の最後のポーズ(無音区間)は、わざとはずす仕様になっております。
現在のインターフェースではポーズのみの出力も出来ないので、その方法ではポーズを入れるのは難しいかもしれません。

そこで、例えば、
while (全解析単位) {
解析単位の切り出し
解析単位内の言語処理
AquesTalkDa_PlaySync(言語解析結果の発音文字列);
Sleep(任意のポーズ時間)
}

のようにするか、
AquesTalkDa_Play()にメッセージを指定することで、発声の完了メッセージを受けて、Sleep処理、次の解析単位を処理するようにしてもよいかと思います。

なお、有償になりますが、常に最後にポーズ区間を付与するようにカスタマイズすることもできますので、必要があればご連絡くださいませ。
Re: 関数の連続使用 ( No.2 )
日時: 2007/10/23 09:43
名前: ラッキー

ラッキーです。お世話になっております。
どうも、色々とありがとうございます。

すみません。単純にwhile(全解析単位){}
の中に、Sleep(任意のポーズ長)を入れる
形で実験したのですが、おそらく
AquesTalkDa_PlaySyncが非同期の関数の
ために、思った結果が得られませんでした。

AquesTalkDa_Play()にメッセージを指定する
という方法なのですが、自分で試してみたの
ですが、いまいちやり方が悪いようで、うま
くできませんでした。

このため、もしも可能でしたら、非常に簡単
な例で良いのですが、AquesTalkDa_Play()に
メッセージを指定してそれを受け取る方法の
やり方について、簡単なソースをお示し頂け
れば非常に幸いです。

または、既にどこかに類例があれば、その
URLを教えて頂くだけでも結構なのですが。

お忙しいところ、本当に申し訳ありません。
もしも、可能でしたらよろしくお願い致しま
す。
Re: 関数の連続使用 ( No.3 )
日時: 2007/10/24 11:41
名前: 管理人

こんにちは。

おかしいですね。AquesTalkDa_PlaySyncは、同期関数として用意していますので、Sleepで無音区間が作れるはずなのですが・・・

また、メッセージのやりとりは、AquesTalkライブラリのアーカイブに、AqTkAppのサンプルプログラムで使っていますので、この辺りのコードを参照いただければと思います。

Page: 1 |