Я получил этот ответ отсюда, я проверил даты и увидел, что он был опубликован через несколько дней после вашего сообщения, поэтому я решил, что вы его пропустили. Android распознавания речи и аудио записи одновременно
один чувак там говорит:
Я получил решение, которое работает хорошо, чтобы распознавать речь и аудио запись. Здесь ( https://github.com/katchsvartanian/voiceRecognition ) ссылка на простой проект Android, который я создал, чтобы показать работу решения. Кроме того, я поместил несколько экранов печати в проект, чтобы проиллюстрировать приложение.
Я попытаюсь кратко объяснить подход, который я использовал. В этом проекте я объединил две функции: Google Speech API и запись Flac.
Google Speech API вызывается через HTTP-соединения. Майк Пульц (Mike Pultz) дает более подробную информацию об API:
"(...) новый API [Google] является API-интерфейсом для полнодуплексной потоковой передачи. Это означает, что он фактически использует два HTTP-соединения - одно POST запрос на загрузку контента в виде «живого» фрагментированного потока и второй GET-запрос для доступа к результатам, что имеет гораздо больше смысла для более длинных аудиосэмплов или для потокового аудио. »
Однако для этого API требуется получить звуковой файл FLAC для правильной работы. Это заставляет нас перейти ко второй части: Запись Flac
Я реализовал запись Flac в этом проекте путем извлечения и адаптации некоторых фрагментов кода и библиотек из приложения с открытым исходным кодом под названием AudioBoo. AudioBoo использует собственный код для записи и воспроизведения формата flac.
Таким образом, можно записать звук flac, отправить его в Google Speech API, получить текст и воспроизвести только что записанный звук.
Проект, который я создал, имеет базовые принципы для его работы и может быть улучшен для конкретных ситуаций. Чтобы заставить его работать в другом сценарии, необходимо получить ключ Google Speech API, который получается, будучи частью группы Google Chromium-dev. Я оставил один ключ в этом проекте, чтобы показать, что он работает, но в конце концов я его удалю. Если кому-то нужна дополнительная информация об этом, дайте мне знать, потому что я не могу разместить более двух ссылок в этом посте.
На мой взгляд, это было сделано потому, что в большинстве случаев вам не нужны общие специализированные параметры, такие как «Повтор» или «Игнорировать».
Если вам нужно больше, чем OK / Отмена, вы должны использовать какой-то диалог задачи, например, с записанными ответами. Таким образом, вы не ограничены несколькими значениями перечисления, которые кто-то придумал несколько десятилетий назад, а DialogResult просто положительный / отрицательный для базового использования, и вы можете реализовать свое собственное свойство, специфичное для ваших расширенных потребностей. Следовательно, требуется только true / false, а значение null указывает на то, что окно еще не было закрыто (этому свойству еще не присвоено значение).
Если у вас есть диалог, который представляет собой нечто большее, чем просто вопрос, на который пользователь должен ответить (например, форма ввода), вам обычно лучше использовать OK / Отмена, поэтому вам не нужно больше значений.
Свойство DialogResult
определено в классе Window
. Не все Окна
являются диалоговыми окнами. Следовательно, это свойство актуально не для всех окон. Окно
, которое было показано с помощью Show ()
, а не ShowDialog ()
, будет (предположительно, если вы не установите его по какой-либо причине) будет иметь DialogResult = null
.
Вот простой пример:
Window1.xaml :
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
<Button Name="b1">Show</Button>
<Button Name="b2">ShowDialog</Button>
</StackPanel>
</Window>
Window1.xaml.cs :
using System.Windows;
namespace WpfApplication1
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
b1.Click += new RoutedEventHandler(b1_Click);
b2.Click += new RoutedEventHandler(b2_Click);
}
void b1_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.Closed += delegate
{
MessageBox.Show("" + w.DialogResult);
};
w.Show();
}
void b2_Click(object sender, RoutedEventArgs e)
{
var w = new Window();
w.ShowDialog();
MessageBox.Show("" + w.DialogResult);
}
}
}
Когда вы закроете окна, вы обратите внимание, что диалоговое окно имеет DialogResult
из false
, в то время как не диалоговое окно имеет null DialogResult
.
Согласно документации MSDN :
DialogResult имеет значение null, когда диалоговое окно коробка отображается, но не принимается и не отменено.
Но я не уверен, как это могло произойти, если вы не имеете дело с несколькими потоками, обращающимися к диалогу.
В документации говорится, что неверно, когда происходит одно из следующих событий:
- Нажмите ALT + F4.
- Щелкает по кнопке «Закрыть».
- В меню «Система» выбирает «Закрыть».
ИМО, это потому, что DialogResult не всегда используется. Видите ли, вы можете установить DialogResult только в том случае, если окно вызывается его методом ShowDialog (), если вы вызываете его с помощью его метода Show () и пытаетесь установить DialogResult в любое значение, оно выдаст InvalidOperationException. Так что я думаю, что это причина, по которой он допускает значение NULL, если вы вызываете окно с помощью метода Show (), оно будет равно NULL, если вы вызовете его с помощью ShowDialog (), решать вам.
ShowDialog всегда будет возвращать истину или ложь. DialogResult будет принимать нулевое состояние только тогда, когда диалог открыт. При переходе от null к true или false диалоговое окно закрывается, и исходный вызов ShowDialog возвращается.