首页 > 其他分享 >如何在 Unity 游戏中集成 AI 语音识别?

如何在 Unity 游戏中集成 AI 语音识别?

时间:2023-06-16 21:44:29浏览次数:46  
标签:samples clip AI text writer private Write Unity 语音

简介

语音识别是一项将语音转换为文本的技术,想象一下它如何在游戏中发挥作用?发出命令操纵控制面板或者游戏角色、直接与 NPC 对话、提升交互性等等,都有可能。本文将介绍如何使用 Hugging Face Unity API 在 Unity 游戏中集成 SOTA 语音识别功能。

您可以访问 itch.io 网站 下载 Unity 游戏样例,亲自尝试一下语音识别功能。

先决条件

阅读文本可能需要了解一些 Unity 的基本概念。除此之外,您还需安装 Hugging Face Unity API,可以点击 之前的博文 阅读 API 安装说明。

步骤

1. 设置场景

在本教程中,我们将设置一个非常简单的场景。玩家可以点击按钮来开始或停止录制语音,识别音频并转换为文本。

首先我们新建一个 Unity 项目,然后创建一个包含三个 UI 组件的画布 (Canvas):

  1. 开始按钮: 按下以开始录制语音。
  2. 停止按钮: 按下以停止录制语音。
  3. 文本组件 (TextMeshPro): 显示语音识别结果文本的地方。

2. 创建脚本

创建一个名为 SpeechRecognitionTest 的脚本,并将其附加到一个空的游戏对象 (GameObject) 上。

在脚本中,首先定义对 UI 组件的引用:

[SerializeField] private Button startButton;
[SerializeField] private Button stopButton;
[SerializeField] private TextMeshProUGUI text;

在 inspector 窗口中分配对应组件。

然后,使用 Start() 方法为开始和停止按钮设置监听器:

private void Start() {
    startButton.onClick.AddListener(StartRecording);
    stopButton.onClick.AddListener(StopRecording);
}

此时,脚本中的代码应该如下所示:

using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class SpeechRecognitionTest : MonoBehaviour {
    [SerializeField] private Button startButton;
    [SerializeField] private Button stopButton;
    [SerializeField] private TextMeshProUGUI text;

    private void Start() {
        startButton.onClick.AddListener(StartRecording);
        stopButton.onClick.AddListener(StopRecording);
    }

    private void StartRecording() {

    }

    private void StopRecording() {

    }
}

3. 录制麦克风语音输入

现在,我们来录制麦克风语音输入,并将其编码为 WAV 格式。这里需要先定义成员变量:

private AudioClip clip;
private byte[] bytes;
private bool recording;

然后,在 StartRecording() 中,使用 Microphone.Start() 方法实现开始录制语音的功能:

private void StartRecording() {
    clip = Microphone.Start(null, false, 10, 44100);
    recording = true;
}

上面代码实现以 44100 Hz 录制最长为 10 秒的音频。

当录音时长达到 10 秒的最大限制,我们希望录音行为自动停止。为此,需要在 Update() 方法中写上以下内容:

private void Update() {
    if (recording && Microphone.GetPosition(null) >= clip.samples) {
        StopRecording();
    }
}

接着,在 StopRecording() 中,截取录音片段并将其编码为 WAV 格式:

private void StopRecording() {
    var position = Microphone.GetPosition(null);
    Microphone.End(null);
    var samples = new float[position * clip.channels];
    clip.GetData(samples, 0);
    bytes = EncodeAsWAV(samples, clip.frequency, clip.channels);
    recording = false;
}

最后,我们需要实现音频编码的 EncodeAsWAV() 方法,这里直接使用 Hugging Face API,只需要将音频数据准备好即可:

private byte[] EncodeAsWAV(float[] samples, int frequency, int channels) {
    using (var memoryStream = new MemoryStream(44 + samples.Length * 2)) {
        using (var writer = new BinaryWriter(memoryStream)) {
            writer.Write("RIFF".ToCharArray());
            writer.Write(36 + samples.Length * 2);
            writer.Write("WAVE".ToCharArray());
            writer.Write("fmt ".ToCharArray());
            writer.Write(16);
            writer.Write((ushort)1);
            writer.Write((ushort)channels);
            writer.Write(frequency);
            writer.Write(frequency * channels * 2);
            writer.Write((ushort)(channels * 2));
            writer.Write((ushort)16);
            writer.Write("data".ToCharArray());
            writer.Write(samples.Length * 2);

            foreach (var sample in samples) {
                writer.Write((short)(sample * short.MaxValue));
            }
        }
        return memoryStream.ToArray();
    }
}

完整的脚本如下所示:

using System.IO;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class SpeechRecognitionTest : MonoBehaviour {
    [SerializeField] private Button startButton;
    [SerializeField] private Button stopButton;
    [SerializeField] private TextMeshProUGUI text;

    private AudioClip clip;
    private byte[] bytes;
    private bool recording;

    private void Start() {
        startButton.onClick.AddListener(StartRecording);
        stopButton.onClick.AddListener(StopRecording);
    }

    private void Update() {
        if (recording && Microphone.GetPosition(null) >= clip.samples) {
            StopRecording();
        }
    }

    private void StartRecording() {
        clip = Microphone.Start(null, false, 10, 44100);
        recording = true;
    }

    private void StopRecording() {
        var position = Microphone.GetPosition(null);
        Microphone.End(null);
        var samples = new float[position * clip.channels];
        clip.GetData(samples, 0);
        bytes = EncodeAsWAV(samples, clip.frequency, clip.channels);
        recording = false;
    }

    private byte[] EncodeAsWAV(float[] samples, int frequency, int channels) {
        using (var memoryStream = new MemoryStream(44 + samples.Length * 2)) {
            using (var writer = new BinaryWriter(memoryStream)) {
                writer.Write("RIFF".ToCharArray());
                writer.Write(36 + samples.Length * 2);
                writer.Write("WAVE".ToCharArray());
                writer.Write("fmt ".ToCharArray());
                writer.Write(16);
                writer.Write((ushort)1);
                writer.Write((ushort)channels);
                writer.Write(frequency);
                writer.Write(frequency * channels * 2);
                writer.Write((ushort)(channels * 2));
                writer.Write((ushort)16);
                writer.Write("data".ToCharArray());
                writer.Write(samples.Length * 2);

                foreach (var sample in samples) {
                    writer.Write((short)(sample * short.MaxValue));
                }
            }
            return memoryStream.ToArray();
        }
    }
}

如要测试该脚本代码是否正常运行,您可以在 StopRecording() 方法末尾添加以下代码:

File.WriteAllBytes(Application.dataPath + "/test.wav", bytes);

好了,现在您点击 Start 按钮,然后对着麦克风说话,接着点击 Stop 按钮,您录制的音频将会保存为 test.wav 文件,位于工程目录的 Unity 资产文件夹中。

4. 语音识别

接下来,我们将使用 Hugging Face Unity API 对编码音频实现语音识别。为此,我们创建一个 SendRecording() 方法:

using HuggingFace.API;

private void SendRecording() {
    HuggingFaceAPI.AutomaticSpeechRecognition(bytes, response => {
        text.color = Color.white;
        text.text = response;
    }, error => {
        text.color = Color.red;
        text.text = error;
    });
}

该方法实现将编码音频发送到语音识别 API,如果发送成功则以白色显示响应,否则以红色显示错误消息。

别忘了在 StopRecording() 方法的末尾调用 SendRecording():

private void StopRecording() {
    /* other code */
    SendRecording();
}

5. 最后润色

最后来提升一下用户体验,这里我们使用交互性按钮和状态消息。

开始和停止按钮应该仅在适当的时候才产生交互效果,比如: 准备录制、正在录制、停止录制。

在录制语音或等待 API 返回识别结果时,我们可以设置一个简单的响应文本来显示对应的状态信息。

完整的脚本如下所示:

using System.IO;
using HuggingFace.API;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public class SpeechRecognitionTest : MonoBehaviour {
    [SerializeField] private Button startButton;
    [SerializeField] private Button stopButton;
    [SerializeField] private TextMeshProUGUI text;

    private AudioClip clip;
    private byte[] bytes;
    private bool recording;

    private void Start() {
        startButton.onClick.AddListener(StartRecording);
        stopButton.onClick.AddListener(StopRecording);
        stopButton.interactable = false;
    }

    private void Update() {
        if (recording && Microphone.GetPosition(null) >= clip.samples) {
            StopRecording();
        }
    }

    private void StartRecording() {
        text.color = Color.white;
        text.text = "Recording...";
        startButton.interactable = false;
        stopButton.interactable = true;
        clip = Microphone.Start(null, false, 10, 44100);
        recording = true;
    }

    private void StopRecording() {
        var position = Microphone.GetPosition(null);
        Microphone.End(null);
        var samples = new float[position * clip.channels];
        clip.GetData(samples, 0);
        bytes = EncodeAsWAV(samples, clip.frequency, clip.channels);
        recording = false;
        SendRecording();
    }

    private void SendRecording() {
        text.color = Color.yellow;
        text.text = "Sending...";
        stopButton.interactable = false;
        HuggingFaceAPI.AutomaticSpeechRecognition(bytes, response => {
            text.color = Color.white;
            text.text = response;
            startButton.interactable = true;
        }, error => {
            text.color = Color.red;
            text.text = error;
            startButton.interactable = true;
        });
    }

    private byte[] EncodeAsWAV(float[] samples, int frequency, int channels) {
        using (var memoryStream = new MemoryStream(44 + samples.Length * 2)) {
            using (var writer = new BinaryWriter(memoryStream)) {
                writer.Write("RIFF".ToCharArray());
                writer.Write(36 + samples.Length * 2);
                writer.Write("WAVE".ToCharArray());
                writer.Write("fmt ".ToCharArray());
                writer.Write(16);
                writer.Write((ushort)1);
                writer.Write((ushort)channels);
                writer.Write(frequency);
                writer.Write(frequency * channels * 2);
                writer.Write((ushort)(channels * 2));
                writer.Write((ushort)16);
                writer.Write("data".ToCharArray());
                writer.Write(samples.Length * 2);

                foreach (var sample in samples) {
                    writer.Write((short)(sample * short.MaxValue));
                }
            }
            return memoryStream.ToArray();
        }
    }
}

祝贺!现在您可以在 Unity 游戏中集成 SOTA 语音识别功能了!

如果您有任何疑问,或想更多地参与 Hugging Face for Games 系列,可以加入 Hugging Face Discord 频道!


英文原文: https://hf.co/blog/unity-asr

作者: Dylan Ebert

译者: SuSung-boy

审校/排版: zhongdongy (阿东)

标签:samples,clip,AI,text,writer,private,Write,Unity,语音
From: https://www.cnblogs.com/huggingface/p/17486564.html

相关文章

  • Generative AI 新世界:过去、现在和未来
    人类善于分析事物。但是现在看来,机器很有可能做得更好。机器可以不知疲倦夜以继日地分析数据,不断从中找到很多人类场景用例的模式:信用卡欺诈预警、垃圾邮件检测,股票价格预测、以及个性化地推荐商品和视频等等。他们在这些任务上变得越来越聪明了。这被称为“分析人工智能(Analytic......
  • 冠军!天翼云在国际AI顶会大模型挑战赛中拔得头筹!
    6月7日,国际人工智能顶会CVPR2023举办的第一届大模型挑战赛(CVPR2023WorkshoponFoundationModel:1stfoundationmodelchallenge)落下帷幕,本次比赛吸引了来自全球著名高校和知名企业的1024名参赛者。经过为期2个月的激烈角逐,天翼云AI团队(队名CTRL)在多任务大模型赛道中表现出色,......
  • SpringBoot集成Swagger报错:Failed to start bean 'documentationPluginsBootstrapper'
    本文章向大家介绍SpringBoot集成Swagger报错:Failedtostartbean'documentationPluginsBootstrapper';,主要包括SpringBoot集成Swagger报错:Failedtostartbean'documentationPluginsBootstrapper';使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需......
  • 【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专
     近日,由航天科技控股集团股份有限公司主办的“数字基座智慧物联—AIRIOT4.0平台发布会”在北京圆满落幕。航天三院科技委总工程师王连宝应邀出席本次会议并接受媒体采访,共同参与访谈的还有AIRIOT产品研发创始人、航天科技控股集团股份有限公司智慧物联事业部总经理田淼,两位就......
  • vue-文字转语音
    vueSpeechSynthesisUtterance监听事件onstart开始合成onend合成结束onerror合成错误onpause暂停onresume恢复暂停onboundary在句子或单词边界<template><divclass="language"><!--<divclass="right-lanage">--><imgsrc=&q......
  • Wordpress:Briefly unavailable for scheduled maintenance. Check back in a minute.
    场景描述:在更新Wordpress版本从Version6.2.1升级到Version6.2.2时候,顺带点升级的插件太多了,突然就崩溃报错:Brieflyunavailableforscheduledmaintenance.Checkbackinaminute。 因为用的是Siteground建站,以为过会就好了,等了五分钟还是这样,所以进Siteground后台,文件管......
  • AI时代已经到来,不想被抛弃,特别是传统产业的你,怎么办?
    由于ChatGTP的惊人表现,本来已经趋于平淡的AI,又火爆起来。毫无疑问,人类已经进入了AI时代,AI将渗入到各行各业,渗入到生活与工作的每个方面。这是一场新的工业革命,很多工作都将消失,但也会产生很多新的机会,而新的机会一定属于掌握AI或会使用AI技术的人。由于TDengine作为一款时序数......
  • AI智能视频技术在安防监控领域的场景应用
    AI智能视频技术是一种基于人工智能、深度学习和计算机视觉等技术的视频处理技术。它可以通过对视频进行分析和识别,实现各种智能化应用,如视频监控、智能家居、自动驾驶等。目前,AI智能视频技术已经实现了人脸识别、行为分析、智能跟踪、场景分析、目标检测、图像增强等多种功能,可以......
  • AI2023矢量设计:Illustrator2023(Win&Mac) 激活版
    lustrator2023是Adobe公司推出的一款专业矢量图形设计软件。它可以用于创作各种类型的设计项目,如商标、图标、海报、包装等。使用Illustrator2023,用户可以创建高质量的矢量图形,这些图形可以任意缩放而不会失真,因此非常适合制作需要多种尺寸的设计项目。此外,该软件还支持创建复杂的......
  • NV400F语音IC,充电桩语音方案,支持UART音频更换
    随着电动车的不断增加,户外、居民楼、小区、办公楼附近出现了越来越多的共享充电桩,不管是是给汽车、还是电动单车充电,这种新型共享充电设备越来越被人们所接受和青睐。而在共享充电桩的使用过程中,语音交互技术则是一项不可或缺的技术,它可以带给用户更高效、更便捷的使用体验。对于当......