C# 当发出语音命令时,保持播放机移动
我正在尝试使用GrammarRecognizer制作一个简单的语音命令游戏。我已经设法让玩家在说出相应的单词时向左或向右移动 我试图让玩家不断朝一个方向移动,直到说出相反的词 我尝试过使用while循环,但它似乎使程序崩溃 任何帮助都将不胜感激 请参阅下面的播放器控制器代码:C# 当发出语音命令时,保持播放机移动,c#,visual-studio,unity3d,grammar,C#,Visual Studio,Unity3d,Grammar,我正在尝试使用GrammarRecognizer制作一个简单的语音命令游戏。我已经设法让玩家在说出相应的单词时向左或向右移动 我试图让玩家不断朝一个方向移动,直到说出相反的词 我尝试过使用while循环,但它似乎使程序崩溃 任何帮助都将不胜感激 请参阅下面的播放器控制器代码: using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; // for stringb
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text; // for stringbuilder
using UnityEngine;
using UnityEngine.Windows.Speech; // grammar recogniser
public class PlayerScript : MonoBehaviour
{
private GrammarRecognizer gr;
public Rigidbody2D playerRb;
private void Start(){
playerRb = this.GetComponent<Rigidbody2D>();
gr = new GrammarRecognizer(Application.streamingAssetsPath + "/SimpleGrammar.xml", ConfidenceLevel.Medium);
gr.OnPhraseRecognized += GR_OnPhraseRecognized;
gr.Start();
Debug.Log("Grammer loaded and recogniser started");
}
private void GR_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
StringBuilder message = new StringBuilder();
SemanticMeaning[] meanings = args.semanticMeanings;
foreach(SemanticMeaning meaning in meanings)
{
string keyString = meaning.key.Trim();
//Get meanings
string valueString = meaning.values[0].Trim();
//output phrase
message.Append("Key: " + keyString + ", Value: " + valueString );
//if left is said
if(valueString == "left"){
//move left
transform.Translate(new Vector3(-200 * Time.deltaTime,0,0));
//transform.Translate(new Vector3(-200 * Time.deltaTime,0,0));
}
//if right is said
if(valueString == "right"){
//move right
transform.Translate(new Vector3(200 * Time.deltaTime,0,0));
}
}
Debug.Log(message);
}
private void OnApplicationQuit()
{
if(gr != null && gr.IsRunning)
{
gr.OnPhraseRecognized -= GR_OnPhraseRecognized;
gr.Stop();
}
}
}
使用系统集合;
使用System.Collections.Generic;
使用System.IO;
使用System.Text;//对于stringbuilder
使用UnityEngine;
使用UnityEngine.Windows.Speech;//语法识别器
公共类PlayerScript:MonoBehavior
{
私人语法认知者gr;
公共刚体2D播放器B;
私有void Start(){
playerRb=this.GetComponent();
gr=新语法认知程序(Application.streamingAssetsPath+“/SimpleGrammar.xml”,ConfidenceLevel.Medium);
gr.onphrasecognized+=gr_onphrasecognized;
gr.Start();
Log(“已加载语法并启动识别器”);
}
private void GR_onphraseRecognited(phraseRecognitizedeventargs args)
{
StringBuilder消息=新建StringBuilder();
SemanticMeaning[]含义=args.semanticMeanings;
foreach(语义中的语义含义)
{
字符串keyString=means.key.Trim();
//获得意义
string valueString=含义。值[0]。修剪();
//输出短语
message.Append(“键:+keyString+”,值:+valueString);
//如果说左
如果(valueString==“左”){
//向左移动
transform.Translate(新向量3(-200*Time.deltaTime,0,0));
//transform.Translate(新向量3(-200*Time.deltaTime,0,0));
}
//如果说对了
如果(valueString==“右”){
//右移
transform.Translate(新向量3(200*Time.deltaTime,0,0));
}
}
Debug.Log(消息);
}
Application Quit()上的私有void
{
if(gr!=null&&gr.IsRunning)
{
gr.onphrasecognized-=gr_onphrasecognized;
gr.Stop();
}
}
}
请参见下面我的语法XML文件:
?xml version="1.0" encoding="utf-8" ?>
<grammar xml:lang="en" root="rightorleft"
tag-format="semantics/1.0" version="1.0"
xmlns="http://www.w3.org/2001/06/grammar">
<rule id="rightorleft">
<one-of>
<item>
<ruleref uri="#right"/>
</item>
<item>
<ruleref uri="#left"/>
</item>
</one-of>
</rule>
<rule id="left">
<item>left</item>
</rule>
<rule id="right">
<item>right</item>
</rule>
</grammar>
?xml version=“1.0”encoding=“utf-8”>
左边
正当
很好地保存最后的结果,而不是只做一次,例如
private enum Direction
{
Idle,
Left,
Right
}
private Direction currentDirection;
private void Update()
{
switch(currentDirection)
{
case Direction.Left:
transform.Translate(Vector3.right * -200 * Time.deltaTime);
break;
case Direction.Right:
transform.Translate(Vector3.right * 200 * Time.deltaTime);
break;
}
}
private void GR_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
var message = new StringBuilder();
var meanings = args.semanticMeanings;
foreach(var meaning in meanings)
{
var keyString = meaning.key.Trim();
var valueString = meaning.values[0].Trim();
message.Append($"Key: {keyString}, Value: {valueString}");
switch(valueString)
{
case "left":
currentDirection = Direction.Left;
break;
case "right":
currentDirection = Direction.Right;
break;
}
}
Debug.Log(message);
}
从来都不知道Unity有这样的功能,但是GR_onphraseRecognited是一个回调,所以它只会移动一次。其次,一旦在
foreach
循环中识别出语音命令,您应该继续
,停止检查。您可能希望在识别短语时启动协同程序,或者在Update
中执行某些操作。现在时间。deltaTime
实际上没有任何意义。感谢manThanks人的帮助,非常感谢!!!!