ArtiJason12335243 Ответов: 1

Как сделать внешний файл dict для моей программы распознавания речи по ключевым словам C#.


Я хочу, чтобы программа распознавания речи по ключевым словам C# загружала ключевые слова из текстового файла.dict, а не вводила ключевые слова в массив программы. Приведенный ниже код является рабочей программой, но если я хочу добавить тысячи новых ключевых слов в массив, это сделает string[]{array} таким большим, и мне придется перестраивать проект каждый раз, когда я делаю модификацию списка ключевых слов. Если я могу позволить программе загрузить текстовый или строковый файл ключевых слов при запуске программы, то я могу изменить внешний файл словаря ключевых слов в любое время без компиляции кода.


использование системы;
использование системы.Коллекции.Общий;
использование системы.Нарезание резьбы.Задачи;
использование системы.Речь.Распознавание;
использование системы.Речь.Синтез;
использование системы.Коллекции.Общий;
используя системы.Сведения;
используя системы.Текст;
использование системы.Глобализация;
использование системы.ИО;

// Речь в текст
amespace CSharp_Speech_ConsoleApp

{
программа занятий
{

[DllImport("winmm.dll")]

public static extern int waveInGetNumDevs();

SpeechRecognitionEngine recognizer = новый
SpeechRecognitionEngine (новый
Система.Глобализация.CultureInfo ("en-US"));

static void Main (string[] args)
{
// Создайте массив ключевых слов
Выбор команды = новый выбор();
//Как сделать этот массив, импортировав строки из внешнего файла ключевых слов ?
команды.Add(new String [] {"Good morning.", " Hello Mike.",
"Доброе утро, Эдди", "Добрый день", "Добрый вечер", " привет",
"Как дела", "послушай меня, Майк", " перестань слушать, Майк!"
});

GrammarBuilder gBuilder = новый GrammarBuilder();

gBuilder.Добавить (команды);
Grammar grammar = новая грамматика(gBuilder);

recogEngine.LoadGrammar (грамматика);


// получить общее количество устройств ввода звука

int waveInDevicesCount = waveInGetNumDevs();

if (waveInDevicesCount == 0)
{
Приставка.WriteLine ("микрофон не обнаружен.!");

}

ещё

{
Приставка.WriteLine ("обнаружен микрофон. ");

recogEngine.SetInputToDefaultAudioDevice();

recogEngine.SpeechRecognized += recogEngine_SpeechRecognized;

recogEngine.RecognizeAsync(RecognizeMode.Множественный);

}

Приставка.Линия чтения();
}
/ Дисплей речи / консоль признал результате текст
recogEngine_SpeechRecognized статический недействительным(объект отправителя,
SpeechRecognizedEventArgs е)
{

строки managedString = е.Результат.Текст;

char[] st = managedString.ToCharArray();

Приставка.WriteLine(st);

}

}

}

Что я уже пробовал:

У меня есть испытанный способ , как сделать массив и переменную заменить команды массив строк.Add (new String [] {(arr1) }; :

string[] arr1 = new string[] { "Good morning.","Hello Mike.", "Good morning Eddy.","Good afternoon.","Good Evening","Hello", "How are you", "Listen to me Mike", "Stop listening Mike!" };

Я использую arr1 для замены содержимого { } следующим образом :
.. Выбор команды = новый выбор();
.. команды.Add (new String [] {(arr1) } ;

но я обнаружил, что этот массив не может быть заменен эквивалентной переменной arr1. Если этот массив можно заменить на arr1, то я могу создать массив arr1, импортировав текстовый файл, содержащий ключевые слова при запуске программы. Как заменить этот массив строк ключевых слов другой переменной массива?

1 Ответов

Рейтинг:
6

Thomas Daniels

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

Так, commands.txt файл может выглядеть так:

Good morning.
Hello Mike.
Good morning Eddy.
Good afternoon.

И тогда вы могли бы прочитать его из своей программы:
using System.IO;
string[] commands = File.ReadAllLines("commands.txt");
Choices choices = new Choices(commands);


Документация о файле.ReadAllLines:
Файл.Метод ReadAllLines (String) (System.IO)[^]


ArtiJason12335243

Я достал линейные команды.Add (new String [] {"Доброе утро,.......}0; и заменен вашим кодом ,
Есть сообщение об ошибке: ошибка CS1503 Аргумент 1: не удается преобразовать из 'string []' в 'string' в gBuilder.Добавить (команды);

static void Main (string[] args)
{

string [] commands = File.ReadAllLines("C:\\public\\Artigen\\commands.txt");
Choices choices = новые варианты выбора(команды);
GrammarBuilder gBuilder = новый GrammarBuilder();
gBuilder.Добавить (команды); - <----------------------------------------сообщение на этой линии.(красная линия)
Grammar grammar = новая грамматика(gBuilder);
recogEngine.LoadGrammar (грамматика);

ArtiJason12335243

@ProgramFox Спасибо, я нашел проблему, 1). команды нужно заменить на выбор, как показано ниже.
....
GrammarBuilder gBuilder = новый GrammarBuilder();
gBuilder.Добавить (выбор); <-------------------------вот в чем проблема.
Grammar grammar = новая грамматика(gBuilder);
recogEngine.LoadGrammar (грамматика);
.....

и 2). command.txt содержание каждой строки нужно использовать знак "" для каждой строки. "доброе утро." - Добрый вечер...и сохраните файл как unicode.
и теперь это работает.
Большое спасибо,

Thomas Daniels

Я не понимаю № 2. Вам не нужны кавычки, если вы используете мой код... Разве это не работает без них?