depak gupta Ответов: 1

Как конвертировать речь (файл.wav) в текстовый файл?


Как я могу конвертировать речь (записанный файл .wav) в текстовый файл. Я написал код C#, как показано ниже. Пожалуйста, проверьте и скажите мне, все ли правильно или нет. Я запустил этот код и получаю сообщение об ошибке.


using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Recognition;
using System.Speech.AudioFormat;

namespace reco
{
    public partial class Form1 : Form
    {
        private SpeechRecognitionEngine recognitionEngine;

        public Form1()
        {
            InitializeComponent();
            try
            {
               
                recognitionEngine = new SpeechRecognitionEngine();
                DictationGrammar dg = new DictationGrammar();
                recognitionEngine.LoadGrammar(dg);
                recognitionEngine.SetInputToDefaultAudioDevice();

                recognitionEngine.SetInputToWaveFile(@"C:\Users\Deep\Music\New folder\mp3.wav");
                recognitionEngine.EndSilenceTimeout = new TimeSpan(0, 0, 2);
                recognitionEngine.Recognize();
                recognitionEngine.RecognizeAsync();
                recognitionEngine.SpeechHypothesized += new EventHandler<speechhypothesizedeventargs>(reco_SpeechHypothesized);
                recognitionEngine.SpeechRecognized += new EventHandler<speechrecognizedeventargs>(reco_SpeechRecognized);
                recognitionEngine.RecognizeCompleted += new EventHandler<recognizecompletedeventargs>(reco_RecognizeCompleted);
                recognitionEngine.AudioSignalProblemOccurred += new EventHandler<audiosignalproblemoccurredeventargs>(reco_AudioSignalProblemOccurred);
                recognitionEngine.SpeechDetected += new EventHandler<speechdetectedeventargs>(reco_SpeechDetected);
                recognitionEngine.SpeechRecognitionRejected += new EventHandler<speechrecognitionrejectedeventargs>(reco_SpeechRecognitionRejected);

                recognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch (Exception e)
            {
                MessageBox.Show("the Error"+e);
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
        void reco_AudioSignalProblemOccurred(object sender, AudioSignalProblemOccurredEventArgs e)
        {
            richTextBox1.AppendText(e.AudioSignalProblem.ToString());
        }

        void reco_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
            richTextBox1.AppendText(e.Result.Text);
        }

        void reco_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
        {
            richTextBox1.AppendText("Rejected!");
        }

        void reco_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            richTextBox1.AppendText("Recognition Complete!");
        }

        void reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            richTextBox1.AppendText(e.Result.Text);
        }

        void reco_SpeechDetected(object sender, SpeechDetectedEventArgs e)
        {
            richTextBox1.AppendText("Speech Detected!");
        }

     
      
         
        }
    }</speechrecognitionrejectedeventargs></speechdetectedeventargs></audiosignalproblemoccurredeventargs></recognizecompletedeventargs></speechrecognizedeventargs></speechhypothesizedeventargs>

Mike Meinz

Пожалуйста, укажите ошибку, которую вы получаете, и какую строку кода Вы получаете. Используйте интерактивный отладчик Visual Studio, чтобы помочь вам.

1 Ответов

Рейтинг:
2

Mike Meinz

Эта версия компилируется. Вы не были достаточно ясны, чтобы сказать, была ли это ошибка компиляции или ошибка времени выполнения. Если ваша проблема заключалась в ошибке компиляции, эта версия решает эту проблему. Поскольку это код C#, верхний и нижний регистр должны совпадать. Я исправил предложения <event args="">, Чтобы использовать верхний и нижний регистр, как это: <SpeechRecognizedEventArgs>.

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Recognition;
using System.Speech.AudioFormat;
 
namespace reco
{
    public partial class Form1 : Form
    {
        private SpeechRecognitionEngine recognitionEngine;
 
        public Form1()
        {
            InitializeComponent();
            try
            {
               
                recognitionEngine = new SpeechRecognitionEngine();
                DictationGrammar dg = new DictationGrammar();
                dg.Name = "Dictation Grammar";
                recognitionEngine.LoadGrammar(dg);
                recognitionEngine.SetInputToDefaultAudioDevice();
                //recognitionEngine.SetInputToWaveFile(@"C:\Users\Deep\Music\New folder\mp3.wav");
                recognitionEngine.SetInputToDefaultAudioDevice();  // Gets sound from microphone
                recognitionEngine.EndSilenceTimeout = new TimeSpan(0, 0, 2);
                // Following two lines are not needed. They cause error!
                //recognitionEngine.Recognize();
                //recognitionEngine.RecognizeAsync();
                recognitionEngine.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(reco_SpeechHypothesized);
                recognitionEngine.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(reco_SpeechRecognized);
                recognitionEngine.RecognizeCompleted += new EventHandler<RecognizeCompletedEventArgs>(reco_RecognizeCompleted);
                recognitionEngine.AudioSignalProblemOccurred += new EventHandler<AudioSignalProblemOccurredEventArgs>(reco_AudioSignalProblemOccurred);
                recognitionEngine.SpeechDetected += new EventHandler<SpeechDetectedEventArgs>(reco_SpeechDetected);
                recognitionEngine.SpeechRecognitionRejected += new EventHandler<SpeechRecognitionRejectedEventArgs>(reco_SpeechRecognitionRejected);
                recognitionEngine.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error "+e);
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
        void reco_AudioSignalProblemOccurred(object sender, AudioSignalProblemOccurredEventArgs e)
        {
            richTextBox1.AppendText(e.AudioSignalProblem.ToString());
        }
 
        void reco_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
        {
            richTextBox1.AppendText(e.Result.Text);
        }
 
        void reco_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
        {
            richTextBox1.AppendText("Rejected!");
        }
 
        void reco_RecognizeCompleted(object sender, RecognizeCompletedEventArgs e)
        {
            richTextBox1.AppendText("Recognition Complete!");
        }
 
        void reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            richTextBox1.AppendText(e.Result.Text);
        }
 
        void reco_SpeechDetected(object sender, SpeechDetectedEventArgs e)
        {
            richTextBox1.AppendText("Speech Detected!");
        }

             
        }
    }


Пересмотренное решение - 27 марта 2013 года 2:44 ВЕЧЕРА EDT:
    static void speech1(object sender, SpeechRecognizedEventArgs e)
    {
        if (e.Result.Text == "record")
        {
            showRecord();
        }
        else if (e.Result.Text == "exit")
        {
            Application.Exit();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        showRecord();
    }
    static void showRecord()
    {
    record r=new record();
    r.show();
    }
}
public class record
{
     public  void show() { }
}


depak gupta

я получаю ошибку времени выполнения в ( recognitionEngine.SetInputToWaveFile(@"C:\Users\Deep\Music\New папка\mp3.wav");)строка № 30 как файл не найдена ,является ли способ записи пути правильным

Mike Meinz

Формат fullpathfilename выглядит для меня правильным.

Является ли "Deep" вашим именем пользователя?
Есть ли папка с именем "Новая папка" в вашей "музыке"?
Есть ли файл с именем "mp3.wav" в "новой папке"?

depak gupta

да ,все это правильно, но та же ошибка, пожалуйста, запустите ее в своей системе и ответьте.
жду вашего ответа.

Mike Meinz

Я побежал на своем компьютере, заменив ваше имя пользователя на мое имя пользователя. У меня его не было .WAV-файл с речью в нем, поэтому я попробовал как файл .MP3, так и A .файл WMA. И то, и другое вызвало ажиотаж. FormatException Я предполагаю, что механизм распознавания речи не может обрабатывать форматы MP3 или WMA. Я взял одну из систем Windows .WAV звуковые файлы, переместил его в "новую папку" и переименовал в свое имя файла "mp3.wav". Программа нашла файл нормально но потом выбросила его InvalidOperationException об исполнении приказа RecognizeAsync метод. Вы не можете одновременно выполнять синхронизацию и асинхронность. Вы должны выбрать один из них. Поскольку вы устанавливаете события, которые генерируются при использовании асинхронного режима, и поскольку у вас есть второй RecognizeAsync в конце вашего кода, я закомментировал следующие строки и получил "Recognition Complete!" в RichTextBox. Конечно, поскольку у меня не было никакой речи в файле, не было никакого дополнительного текста, добавленного к RichTextBox.

Прокомментировано:
//recognitionEngine.Распознавать();
//recognitionEngine.RecognizeAsync();

Вы уверены, что ваше имя пользователя правильно указано в имени файла fullpath?
Вы уверены, что ваш файл называется "mp3.wav"?
Вы уверены, что папка называется "Новая папка"?
Вы уверены, что получаете ошибку "файл не найден", а не ошибку исключения формата?
Вы переименовали звуковой файл и изменили расширение файла с MP3 на WAV?

Mike Meinz

Я добавил следующее утверждение после того, как новая Диктатураграмма(); заявление:
dg.Name = "Dictation Grammar";

Я заменил его на другой. SetInputToWaveFile заявление со следующим содержанием:
recognitionEngine.SetInputToDefaultAudioDevice();

Он распознал речь с помощью микрофона моей гарнитуры. Он не был точен на 100%, но я видел, что он распознает многие слова, которые я говорил.

depak gupta

Спасибо ,сэр, за то, что вы сделали это для меня, я тоже сделал то же самое, что вы сказали, но это немного отличается от того, что я записал, а также не точно, пожалуйста, дайте несколько советов по этому поводу.

Mike Meinz

Это мой первый опыт работы с распознаванием речи. Я читал комментарии по другим вопросам, где программисты пытались использовать механизм распознавания речи Microsoft и испытывали очень плохие результаты для диктовки. Механизм распознавания речи Microsoft, по-видимому, работает лучше всего, если вы создаете грамматику всего из нескольких слов (Пример: STOP START SLOW FAST UP DOWN LEFT RIGHT) и используете ее с приложением, которое требует распознавания только этих нескольких слов.

depak gupta

итак,не могли бы вы сказать мне, как я могу использовать эту команду, чтобы, когда я говорю start, она запускала мое приложение

Mike Meinz

Идея заключается в том, что вы встроите его в свое приложение, чтобы оно реагировало на ограниченный набор произносимых команд.

Чтобы запустить приложение или любую другую программу с помощью голосового ввода, вы должны использовать функцию распознавания речи, встроенную в Windows на панели управления\простота доступа\распознавание речи (в Windows 8. может быть найдено в других версиях Windows).

Опять же, помните, что это лучше всего, когда используется с очень ограниченным количеством слов.

depak gupta

сэр, я поместил код ниже, но я не знаю, как выполнить нажатие кнопки по команде, если это возможно, проверьте и улучшите его.

Mike Meinz

Когда вы определяете, что правильный текст был "услышан", вызовите событие щелчка соответствующей кнопки.

depak gupta

извините, вот ниже приведен код, пожалуйста, проверьте и расскажите, как реализовать нажатие кнопки с помощью команды.

Mike Meinz

Вы можете поместить эти строки кода в следующее и просто вызвать "doit".
частный недействительными доить()
{
запись r = новая запись();
Р.Показать();
};


Или, если вам абсолютно необходимо вызвать событие нажатия кнопки, вам нужно указать параметры при вызове события нажатия кнопки:
button1_Click(отправитель,e);

или, если это не сработает, тогда это:
EventArgs e;
button1_Click(отправитель,e);

depak gupta

сэр. Я хочу, чтобы он работал с моей речевой командой, а не нажимал кнопку вручную.

Mike Meinz

Похоже, ты не понимаешь, что я сказал тебе, как именно это сделать. Для того, чтобы устранить путаницу, я написал код для вас. См. раздел решение 1 с надписью "пересмотренное решение - 26 марта 2013 года 07:27 утра EDT"

depak gupta

сэр. Я поместил свой код в "решение 3", но не знаю, как можно было бы решить эту ошибку.

Mike Meinz

Какая ошибка? Пожалуйста, предоставьте подробную информацию о вашей проблеме.

Пожалуйста, внесите это изменение:
статическая пустота showRecord()
{
запись r=новая запись();
Р.показать();
}

Кроме того, здесь, на CodeProject, считается дурным тоном публиковать последующие вопросы в качестве "решений". Вы должны использовать Improve Question нажмите кнопку в верхней части этой страницы и внесите изменения в свой первоначальный вопрос.

depak gupta

ошибка отображается на r.show() и showRecord().

Mike Meinz

См. пересмотренное решение 1 выше.

Я добавил немного кода заглушки для класса с именем "рекорд" с метод, названный "шоу". Для меня это было нормально. Не видя точного синтаксиса в вашей программе и точного сообщения об ошибке, я не могу догадаться, что вызывает вашу проблему.