Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2019-03-22

テキスト読上げ(青空文庫形式対応)

| 12:49

 なんだかんだで、読上げ自体はわりとすぐに出来るようになりました。

 [# ]で囲まれた註を無視して、前に書いたとうりに漢字部分を読まずにルビの方を読むようにしただけなので。

#------------------------------------------------------------------
# テキスト読上げ
#------------------------------------------------------------------
「Google 日本語」に話者設定。   //ダミー

#---宣言----------
テキスト=。読上中フラグ=オフ行数=-1。細区切=-1。
区切記号=「{CRLF},{CR},{LF}」を「,」で区切る。
息継記号=「 , ,?,!,―,…,{カッコ}」を「,」で区切る。
註記号=「-------------------------------------------------------,-------------------------------------------------------
※[#,]{改行}[#,]」をCSV取得。

#---HTMLの設置----------
HTML=「<div id="main"></div>」
「#nako3_div_1」にHTMLを、DOM_HTML設定。

#---GUI作成----------
「#main」にDOM親要素設定。
のテキストエリア作成し、テキストエリアに代入改行作成。
「読み上げ」のボタン作成し、読上ボタン代入。
「先頭」のボタン作成し、先頭ボタン代入。
「クリア」のボタン作成し、クリアボタン代入改行作成。
「{カッコ}、{カッコ閉じ}でも区切って読む(Google 日本語で止まる場合)」のチェックボックス作成し、細区切チェック代入改行作成。

#---CSS設定----------
読上ボタンの「margin」に「2px 5px」をDOMスタイル設定。
先頭ボタンの「margin」に「2px 5px 2px 50px」をDOMスタイル設定。
先頭ボタンの「disabled」に「disabled」をDOM属性設定。
クリアボタンの「margin」に「2px 5px」をDOMスタイル設定。
細区切チェックの「margin」に「10px」をDOMスタイル設定。
テキストエリアの「rows」に「20」をDOM属性設定。
テキストエリアの「placeholder」に「ここに読上げたいテキストを入力して下さい」をDOM属性設定。

テキストエリアに{
  "幅": "100%",
  "margin": "2px 5px",
  "背景色":"#ffffff",
  "色": "#000000",
}をDOMスタイル一括設定。

#---イベント----------
クリアボタンをクリックした時には、
  「テキストを全てクリアします。{改行}読上げ中の場合は、読み上げも中断します」で二択。
  もしそれはいならば、
    細区切チェックの「disabled」にDOM属性設定。
    テキストエリアにをテキスト設定。
    テキスト=。読上げ中フラグ=オフ行数=-1。
  ここまで。
ここまで。

先頭ボタンをクリックした時には
  「先頭に戻って読み上げを行います。」で二択。
  もしそれはいならば、
    行数=-1。読上開始。
  ここまで。
ここまで。

読上ボタンをクリックした時には
 「Google 日本語」に話者設定。   //Google Chromeでは、Google 日本語で読む。
 もし、読上中フラグ=オフならば、
  読上開始。
 違えばもし、読上中フラグ=オンならば、
  先頭ボタンの「disabled」にDOM属性設定。
  読上中断。
 ここまで。
ここまで。

細区切チェックの「onchange」に「チェック関数」をDOMイベント設定。

●チェック関数
  細区切=細区切*-1。
ここまで。
#------------------------------------------------------------------
●読上テキスト作成
 註記号を反復
   対象[0]から対象[1]を註削除。
 ここまで。
 ルビ反映。
 テキスト=テキストの「》」を置換。
 テキスト=テキストの「|」を置換。
 テキスト=テキストのカッコ閉じを「。」に置換。
 テキスト=テキストの「。」を「。{改行}」に置換。
 もし、細区切=オンならば、
   テキスト=テキストの「、」を「、{改行}」に置換。
 ここまで。
 息継記号を反復
   テキスト=テキストの対象を「、」に置換。
 ここまで。
 区切記号を反復
   テキスト=テキストを対象区切る。
 ここまで。
ここまで。
#------------------------------------------------------------------
●註削除(AからBを)
 検索開始位置=1。
 削除始=テキストで検索開始位置からAを文字検索改。
 もし、削除始=0ならば戻る。
 削除終=テキストで削除始+(Aの文字数)からBを文字検索改。
 もし、削除終=0ならば戻る。
 削除数=削除終-削除始+(Bの文字数)。
 テキスト=テキストの削除始から削除数を文字削除。
 検索開始位置=検索開始位置+削除始
 AからBを註削除。
ここまで。

●ルビ反映
 検索開始位置=1。
 ルビ記号=テキストで検索開始位置から「《」を文字検索改。
 もし、ルビ記号=0ならば戻る。
 ルビ始=ルビ記号-1。
 オン
   仮=テキストでルビ始から1を文字抜出。
   もし、(仮を漢字か判定)=はいならば、
     ルビ始=ルビ始-1。
   違えば、
     ルビ始=ルビ始+1。抜ける。
   ここまで。
 ここまで。
 削除数=ルビ記号-ルビ始+1。
 テキスト=テキストのルビ始から削除数を文字削除。
 検索開始位置=検索開始位置+ルビ記号+1。
 ルビ反映。
ここまで。
#------------------------------------------------------------------
●文字検索改(SでAからBを)
 検索対象=(Sの文字数)+1-A。
 仮=SのAから検索対象を文字抜出。
 数=(仮でBを文字検索)
 もし、数=0ならば、数で戻る。
 違えば、数+A-1で戻る
ここまで。

●漢字か判定(Sが|Sの|Sを)
  Sを「^[\u3005\u3007\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DFF]|[\uD840-\uD87F][\uDC00-\uDFFF]」で正規表現マッチ。
  もしそれがnullならばいいえ戻る。
  違えばはい戻るここまで。
#------------------------------------------------------------------
●テキスト読上げ
 もし、読上中フラグ=オンならば、
  行数行数+1。
  もし行数≧(テキストの要素数ならば、
    細区切チェックの「disabled」にDOM属性設定。
    行数=-1。読上中断。戻る。
  ここまで。
  テキスト[行数]を話し終わった時には
    テキスト読上げ。
  ここまで。
 ここまで。
ここまで。
#------------------------------------------------------------------
●読上開始
  テキスト=テキストエリアからテキスト取得。
  もし、テキスト=ならば、
    「テキストエリアに読み上げたい文章を入力して、読み上げボタンを押して下さい。」と言う。
  違えば、
    読上テキスト作成。
    読上ボタンに「一時停止」をテキスト設定。
    読上中フラグ=オン。
    テキストエリアの「disabled」に「disabled」をDOM属性設定。
    先頭ボタンの「disabled」に「disabled」をDOM属性設定。
    クリアボタンの「disabled」に「disabled」をDOM属性設定。
    細区切チェックの「disabled」に「disabled」をDOM属性設定。
    テキスト読上げ。
  ここまで。
ここまで。

●読上中断
  読上ボタンに「読み上げ」をテキスト設定。
  読上中フラグ=オフ。
  テキストエリアの「disabled」にDOM属性設定。
  クリアボタンの「disabled」にDOM属性設定。
ここまで。
#------------------------------------------------------------------

http://snowdrops.starfree.jp/wnako3_test/16_yomiage.html

 がっ・・・

 ぐる子さん(Google日本語)の方が、はるかさんより読み違いが少なくて、多少聞きやすい感じなので、変えれるようにすっかなと思ったんですけど、どうも「話者設定」や、「話者一覧取得」の命令が、初は通らない(?)感じなのです。

話者一覧取得して反復
  F名前=対象["name"]
  F言語=対象["lang"]
  「{F名前}: {F言語}」を表示ここまで

 実行ボタンを押しても出ないんです。

 で、あれ? と思ってもう一押したらちゃんと表示され、の後はタブではずっと動きます。

 だもんで、前に話者変更などを試していた時には気付いてなかったけど、新しく開いた毎目は動かないの。謎すぎ。


 エディタの場合は、実行ボタンを二押せば良いだけなんだけど、HTMLに埋め込んだらそうもいかないですよね。

 一ダミーで話者設定し、ウェイトを入れた後、再設定すると通るので、最初にダミーを設定した後イベントの中で再設定で、出来たことは出来たのですが、無理矢理すぎ;



 あとは、なでしこは関係ないと思われることだけど、chromeさんとは、どうも相性が良くないみたいなんですよねぇ・・・


 ぐる子さんは長文が読めないらしくて、読上げ途中でいきなり止まって、再読み込みではダメで、ブラウザ自体の再起動必要かも知れない感じになる~(´д`)

 長文を読ますような前提じゃないってコトかも知れないし、一度話し始めたら、強制的に中断させるような命令もないのだから、もあんまり長文を一気に話させるのはどうかと思われるところですけど、100文字以下くらいでも余裕で止まることがあるから、改行や「。」ごと区切ったくらいじゃ駄目なことがあって、困ったもんだ。

 これは、chromeがと言うより、Google日本語のことで、chrome+はるかさんなら問題はないFirefoxではもちろん問題が無い。

 読上げエンジンの方の仕様なのかと思われるけど、「、」で区切ると、ちょっと息切れ感が・・・;


 それから、読上げようのテキストが大きいと、「話す」には一行ずつ送ってるにもかかわらず、しばしば止まるんだよね~。大きいったって30kbくらいなんですが。

 いや、のせいかどうかすらもよく分からんけど、元のテキストを半分とかにしたら、ふつーに読めたのです。

 でも、短編の一編くらいは、まるっと最初から最後まで読んで欲しいよね~。むむむ~。

 これは、chrome+はるかさんでも発生し、前のとは違って、一時停止して、もっかい読上げボタン押すと、次を読んだりもする。これFirefoxでは大丈夫。

 場当たり的には出来るようにできそうな気もするけど、原因が確定していない上にワタシが普段メインで使ってるのはFirefoxだから、やる気出ないなぁ;

 なにしろ、どれもこれFirefoxでは無問題なのですよ(?_?)

 お試しとゆうことでこんくらいにしておくか、まちっと研究してみるか、それが問題だw

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20190322