Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

「!」や「『』」のような記号があると、sound synthesis failedと出てしまい、応答を読み上げてくれない? #255

Open
k-okada opened this issue Jun 3, 2021 · 6 comments
Assignees

Comments

@k-okada
Copy link
Member

k-okada commented Jun 3, 2021

? また、応答に「!」や「『』」のような記号があると、sound synthesis failedと出てしまい、応答を読み上げてくれないことがある印象だったので、気がついたものに関しては置換しています。

は,aques_talk の問題?voice_text だと起こらない?など条件を知りたいのと,
もしそうだたすると,aques_talk 側のプログラムで直したいです (

best_response=best_response.replace("『", "")
best_response=best_response.replace("』", "")
best_response=best_response.replace("!", "。")
best_response=best_response.replace("〜", "ー")
)

cc: @ayfujii

@k-okada k-okada changed the title 「!」や「『』」のような記号があると、sound synthesis failedと出てしまい、応答を読み上げてくれな? 「!」や「『』」のような記号があると、sound synthesis failedと出てしまい、応答を読み上げてくれない? Jun 3, 2021
@Naoki-Hiraoka
Copy link
Contributor

Naoki-Hiraoka commented Jun 3, 2021

https://github.com/jsk-ros-pkg/jsk_3rdparty/tree/master/3rdparty/google_cloud_texttospeech は問題なくこれらの記号がある文を読み上げてくれることを確認しました。

hiraoka@hiraoka-desktop:/opt/ros/melodic/share/pr2eus$ roseus ./speak.l 
$ (ros::roseus "aaa") 
$ (speak-jp "『こんにちは』") 
$ (speak-jp "こんにちは!") 
$ (speak-jp "こんにちは〜") 

@708yamaguchi
Copy link
Member

708yamaguchi commented Jun 3, 2021

この件に関して、aques_talkにプルリクエストを出しました。
#257

まずaques_talkが「!」や「こんにちは!」を読めない問題ですが、これは特殊なタグで囲うことで読めるようになります。
https://www.a-quest.com/archive/manual/siyo_onseikigou.pdf
この音声記号列仕様表とAquesTalk2 Linux Manualの存在をREADMEに書き、かつ、JSKのGoogle Driveにもおいておきました。
https://www.a-quest.com/archive/manual/aqtk2_lnx_man.pdf

このように特定の文字列を特殊タグで囲う作業はすでにaques_talkでは行われていて、以下のように入力文字列をsedで置き換えることで、数字やアルファベットを読めるようにしています。

# escape invalid code
os.system("nkf -j %s | kakasi -JH | nkf -w | \
sed -e 's/,/、/g' | sed -e 's/,/、/g' | \
sed -e 's/./。/g' | sed -e 's/\./。/g' | \
sed -e 's/\([a-zA-Z]\+\)/<ALPHA VAL=\\1>/g' | \
sed -e 's/\([0-9]\+\)/<NUMK VAL=\\1>/g' > \
%s"%(input_file, jptext_file))
os.system("cat %s 1>&2"%(jptext_file))
os.system("rosrun aques_talk SampleTalk -p %s -o %s %s"%(phont_file, output_file, jptext_file))

今回は「!」を読んでほしいわけではないと思うので、sedの行を追加して「!」や「『」などの文字を無視するようにしました。
ただ、「'」や「"」が文章の開始文字として認識されたり、「[」や「]」がsedの制御文字と認識されたりと、無視しきれない文字があったので、README.mdにそのことを書いておきました。(SQLインジェクション対策の重要性がわかってきました)
僕の正規表現力が低い可能性が高いので、実は「]」は入力できるよ、のような表現があれば教えていただきたいです。

次にvoice_textで(send *ri* :speak-jp xxx)を行ったところ、「!」は発音されなかったですが「こんにちは!」を読むことは出来ました。また、fetch_bringup.launchのログにエラーも表示されませんでした。
ReakSpeaker(旧voice_text)のオンライン音声合成サンプルでも試しましたが、やはり「!」は発音されず「こんにちは!」を読むことは出来ました。
https://readspeaker.jp/

僕は今のところ、voice_textではAquesTalkの音声記号列仕様表のようなドキュメントを見つけられていないので、見つけ次第返信します。

@ayfujii
Copy link
Contributor

ayfujii commented Jun 3, 2021

プルリクありがとうございます。

プルリクのブランチのaques_talkを使って、上記のchaplus_ros.pyの138-141行目のreplaceしているところは消したコードで
roslaunch chaplus_ros google_example.launch
を試したところ、エラーが出なくなっていることを確認しました。

上記のchaplus_ros.pyの138-141行目は消去したいと思います。

@708yamaguchi
Copy link
Member

ご確認ありがとうございます。
その後、プログラムの見通しを良くするために追加コミットをしたので、再度ご確認していただけると助かります。

ちなみに、aques_talk側での文字列置換では以下の操作を行っています。

  1. 漢字をひらがなに変換。
nkf -j %s | kakasi -JH | nkf -w | \
  1. 「,」を「、」に、「,」を「、」に、「.」を「。」に、「.」を「。」に変換。
sed -e 's/,/、/g' | sed -e 's/,/、/g' | \
sed -e 's/./。/g' | sed -e 's/\./。/g' | \
  1. 正規表現で[a-zA-Z0-9ぁ-んァ-ンー、。??]を表す文字以外を全て削除。つまり、アルファベット、数字、ひらがな、カタカナ、「ー、。??」以外を全て削除。
sed -e 's/[^a-zA-Z0-9ぁ-んァ-ンー、。??]//g' | \
  1. AquesTalk2がアルファベットや数字を発音できるように、特殊な制御文字を追加。
sed -e 's/\([a-zA-Z]\+\)/<ALPHA VAL=\\1>/g' | \
sed -e 's/\([0-9]\+\)/<NUMK VAL=\\1>/g' > \

@ayfujii
Copy link
Contributor

ayfujii commented Jun 3, 2021

ありがとうございます。動作することを確認しました。

細かい話になってしまうのですが、「!」は文の切れ目に多いと思うので「。」に置換するのと、「〜」は伸びる音「ー」に置換したほうが、よりもともとのニュアンスが伝わるかなと思いました。
下記のものを追加するのはいかがでしょうか?
ご検討よろしくお願い致します。

sed -e 's/!/。/g' | sed -e 's/\!/。/g' | \
sed -e 's/〜/ー/g' | \ 

@k-okada
Copy link
Member Author

k-okada commented Jun 3, 2021

@ayfujii よい提案だと思うので
https://github.com/jsk-ros-pkg/jsk_3rdparty/blob/57c53ad08b09709b88538c3319153c08aff65cea/3rdparty/aques_talk/README.md
にpull requestを送るのが良いと思います

その際、それぞれの場合の音声のwavファイルもつけると説得力が増します

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants