質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

3702閲覧

C# 音声認識の結果を全てひらがな出力したい

syo46no

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/08/22 03:47

編集2018/08/22 12:01

どなたかお願いします。

C# フォームアプリケーションで音声認識をし、その認識結果と読むべきテキストが一致していたらハイライト表示されるようにしております。

現在、テキストがすべてひらがななのですが、音声結果が漢字やカタカナだと同じ語句でも一致してくれません。
ひらがな変換など参考にしたのですがうまくいきません。
例)テキスト語句「あした」→認識「明日」 で一致しない。
また、認識結果とテキストが一致された後、ずっとハイライトされたままで新たに更新されています。
理想としては、今読んだ場所をハイライトなので履歴を消したいです。
何かアドバイスあればよろしくお願いします。。。

以下ソースコードの関連部分です。

//音声認識
recognizer.SetInputToDefaultAudioDevice();
recognizer.LoadGrammar(new DictationGrammar());
//連続認識の開始
recognizer.RecognizeAsync(RecognizeMode.Multiple);
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(Recognizer_Recognized);

//テキストを読み込む
private void button1_Click(object sender, EventArgs e)
{
if (sender == button1)
{

OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "テキストファイル|*.txt"; if (ofd.ShowDialog() == DialogResult.OK) { StreamReader sr = new StreamReader(ofd.FileName, Encoding.GetEncoding("SHIFT_JIS")); richTextBox1.Text = sr.ReadToEnd(); } } }

//認識結果とテキストの一致検索

private void Recognizer_Recognized(object sender, SpeechRecognizedEventArgs e)
{
//色を変える文字列
string searchWord = e.Result.Text;

//現在の状態 int currentSelectionStart = richTextBox1.SelectionStart; int currentSelectionLength = richTextBox1.SelectionLength; int pos = 0; for(; ; ) { // 文字列を検索して、選択状態にする pos = richTextBox1.Find(searchWord, pos, RichTextBoxFinds.None); if(pos < 0) { break; } //背景色を黄色にする richTextBox1.SelectionBackColor = Color.Yellow; pos++; } //選択状態を元に戻す richTextBox1.Select(currentSelectionStart, currentSelectionLength);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/08/23 08:27

再現できる環境にないのでできれば検証していただいたいのですが、e.Resultの別のプロパティ(AlternatesやHomophones)に、ひらがなは入っていませんでしょうか?デバッグ実行で確認いただけないでしょうか?
guest

回答1

0

ベストアンサー

前回のハイライトを消すのは、一旦全てクリアして
該当箇所をハイライトするという形かと

C#

1richTextBox1.SelectAll(); 2richTextBox1.SelectionBackColor = richTextBox1.BackColor; 3 4//ハイライト処理 5

処理する文章が長い時など、この方法で速度面で不安があるようでしたら、前回の語句を覚えておいて色を付けるのと逆を行えばよいかと

C#

1for(; ; ) 2{ 3 // 文字列を検索して、選択状態にする 4 pos = richTextBox1.Find(PrevWord, pos, RichTextBoxFinds.None); 5 if(pos < 0) 6 { 7 break; 8 } 9 //背景色を元に戻す 10 richTextBox1.SelectionBackColor = richTextBox1.BackColor; 11 pos++; 12}

音声認識結果をひらがなで取得する方法に関しては、ちょっとお力になれません。

投稿2018/08/22 12:10

YAmaGNZ

総合スコア10259

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syo46no

2018/08/22 12:26

ありがとうございます。 現在、試したところおっしゃっていただいた試しでは作動しませんでした。。。 現在、先ほど書いたfor文のあとに強制的にif文でハイライト表示をしております。 //”この中身は読み込んだテキストの語句と一緒(認識がひらがなだけじゃないため複数でif文)” if (e.Result.Text == "くるみの"|e.Result.Text == "クルミの") { richTextBox1.Select(0,4); richTextBox1.SelectionBackColor = Color.Yellow; } //違う語句が認識されたら次読む場所を赤文字にしたいが、現在の語句を赤文字にしてしまう。。 else if(e.Result.Text != richTextBox1.Text) { richTextBox1.Select(forwardSelectionStart, forwardSelectionLength); richTextBox1.SelectionColor = System.Drawing.Color.Red; } どのように対処すればいいでしょうか。 よろしくお願いいたします。
YAmaGNZ

2018/08/22 12:39

すみませんが、ソースを小出しにせずにどのようなソースで試してどうなったか教えていただけますか? コメント頂いた内容が質問と違うので、どう試されたのかが分かりません。
syo46no

2018/08/22 12:48

private void Recognizer_Recognized(object sender, SpeechRecognizedEventArgs e) { //色を変える文字列 string searchWord = e.Result.Text; //現在の状態 int currentSelectionStart = richTextBox1.SelectionStart; int currentSelectionLength = richTextBox1.SelectionLength; //次の語句 int forwardSelectionStart = richTextBox1.SelectionStart; int forwardSelectionLength = richTextBox1.SelectionLength; int pos = 0; for (; ; ) { // 文字列を検索して、選択状態にする pos = richTextBox1.Find(searchWord, pos, RichTextBoxFinds.None); if (pos < 0) { break; } //背景色を黄色にする richTextBox1.SelectionBackColor = Color.Yellow; pos++; } //選択状態を元に戻す richTextBox1.Select(currentSelectionStart, currentSelectionLength); if (e.Result.Text == "くるみの"|e.Result.Text == "クルミの") { richTextBox1.Select(0,4); richTextBox1.SelectionBackColor = Color.Yellow; } //認識が違ったら赤文字で該当語句【前回の語句の次】を表示したい else if(e.Result.Text != richTextBox1.Text) { richTextBox1.Select(forwardSelectionStart, forwardSelectionLength); richTextBox1.SelectionColor = System.Drawing.Color.Red; } このようなソースコードで、認識したらハイライト 間違っていたら、読みたかった語句【前回の語句の次の語句】を赤文字で表示したいです。
YAmaGNZ

2018/08/22 13:25

私が回答した部分がありませんが、どのように試されたのでしょうか? 私が回答した問題は >また、認識結果とテキストが一致された後、ずっとハイライトされたままで新たに更新されています。 >理想としては、今読んだ場所をハイライトなので履歴を消したいです。 の部分のハイライトを消すという部分です。 その他の部分に関しては、私には細かい仕様が分かりません。 (前回の語句の次とはなんなのか等) ですので、まずご自身でログの出力やステップ実行するなどして、プログラムと自分が思い描いている動作とどう違うのか把握された方がよろしいかと思います。
syo46no

2018/08/22 13:29

すみません、ご回答いただいていたハイライトの履歴は解決いたしました。 すみません、ありがとうございます。 また何かありましたらお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問