В продолжение темы шаблона для плагина, решил попробовать сделать что-то более функциональное.
Под руку попался Microsoft Speech API 5.1.
К тому же на форуме по-моему поднимался вопрос неплохо было бы прикрутить управление персонажем к SpeechAPI.
В общем неделю по мере возможности занимаюсь этим вопросом, сталкиваясь с определенными проблемами и пытаясь решить их.
Но видимо силы и желание понемногу заканчиваются поэтому обращаюсь к вам за помощью.
Но больше опять каша в голове )
Пытаюсь собрать плагин на основе двух вариантов
1)первый на основе COM библиотеки SpeechLib
этот вариант должен подойти для Unity 2.5 (Pro и Free),
но скорее всего не будет работать на windows 7 (да и возможности нет проверить)
2)второй на основе .NET Framework 3.0 библиотеки System.Speech
этот вариант должен подойти для Unity 3.0 (Pro и Free) и
должен работать на windows 7 (опять же я не проверю)
Для использования и разработки плагина необходимо установить
Speech SDK 5.1И возможно немного подучить его для распознавания речи в Control Panel\Speech
Microsoft не предоставляет библиотеки русского языка.
Делается это for fun по причине насколько я успел разобраться что кроссплатформенноси пока ожидать не стоит,
пока для каждой платформы используется свой recognition engine.
Но возможно в какой-то степени будет опытом в дальнейшем.
Unreal Engine 2 использовал SpeechAPI но отказались видимо по причине что поддерживалась только в 32-битной версии Windows.
Буду рад если кто-то поможет разобраться с ошибками или сам доработает и особенно если добавит результат в тему.
Ни на что не претендую просто учусь )
А возможно кому-то и польза будет.
Сдесь можно почитать
про распознование речиЧто получилось и что не получилось у меня на данный момент.
Проговаривание текста
1)базовы вариант text to speech (SpeechLib) работает.
2)Unity вылетает и ругается.
Распознавание текста speech recognition
Unity вылетает и ругается в обоих случаях немогу перевести распознанный текст в string и извлечь его в Unity
В первом и втором варианте к своим dll добавил в папку плагинов Interop.SpeechLib.dll(для первого варианта) и System.Speech.dll(для второго варианта), хотя есть подозрения что этот вопрос должен или может по другому решаться.
Вот собственно код обращения к dll из Unity:
для SpeechSynthesis:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using SpeechLib;
using SpeechLibSynt3;
public class SpeechLibS3 : MonoBehaviour
{
public string textToSpeak = "Hello";
void Start ()
{
SpLibSynt3 listener = new SpLibSynt3();
listener.Speak(textToSpeak);
}
}
для SpeechRecognition:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using SpeechLib;
using SpeechLibReco3;
public class SpeechLibR3 : MonoBehaviour
{
public string[] Words = new string[] {"Open", "Close", "Run"};
void Update ()
{
SpLibReco3 listener = new SpLibReco3();
listener.BuildDictionnary(Words);
//Debug.Log(listener.RecoText());
}
}
dll SpeechSynthesis(SpeechLib):
Используется csharp
using System;
using SpeechLib;
namespace SpeechLibSynt3
{
public class SpLibSynt3
{
public bool done = false;
SpVoice Voice;
public SpLibSynt3()
{
//Voice.EndStream += new _ISpeechVoiceEvents_EndStreamEventHandler(Voice_EndStream);
}
public void Speak(string textToSpeak)
{
Voice = new SpVoice();
Voice.Speak(textToSpeak, SpeechVoiceSpeakFlags.SVSFDefault);//SVSFDefault SVSFlagsAsync
}
public void Voice_EndStream(int StreamNumber, object StreamPosition)
{
done = true;
}
}
}
dll SpeechRecognition(SpeechLib):
Используется csharp
using System;
using SpeechLib;
namespace SpeechLibReco3
{
public class SpLibReco3
{
SpSharedRecoContext recContext;
ISpeechRecoGrammar grammar;
ISpeechGrammarRule menuRule;
public SpLibReco3()
{
// создаем экземпляр распознавателя
recContext = new SpSharedRecoContext();
// добавляем обработчик событий для получения распознанных голосовых команд
recContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(recContext_SpeechRecognized);
}
public void BuildDictionnary(string[] Words)
{
//Создаем экземпляр словаря
grammar = recContext.CreateGrammar(0);
grammar.Reset(0);
menuRule = grammar.Rules.Add("Commands", SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic, 1);
object PropValue = "";
//добавляем все слова из списка распознавания
foreach (string word in Words)
{
if (word.Trim().Length > 0)
{
menuRule.InitialState.AddWordTransition(null, word, " ", SpeechGrammarWordType.SGLexical, word, 1, ref PropValue, 1.0F);
}
}
grammar.Rules.Commit();
grammar.CmdSetRuleState("Commands", SpeechRuleState.SGDSActive);
}
//Получаем результат из движка
public void recContext_SpeechRecognized(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)
{
RecoText(Result.PhraseInfo.GetText(0, -1, true));
}
//Забираем текст
private static void RecoText(string format)
{
string txtOut = format;
}
}
}
dll SpeechSynthesis(System.Speech):
Используется csharp
using System;
using System.Speech.Synthesis;
namespace SpeechSynthesis3
{
public class SpSynt3
{
SpeechSynthesizer synth;
public void Speak(string textToSpeak)
{
synth = new SpeechSynthesizer();
synth.SelectVoice("Microsoft Sam");
synth.Speak(textToSpeak);
}
}
}
dll SpeechRecognition(System.Speech):
Используется csharp
using System;
using System.Speech.Recognition;
namespace SpeechRecognition3
{
public class SpReco3
{
SpeechRecognitionEngine sre;
public SpReco3()
{
//создаем движок распознавания речи
sre = new SpeechRecognitionEngine();
//присоединяем к нему аудиодевайс выставленный по умолчанию
sre.SetInputToDefaultAudioDevice();
//добавляем обработчик событий для получения распознанных голосовых команд
sre.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sre_SpeechRecognized);
}
public void BuildDictionnary(string[] Words)
{
//Создаем экземпляр словаря
GrammarBuilder grammarBuilder = new GrammarBuilder();
//добавляем все слова из списка распознавания
grammarBuilder.Append(new Choices(Words));
Grammar customGrammar = new Grammar(grammarBuilder);
sre.UnloadAllGrammars();
sre.LoadGrammar(customGrammar);
sre.RecognizeAsync(RecognizeMode.Multiple);
}
//Получаем результат из движка
public void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Text.Length >= 1)
RecoText(e.Result);
}
//Забираем текст
private static void RecoText(RecognitionResult recognitionResult)
{
string txtOut = recognitionResult.Text;
}
}
}
У вас нет доступа для просмотра вложений в этом сообщении.