当前位置: 代码网 > it编程>网页制作>网页播放器 > unity之简单的语音交互

unity之简单的语音交互

2024年08月01日 网页播放器 我要评论
Entry和橙色状态之间的转换不能删除,一开始就跳到橙色块的状态。如果将橙色块直接设置旋转状态,那么一运行就自动跳到这里了,小球开局即跳,语音指令就没有意义了。这时我们回到Scene窗口,点击cube,在Animation窗口创建Property,我们这里想实现的效果是旋转,所以在Transform里面找Rotation。添加转换条件,当参数Rotating 为true时,发生从idle到Rotate的转换。再创建一个空的State,改名为Rotate,表示旋转状态。我说“停止”,它就停止。

做一个记录。

实现的效果为通过麦克风输入简单的指令,让cube动起来。

例如:我说“旋转”,它能旋转;我说“停止”,它就停止。

我使用的版本是unity2019.4.11f1,更高版本的应该也可以,但我没试过。

首先,创建项目

创建一个平面、物体cube。

使用动画机相关操作实现动作。

创建animator controller动画状态机,右侧inspector窗口可以改名字,改为cube,挂到cube上面。

 

 【ps:如果找不到animator那俩窗口了,去window里面找。】

创建state。橙色块为启动后自动跳的第一个状态,即默认状态。也就是说启动后entry→idle是无条件转换的。

entry和橙色状态之间的转换不能删除,一开始就跳到橙色块的状态。所以要设置为静止状态。如果将橙色块直接设置旋转状态,那么一运行就自动跳到这里了,小球开局即跳,语音指令就没有意义了。

【可以通过右键灰色状态块,set as layer default state 将该状态设置为默认状态。这里的设置都是灵活、不唯一的,我只记录我的过程。】

再创建一个空的state,改名为rotate,表示旋转状态。

创建动画animator,改名为rotate。

将动画rotate挂到状态rotate上:

①点击灰色块rotate

②点击动画rotate,不要松鼠标

③将动画rotate拖到状态rotate的motion属性上。

拖好的效果。

这时我们回到scene窗口,点击cube,在animation窗口创建property,我们这里想实现的效果是旋转,所以在transform里面找rotation。

给cube设置跳跃的动作:

①左侧可以展开

②、③添加关键帧

④让cube绕y轴转360°

⑤点击播放可以查看效果。

状态的转换。回到animator窗口,右键idle,make transition到rotate。表示由idle静止状态到rotate旋转状态的转换。

这里需要一个参数来判断转不转换。是布尔类型的。

改名为rotating。

 右键单击idle,添加从idle到rotate的转换。

同样添加从rotate到idle的转换。

添加转换条件,当参数rotating 为true时,发生从idle到rotate的转换。

从rotate到idle同理,设为false。

然后就到代码部分了。因为之前没基础,也是查了很多资料,参考了各路大神的代码。

创建c#脚本。【我习惯放到文件夹里】

下面是完整代码。

using system;
using system.collections;
using system.collections.generic;
using system.linq;
using unityengine;
using unityengine.windows.speech;

public class speechinteraction : monobehaviour
{
    //一些必要的定义
    private keywordrecognizer keywordrecognizer;//单词识别器
    private dictionary<string, action> actions = new dictionary<string, action>();//创建一个字典并初始化【必须初始化】,实现string和action的配对。
    animator animator;//动画机

    // start is called before the first frame update
    void start()
    {
        actions.add("旋转",rotate);//注册配对,说“旋转”对应rotate函数。
        actions.add("停止",stop);//说“停止”对应stop函数。
       
        //监听语音输入,并尝试将说出的短语与注册关键字列表匹配
        keywordrecognizer = new keywordrecognizer(actions.keys.toarray()); 
        keywordrecognizer.onphraserecognized += recognizedspeech;
        keywordrecognizer.start();

        //动画机
        animator = this.transform.getcomponent<animator>();
    }

    private void recognizedspeech(phraserecognizedeventargs speech)//把识别到的语句打印出来
    {
        debug.log(speech.text);
        actions[speech.text].invoke();
    }

    private void rotate()//旋转
    {
        animator.setbool("rotating", true);//rotating为状态转换参数
    }
    private void stop()//停止
    {
        animator.setbool("rotating", false);
    }
}

官方关于keywordrecognizer的手册:windows.speech.keywordrecognizer - unity 脚本 api

里面说仅在 windows 10 上可用,我是win11也可以的。

测试结果:

说“旋转”:是可以动起来的。

说“停止”:是会停的。 

控制台:

 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com