HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0925
にゃんちゃんaquestalkに漢字かな混じり分を読ませるには17解決


にゃんちゃん

リンク

2011/9/25(Sun) 22:34:34|NO.41703

こんばんは。
さて、表題の件について質問です。
aquestalkでは標準で漢字がよめませんが、棒読みちゃんなどなどは漢字が混じってても読んでいます。
HSPだけでもあのようなことは可能でしょうか?
ひらがなとかだったら読ませるのはできました。
あとは漢字をなんとかひらがなに直す処理が書ければ…なのですが!
分かる方、ご教授ください。



この記事に返信する


GENKI

リンク

2011/9/25(Sun) 23:08:03|NO.41706

> 「棒読みちゃん」
> IMEの再変換で漢字をひらがなに変換し、AquesTalkで音声合成します。

だそうです。

漢字交じりの文章から自動で音声記号列が出力できれば一番いいのですが、公式のものは有料ですね。
http://www.a-quest.com/products/aqkanji2koe.html

こんなのもありますが、「アプリケーションなどからの呼び出しはご遠慮ください。」だそうです。
http://flcljp-parse.appspot.com/
これを使うのも…問題ありか。
http://yomi.harmonicom.jp/

昔見たフリーの音声読み上げソフトに、漢字辞書をデータベースなどで持っておき、入力された文章を自前で構文解析してひらがな(音声記号列)に…という力技をやっていたものがありました。(※HSPではありません。)
同じ事をやるのも手かと。


あ、過去ログを活用すると言うのも手ですね。





http://hsp.tv/play/pforum.php?mode=pastwch&num=28255
たった今見つけた。全部書き終わった後だった…。orz



Cookies

リンク

2011/9/25(Sun) 23:10:20|NO.41707

分かってるとは思いますが、同じ一つの漢字でも読み方たくさんありますからねぇ。
少なくとも辞書ってのは必要だと思いますよ。

しかし確かに棒読みちゃんは漢字も読みますね。
と思って調べましたらありました。
http://ameblo.jp/moenai-gomi/entry-10248583666.html
>仕組みとしては、IMEの再変換で漢字を平仮名にして、
>音声合成ライブラリAquesTalkに喋らせてるだけなので、
IMEの辞書だったみたいです。
棒読みちゃんと同じことするならこうなりますね。

読み仮名を調べるのには
http://labs.spicebox.jp/p/yomigana/
のサイトが見つかりました。
FOKSというところに辞書があるそうです。



木村

リンク

2011/9/26(Mon) 00:18:30|NO.41710

 辞書データを作って、漢字を平仮名に再変換するのだとしたらこんな感じでしょうか。以下は一例
http://hspdev-wiki.net/?String%2F%B4%C1%BB%FA%A4%CE%B5%D5%CA%D1%B4%B9



MIZUSHIKI

リンク

2011/9/26(Mon) 01:32:18|NO.41712

読み仮名を得るだけならIFELanguageというCOMコンポーネントを使うと良いと思います。
環境によらず、完璧ではありませんが大体良さそうな読みを返してくれます。
(ImmGetConversionListのAPIを使ったものはVista以降使えないという問題があります)

つーさ さんがモジュールにしてくれています。
http://tu3.jp/0561#k561p0

ImmGetConversionListでふりがなを取得しようとしていたときの試行錯誤の歴史
http://fs-cgi-basic01.freespace.jp/~hsp/ver3/hsp3.cgi?print+200801/08010005.txt



にゃんちゃん

リンク

2011/9/26(Mon) 07:42:35|NO.41714

どもです。
一通り見ましたが、IMEの再変換がいいと思ったのですが、HSPからどうすれば呼び出せますでしょうか?



にゃんちゃん

リンク

2011/9/26(Mon) 09:58:19|NO.41715

MIZUSHIKI様の教えてくれた方法でやってみたところ、無事再生できました。
で、もう一つ質問です。
数字の前後に「<NUMK VAL=」、「>」を入れて数字も出るようにしたいのですが、どうすればうまくいくかが分かりませんでした。
instrとかstrmidとかを駆使したつもりだったんですけど、ぜんぜんできませんでした。
どうか文字列操作の知識の少ない私に知恵を貸してください。
私が書いたのは乗せれる状態にないほど悲惨なので、ヒントからスクリプトまで、なんでもいいので教えてください。
ちなみに、数字の前に<NUMK VAL=を入れて、数字の跡に>を入れるようです。



skyblue

リンク

2011/9/26(Mon) 18:37:21|NO.41727

>ヒントからスクリプトまで、なんでもいいので教えてください。
instrで<NUMK VAL=を検索してその後から>を検索してstrmidでその場所までを抜き出す
文字数に関しては>のIndex数 - <NUMK VAL=のIndex数でOK



Cookies

リンク

2011/9/26(Mon) 19:57:11|NO.41736

>>skyblueさん
それは"<NUMK VAL=1>"から"1"を取得する方法ですよね?
にゃんちゃんさんが言いたいのは逆だと思います。


一番短く済むのは、replace関数かなぁと思いますが。



にゃんちゃん

リンク

2011/9/27(Tue) 16:32:14|NO.41765

はい、逆です。
<NUMK VAL>をくっつけたいんですよ。
replace関数ですか?聞いたことないので、調べて試したいとおもいます。
instrで数字を検索して、その前に<NUMK VAL=をいれて、数字の終わりを調べて>を入れればいいのはわかるのですが、同じ行に複数の数字が来た場合などの処理がいまいち分からないところです。



skyblue

リンク

2011/9/27(Tue) 18:45:22|NO.41774

>それは"<NUMK VAL=1>"から"1"を取得する方法ですよね?
>にゃんちゃんさんが言いたいのは逆だと思います。

>はい、逆です。
><NUMK VAL>をくっつけたいんですよ。

>一番短く済むのは、replace関数かなぁと思いますが。
くっつけるのだったら、

val="<NUMK VAL="+num+">"
でOK!これが一番簡単?



にゃんちゃん

リンク

2011/9/27(Tue) 18:54:04|NO.41777

そうなんですけど、そのまえに数字の最初と最後を検索して、ほかの文字と混ぜて…ってしないといけないんですよ。
numがわかってれば良いけど、そのnumをどうやって取得したらいいか困ってます。



MillkeyWeler

リンク

2011/9/28(Wed) 16:57:46|NO.41792

skyblue さんも答えてますが、instr 関数で、数字文字までの場所を検索する方法が一番早いと思いますよ。


//例 a="この番号は、0123-456-789です。" b=instr(a,0,"0") //←の"0"は、数字("0"〜"9"に変えて検索してみよう) mes b

の場合、instr の戻り値は、12となり、12バイト目に該当文字があります。
なので、12バイト目から数字(上記の場合、「-」も数字として扱うのでそれも含む)以外の場所が出てくるまで、検索すればいいのです。

そうしますと、0123-456-789 という番号のみが判明すると思います。
そうしたら、その番号がある場所に、"<NUMK VAL="を含ませ、数字の終わりの部分に、">"を含ませて

この番号は、<NUMK VAL=0123-456-789>です。

を作ればいいのです。文章に複数の数字の場所が含まれていた場合は、一回でやろうとしないで
複数回に分けてやればいいのです。


"この番号は、0123-456-789ですが、0123-456-789に変わりました。"

の場合は、上記で説明したとおり
「この番号は、」と「0123-456-789」を分解し
「ですが、」と「0123-456-789」を分解し
最後まで数字がない為、2回目に分解した終端から、「に変わりました。」を組み合わせればいいのです。



にゃんちゃん

リンク

2011/9/28(Wed) 17:23:15|NO.41795

流れが分かってきました。
instrで0から9の文字を検索
そのインデックスから数字じゃなくなるまでstrmidで取り出す
取り出した文字列の最初に<NUMK VAL=を追加し、最後に>を追加する。
あとはrepeatで丸めて(もちろん開始インデックスはずらして)完成。
やってみます。



木村

リンク

2011/9/29(Thu) 02:15:31|NO.41812

 構文解析をするならmod_regexp.asのmatch関数の方がinstr関数より便利な気がします。以下は一例

#include "mod_regexp.as" m = "<NUMK VAL=0123-456-789>" mes match(m,"(\\d|-)+")



Cookies

リンク

2011/9/29(Thu) 16:43:20|NO.41816

じゃあ木村さんのが出てきたところで、私の言ってたreplaceについても。。。
調べますって言ってたけど調べたんでしょうか。。。

#include "mod_regexp.as" m = "Tel:0123-456-789" mes replace(m,"(\\d+)","<NUMK VAL=$1>") mes replace(m,"(\\d)","<NUMK VAL=$1>")
読ませ方よくわからないので、
数を全部一気にVALにするやり方、
一文字一文字VALに入れるやり方の二つをサンプルに。



にゃんちゃん

リンク

2011/9/30(Fri) 17:48:57|NO.41844

さっきここに書いたのですが、replace関数をちょっと調べてきたので、書き直します。
replace関数を使う方向でいきます。これだったら、一気に置換ができるようなので、この関数に投げ込めばやってくれるのかな?という考えのもとで。
ただいまHSPとにらめっこする十分な時間がないので、あしたの午後に試させていただきます。



にゃんちゃん

リンク

2011/10/4(Tue) 19:11:38|NO.41999

報告が遅くなってしまってごめんなさい。
ぶじにreplace関数を使って音声発生に成功しました。
ほかにもaquestalkが発生できない文字がいろいろあったので、簡易辞書みたいなものを作って、repeatで繰り返しをしながら置換し、読み方の制御もできるようになりました。
このたびはまことにありがとうございました。助かりました。replace、便利すぎます。



ONION software Copyright 1997-2021(c) All rights reserved.