Unity 科大讯飞离线语音合成

5 篇文章 6 订阅
订阅专栏
4 篇文章 0 订阅
订阅专栏

好久没有更新文章了,今天我们继续更新科大讯飞的语音的文章。
之前在语音合成部分由于在线语音合成的处理时间太长,所以使用了C#自带的语音合成,处理是快了,但是合成的声音特别难听。
所以今天更新一个离先语音合成的文章。
废话不多说,直接进入正题。

1.下载语音合成SDK,需要选择离线的,否者无法使用离线的。在这里插入图片描述

2.解压SDK,这里我们需要用到common.jet;xiaofeng.jet;xiaoyan.jet这三个.jet文件必须要,缺一不可,否则会报错误代码:文件缺失。然后就是msc_x64.dll库。在这里插入图片描述

3.代码部分

using UnityEngine;
using msc;
using System;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using UnityEngine.Networking;
using System.Collections;

public class Main : MonoBehaviour
{
    private const string speekText = "北京市今天全天晴,气温7℃ ~ 19℃,空气质量优,有北风4-5级,挺凉快的。";
    private const string session_begin_params = "voice_name = xiaoyan, text_encoding = utf8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 0";
    private string offline_session_begin_params;
    private IntPtr session_id;
    private int err_code;

    private byte[] bytes;

    private void Awake()
    {
        string xiaoyan_path = (Application.dataPath + "/TTS/xiaoyan.jet").Replace("/", "\\");
        string common_path = (Application.dataPath + "/TTS/common.jet").Replace("/", "\\");
        offline_session_begin_params = "engine_type = local, voice_name = xiaoyan, text_encoding = utf8, tts_res_path = fo|" + xiaoyan_path + ";fo|" + common_path + ", sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 0";
    }

    private void Start()
    {
        int message = MSCDLL.MSPLogin("", "", "appid=5f80198b,word_dir= . ");
        if (message != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("登录失败!错误信息:" + message);
        }
        Debug.Log("登录成功");
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //Online_TTS(speekText);
            Offline_TTS(speekText);
        }
    }

    private void Online_TTS(string speekText)
    {
        //语音合成开始
        session_id = MSCDLL.QTTSSessionBegin(session_begin_params, ref err_code);

        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("初始化语音合成失败,错误信息:" + err_code);
            return;
        }
        //语音合成设置文本
        err_code = MSCDLL.QTTSTextPut(session_id, speekText, (uint)Encoding.Default.GetByteCount(speekText), string.Empty);
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("向服务器发送数据失败,错误信息:" + err_code);
            return;
        }

        uint audio_len = 0;
        SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
        MemoryStream memoryStream = new MemoryStream();
        memoryStream.Write(new byte[44], 0, 44);
        while (true)
        {
            IntPtr source = MSCDLL.QTTSAudioGet(session_id, ref audio_len, ref synth_status, ref err_code);
            byte[] array = new byte[audio_len];
            if (audio_len > 0)
            {
                Marshal.Copy(source, array, 0, (int)audio_len);
            }
            memoryStream.Write(array, 0, array.Length);
            Thread.Sleep(100);
            if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || err_code != (int)Errors.MSP_SUCCESS)
                break;
        }

        err_code = MSCDLL.QTTSSessionEnd(session_id, "");
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("会话结束失败!错误信息: " + err_code);
            return;
        }

        WAVE_Header header = getWave_Header((int)memoryStream.Length - 44);//创建wav文件头
        byte[] headerByte = StructToBytes(header);//把文件头结构转化为字节数组
        memoryStream.Position = 0;//定位到文件头
        memoryStream.Write(headerByte, 0, headerByte.Length);//写入文件头
        bytes = memoryStream.ToArray();
        memoryStream.Close();
        if (Application.streamingAssetsPath + "/" + name + ".wav" != null)
        {
            if (File.Exists(Application.streamingAssetsPath + "/" + name + ".wav"))
                File.Delete(Application.streamingAssetsPath + "/" + name + ".wav");
            File.WriteAllBytes(Application.streamingAssetsPath + "/" + name + ".wav", bytes);
            StartCoroutine(OnAudioLoadAndPaly(Application.streamingAssetsPath + "/" + name + ".wav", AudioType.WAV, gameObject.GetComponent<AudioSource>()));
        }

        Debug.Log("合成结束成功");
    }

    private void Offline_TTS(string speekText)
    {
        //语音合成开始
        session_id = MSCDLL.QTTSSessionBegin(offline_session_begin_params, ref err_code);

        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("初始化语音合成失败,错误信息:" + err_code);
            return;
        }
        //语音合成设置文本
        err_code = MSCDLL.QTTSTextPut(session_id, speekText, (uint)Encoding.Default.GetByteCount(speekText), string.Empty);
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("向服务器发送数据失败,错误信息:" + err_code);
            return;
        }

        uint audio_len = 0;
        SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
        MemoryStream memoryStream = new MemoryStream();
        memoryStream.Write(new byte[44], 0, 44);
        while (true)
        {
            IntPtr source = MSCDLL.QTTSAudioGet(session_id, ref audio_len, ref synth_status, ref err_code);
            byte[] array = new byte[audio_len];
            if (audio_len > 0)
            {
                Marshal.Copy(source, array, 0, (int)audio_len);
            }
            memoryStream.Write(array, 0, array.Length);
            Thread.Sleep(1);
            if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || err_code != (int)Errors.MSP_SUCCESS)
                break;
        }

        err_code = MSCDLL.QTTSSessionEnd(session_id, "");
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("会话结束失败!错误信息: " + err_code);
            return;
        }

        WAVE_Header header = getWave_Header((int)memoryStream.Length - 44);//创建wav文件头
        byte[] headerByte = StructToBytes(header);//把文件头结构转化为字节数组
        memoryStream.Position = 0;//定位到文件头
        memoryStream.Write(headerByte, 0, headerByte.Length);//写入文件头
        bytes = memoryStream.ToArray();
        memoryStream.Close();
        if (Application.streamingAssetsPath + "/" + name + ".wav" != null)
        {
            if (File.Exists(Application.streamingAssetsPath + "/" + name + ".wav"))
                File.Delete(Application.streamingAssetsPath + "/" + name + ".wav");
            File.WriteAllBytes(Application.streamingAssetsPath + "/" + name + ".wav", bytes);
            StartCoroutine(OnAudioLoadAndPaly(Application.streamingAssetsPath + "/" + name + ".wav", AudioType.WAV, gameObject.GetComponent<AudioSource>()));
        }

        Debug.Log("合成结束成功");
    }


    /// <summary>
    /// 结构体转字符串
    /// </summary>
    /// <param name="structure"></param>
    /// <returns></returns>
    private byte[] StructToBytes(object structure)
    {
        int num = Marshal.SizeOf(structure);
        IntPtr intPtr = Marshal.AllocHGlobal(num);
        byte[] result;
        try
        {
            Marshal.StructureToPtr(structure, intPtr, false);
            byte[] array = new byte[num];
            Marshal.Copy(intPtr, array, 0, num);
            result = array;
        }
        finally
        {
            Marshal.FreeHGlobal(intPtr);
        }
        return result;
    }

    /// <summary>
    /// 结构体初始化赋值
    /// </summary>
    /// <param name="data_len"></param>
    /// <returns></returns>
    private WAVE_Header getWave_Header(int data_len)
    {
        return new WAVE_Header
        {
            RIFF_ID = 1179011410,
            File_Size = data_len + 36,
            RIFF_Type = 1163280727,
            FMT_ID = 544501094,
            FMT_Size = 16,
            FMT_Tag = 1,
            FMT_Channel = 1,
            FMT_SamplesPerSec = 16000,
            AvgBytesPerSec = 32000,
            BlockAlign = 2,
            BitsPerSample = 16,
            DATA_ID = 1635017060,
            DATA_Size = data_len
        };
    }

    /// <summary>
    /// 语音音频头
    /// </summary>
    private struct WAVE_Header
    {
        public int RIFF_ID;
        public int File_Size;
        public int RIFF_Type;
        public int FMT_ID;
        public int FMT_Size;
        public short FMT_Tag;
        public ushort FMT_Channel;
        public int FMT_SamplesPerSec;
        public int AvgBytesPerSec;
        public ushort BlockAlign;
        public ushort BitsPerSample;
        public int DATA_ID;
        public int DATA_Size;
    }

    /// <summary>
    /// UnityWebRequest 加载音频播放
    /// </summary>
    /// <param name="url">路径</param>
    /// <param name="type">音频格式</param>
    /// <param name="audio">音频</param>
    /// <returns></returns>
    public IEnumerator OnAudioLoadAndPaly(string url, AudioType type, AudioSource audio)
    {
        UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, type);
        yield return www.SendWebRequest();
        if (www.isHttpError || www.isNetworkError)
            Debug.LogError(www.error);
        else
        {
            AudioClip clip = DownloadHandlerAudioClip.GetContent(www);
            audio.clip = clip;
            audio.Play();
        }
    }

    private void OnDestroy()
    {
        MSCDLL.MSPLogout();
        Debug.Log("注销成功");
    }
}

4.在线参数和离线参数区别

///在线参数
session_begin_params = "voice_name = xiaoyan, text_encoding = utf8, sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 0";
///离线参数
string xiaoyan_path = (Application.dataPath + "/TTS/xiaoyan.jet").Replace("/", "\\");//这个斜杠更换前面的文章有说过,这里就不说了
string common_path = (Application.dataPath + "/TTS/common.jet").Replace("/", "\\");//不更换会报参数信息错误的问题
session_begin_params = "engine_type = local, voice_name = xiaoyan, text_encoding = utf8, tts_res_path = fo|" + xiaoyan_path + ";fo|" + common_path + ", sample_rate = 16000, speed = 50, volume = 50, pitch = 50, rdn = 0";

多了"engine_type","tts_res_path "两个参数

5.在线合成方法和离线合成方法的区别

 private void Online_TTS(string speekText)
    {
        //语音合成开始
        session_id = MSCDLL.QTTSSessionBegin(session_begin_params, ref err_code);

        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("初始化语音合成失败,错误信息:" + err_code);
            return;
        }
        //语音合成设置文本
        err_code = MSCDLL.QTTSTextPut(session_id, speekText, (uint)Encoding.Default.GetByteCount(speekText), string.Empty);
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("向服务器发送数据失败,错误信息:" + err_code);
            return;
        }

        uint audio_len = 0;
        SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
        MemoryStream memoryStream = new MemoryStream();
        memoryStream.Write(new byte[44], 0, 44);
        while (true)
        {
            IntPtr source = MSCDLL.QTTSAudioGet(session_id, ref audio_len, ref synth_status, ref err_code);
            byte[] array = new byte[audio_len];
            if (audio_len > 0)
            {
                Marshal.Copy(source, array, 0, (int)audio_len);
            }
            memoryStream.Write(array, 0, array.Length);
            Thread.Sleep(100);
            if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || err_code != (int)Errors.MSP_SUCCESS)
                break;
        }

        err_code = MSCDLL.QTTSSessionEnd(session_id, "");
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("会话结束失败!错误信息: " + err_code);
            return;
        }

        WAVE_Header header = getWave_Header((int)memoryStream.Length - 44);//创建wav文件头
        byte[] headerByte = StructToBytes(header);//把文件头结构转化为字节数组
        memoryStream.Position = 0;//定位到文件头
        memoryStream.Write(headerByte, 0, headerByte.Length);//写入文件头
        bytes = memoryStream.ToArray();
        memoryStream.Close();
        if (Application.streamingAssetsPath + "/" + name + ".wav" != null)
        {
            if (File.Exists(Application.streamingAssetsPath + "/" + name + ".wav"))
                File.Delete(Application.streamingAssetsPath + "/" + name + ".wav");
            File.WriteAllBytes(Application.streamingAssetsPath + "/" + name + ".wav", bytes);
            StartCoroutine(OnAudioLoadAndPaly(Application.streamingAssetsPath + "/" + name + ".wav", AudioType.WAV, gameObject.GetComponent<AudioSource>()));
        }

        Debug.Log("合成结束成功");
    }

    private void Offline_TTS(string speekText)
    {
        //语音合成开始
        session_id = MSCDLL.QTTSSessionBegin(offline_session_begin_params, ref err_code);

        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("初始化语音合成失败,错误信息:" + err_code);
            return;
        }
        //语音合成设置文本
        err_code = MSCDLL.QTTSTextPut(session_id, speekText, (uint)Encoding.Default.GetByteCount(speekText), string.Empty);
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("向服务器发送数据失败,错误信息:" + err_code);
            return;
        }

        uint audio_len = 0;
        SynthStatus synth_status = SynthStatus.MSP_TTS_FLAG_STILL_HAVE_DATA;
        MemoryStream memoryStream = new MemoryStream();
        memoryStream.Write(new byte[44], 0, 44);
        while (true)
        {
            IntPtr source = MSCDLL.QTTSAudioGet(session_id, ref audio_len, ref synth_status, ref err_code);
            byte[] array = new byte[audio_len];
            if (audio_len > 0)
            {
                Marshal.Copy(source, array, 0, (int)audio_len);
            }
            memoryStream.Write(array, 0, array.Length);
            Thread.Sleep(1);
            if (synth_status == SynthStatus.MSP_TTS_FLAG_DATA_END || err_code != (int)Errors.MSP_SUCCESS)
                break;
        }

        err_code = MSCDLL.QTTSSessionEnd(session_id, "");
        if (err_code != (int)Errors.MSP_SUCCESS)
        {
            Debug.LogError("会话结束失败!错误信息: " + err_code);
            return;
        }

        WAVE_Header header = getWave_Header((int)memoryStream.Length - 44);//创建wav文件头
        byte[] headerByte = StructToBytes(header);//把文件头结构转化为字节数组
        memoryStream.Position = 0;//定位到文件头
        memoryStream.Write(headerByte, 0, headerByte.Length);//写入文件头
        bytes = memoryStream.ToArray();
        memoryStream.Close();
        if (Application.streamingAssetsPath + "/" + name + ".wav" != null)
        {
            if (File.Exists(Application.streamingAssetsPath + "/" + name + ".wav"))
                File.Delete(Application.streamingAssetsPath + "/" + name + ".wav");
            File.WriteAllBytes(Application.streamingAssetsPath + "/" + name + ".wav", bytes);
            StartCoroutine(OnAudioLoadAndPaly(Application.streamingAssetsPath + "/" + name + ".wav", AudioType.WAV, gameObject.GetComponent<AudioSource>()));
        }

        Debug.Log("合成结束成功");
    }

线程休眠时间从100变成1
至于为什么在线的休眠时间长,缩短休眠时长无法正常合成的问题,这个还望有大佬知道的说声。以及不能没有休眠的原因。

最后:我是一菜鸡,不停努力的菜鸡。

Unity接入科大讯飞语音识别源码工程
07-22
Unity接入科大讯飞语音识别源码工程! 文章介绍链接在这:https://blog.csdn.net/zhangay1998/article/details/118973373
科大讯飞离线TTS语音朗读引擎 windws sdk ,c代码 封装成dll使用C#调用(unity插件)
11-05
科大讯飞离线TTS语音朗读引擎 windws sdk ,c代码 封装成dll使用C#调用 由于讯飞的离线sdk与appid 是捆绑的,所以需要在讯飞开发平台生成自己的应用和appid 并下载 windows 离线语音合成 sdk ,能够运行 demo 里的 samples 内的测试文件。用本代码 替换 demo里的 tts_offline_sample.c 的代码。注意appid 正确 包含文件: 1、tts_offline_sample.c //封装dll源文件 2、ToSpeech.cs //unity调用脚本 注:该demo 只是将文字合成了.wav文件
科大讯飞语音离线命令识别
weixin_45833112的博客
03-31 3973
注册讯飞账号,做相关的认证,只有认证通过才能下载部分免费的资源。官网地址:https://console.xfyun.cn/创建我的应用后再在离线命令识别 2、新建 IatActivity 声明必要的类成员 3、初始化监听 4、语音命令识别的周期监听 5、离线命令UI监听 6、获取离线资源 7、参数设置 8、弹窗提示 9、语音权限提示窗口 10、动态申请权限 11、在onCreate() 方法中初始 12、按钮点击 处理识别命令测试 13、界面a
科大讯飞离线语音命令词识别的使用说明
热门推荐
hfut_why的博客
08-27 2万+
最近因为项目的需求,需要在无网络的情况下实现语音识别的功能,因为之前在线识别一直用的科大的,所以经理就和我说,你花半天时间简单熟悉一下,然后出一个Demo,下午有人过来看;因为之前科大在线SR也是别人做的,准确的说我只是了解过一点,也写过相关的blog——百度语音识别结合云知声离线TTSDemo(AS),Android原生TTS的基本使用以及配合中文语音包实现中文TTS等,但是就半天不...
科大讯飞在线语音合成.unitypackage
09-03
科大讯飞在线语音合成.unitypackage,使用方法详见https://blog.csdn.net/vegetable_haker/article/details/120138626
科大讯飞语音合成示例(离线版本) java可调用 dll so封装
03-04
提供java jni示例程序,linux so工程,windows dll工程,将科大讯飞语音合成程序封装成windows支持的dll和linux支持的so并且导出api,java使用jni直接调用。代码均已编译测试通过,需要appid和mscdll则可以自己去官网重新下载。
科大讯飞语音唤醒调用,返回错误代码11210
weixin_38278711的博客
11-14 1199
以下转载内容: 近期在做python调用科大讯飞的唤醒词SDK。由于科大讯飞给的SDK是exe文件,无法直接调用。修改了一下代码生成了dll文件。用python 调用,但是调用后出现11210代码错误。 经检查发现是由于生成的dll需要在同级目录下放入科大讯飞SDK中的msc_x64.dll和bin/msc文件夹。 msc文件夹有关于唤醒词的jet文件等。 awaken_sample.dll是我自己生成的dll文件。切记msc_x64.dll和bin/msc文件夹必须放在同级目录下。希望对你们.
UNITY实战进阶-科大讯飞TTS(离线语音合成) unity播放PCM格式的wav(不依赖第三方库)-7
欲望如海水,越喝越渴。
11-19 7042
科大讯飞TTS(离线语音合成) unity播放PCM格式的wav 不依赖第三方库
讯飞tts调用
ipqwcwt的专栏
11-29 2158
目标:能在arm开发板上运行 拿到arm版本libmcs.so库后尝试集成到开发板,导入库后运行10102错误,查找官方错误码。 注意到官方给的例子有两个参数: const char* session_begin_params = "engine_type = local,voice_name=xiaoyan, text_encoding = UTF8, tts_res_path = f...
接口调用-【4】讯飞离线语音合成Windows/Linux
p6448777的博客
06-29 1619
1、离线语音合成调用主函数(离线语音合成调用属于简单的,无回调函数) package com.iflytek; import com.iflytek.util.Step2_tts_thread; import com.iflytek.util.Step3_audioFormat; import java.util.Scanner; import javax.sound.sampled.*; /** * 请注意!!! * 1.首选到控制台https://console.xfyun.cn/servic
科大讯飞语音合成Unity工程案例.unitypackage
09-08
科大讯飞语音合成Unity工程案例,需要自己去网站申请 创建项目 替换appid
unity科大讯飞语音识别Windows平台(包含录音功能)
10-23
unity科大讯飞语音识别Windows平台(添加了录音功能) 文章链接:https://blog.csdn.net/hyy_sui_yuan/article/details/83307827
科大讯飞语音合成Unity插件自带案例.unitypackage
09-10
基于科大讯飞SDK,开发各种案例
科大讯飞麦克风阵列修改唤醒词
张富强的博客
07-31 3817
模块内部默认唤醒词为“灵犀灵犀”,如想体验其他唤醒词,可以根据以下步骤进行更新: 1. 登录讯飞开放平台,创建唤醒资源并下载,修改XXX.jet名称为ivw_resource.jet 2. 用数据线将开发板与电脑进行连接 3. adb push ivw_resource.jet  /usr 4. 重启系统 adb shell reboot 等10秒钟左右 5. 没有了
科大讯飞 新版AIkit 离线语音听写 Java 版本
weixin_41923368的博客
09-26 1096
前言:科大讯飞的新版离线语音听写,由于官网demo是kt语言开发的,咱也看不懂kt,搜遍了全网也没看到一个java版的新版离线语音demo,现记录下,留给有缘人参考!毕竟咱在这上面遇到了不少的坑。如果能留言指正,那就更好了。一、先把官网Demo中resource下的文件放到sdk目录下,示例如下。二、AudioRecord进行音频录制并写入本地创建的pcm文件。一、Activity简单布局 加几个语音听写的监听回调。Activity中权限使用类,用不用都行,看自己。Activity的布局。
AI芯片与离线语音交互
分享AI芯片开发经验
03-02 654
介绍离线语音交互方案,从端侧芯片功能、端侧常见技术等角度剖析方案要点
JAVA接入讯飞离线合成语音
weixin_44076096的博客
11-30 2273
java接入讯飞离线合成语音
Unity可用 运行时语音合成(文本转语音)插件 RT-Voice PRO
qq_39735878的博客
02-01 4558
Unity语音合成文本转语音插件 RT-Voice PRO前言一、导入RT-Voice PRO插件二、使用步骤1.先看自带例子(01-Speech)2.自行配置总结 前言 提示:这个插件在Unity Asset Store 卖 78美刀,确实买不起啊。 😂 AssetStore下载链接 文章最后会附上我下载过的的插件包。 兼容性 适用于Windows、macOS、Android和iOS的本地提供程序 作者只使用到了Windows平台😂,其他平台应该还是正常能用的 RT-Voice PRO 官方网站 RT
Unity AI 语音识别语音合成、人机交互(一)
VAIN的博客
05-22 6450
Unity AI助手语音天气播报自我介绍项目介绍思路制作准备开始 自我介绍 大家好,我是VAIN,这是我在CSDN的第一篇文章,之前一直在微博博客上写文章,今后会用CSDN给大家更新一些技术帖,还希望大家多多关照! 项目介绍 因为公司项目要求,今天给大家分享一个unity制作AI助手的帖子,由于网上相关的文章还是比较少的,要么就是不是特别的全面。所以分享一下,希望可以帮助到小伙伴们。 思路 1.需要将我们说的话转成文字(语音识别) 2.AI助手理解我们说的话(人机交互) 3.将AI助手的返回信息转成语音(语
unity 科大讯飞语音听写插件
最新发布
01-25
Unity科大讯飞语音听写插件是一个在Unity开发环境中引入科大讯飞语音听写功能的插件。通过该插件,开发者可以在自己的Unity项目中轻松地实现语音听写的功能,使用户可以通过语音输入来实现文字的录入和命令的执行。 这个插件提供了简单易用的接口,包括语音识别、录音和音频处理等功能。开发者可以通过调用相应的接口来实现语音听写功能,并可以根据自己的需求进行定制化设置,比如识别语言、识别模式、识别结果的处理等。 使用Unity科大讯飞语音听写插件,可以为游戏、教育、娱乐等应用场景增加更加直观和便捷的交互方式。用户可以通过语音输入来控制游戏角色、实现语音交互式教学、实现语音搜索和指令等功能,为应用增添更多的乐趣和便利。 总的来说,Unity科大讯飞语音听写插件为Unity开发者提供了一个快速实现语音听写功能的解决方案,为应用开发带来了更多可能性和灵活性。帮助开发者节省开发时间,提高开发效率,为用户带来更加智能、便捷的应用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Unity AI 语音识别、语音合成、人机交互(一) 6441
  • Unity 科大讯飞语音唤醒 3577
  • Unity 科大讯飞离线语音合成 2340
  • Unity 自动录音并截取音频保存 2183
  • .glb模型转.fbx模型 1924

分类专栏

  • AI 5篇
  • 建模 1篇
  • Unity 2篇
  • Android 2篇
  • 音频 4篇

最新评论

  • Unity 科大讯飞语音唤醒

    guiqian1987725: 搞定了么?我的回调不执行

  • Unity 科大讯飞语音唤醒

    guiqian1987725: 搞定了么?我的回调不执行

  • Unity Android 查看日志

    2401_84181564: 文章内容通俗易懂,适合不同层次的读者。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Unity Android 查看日志

    2401_84538135: 优质好文,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • Unity Android 查看日志

    2401_84538337: 这篇文章是优质之作,内容充实,结构明晰,语言流畅且通俗易懂,适合广大读者阅读。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Unity Android 查看日志
  • Unity获取linux命令行参数
  • Unity WebGL 遇到的各种问题
2024年1篇
2023年3篇
2022年1篇
2021年1篇
2020年7篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VAIN_K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源顾问有限公司起名免费的英文翻译起名网在线叶辰萧初然最新更新全文免费金融贷款公司起名智能起名网站搜索西门子热水器说明书奇宝斋交易平台宝宝起名性林起个什么网名火姚怎么起名字王性女孩起名男孩带晟的起名少年好莱坞2018年小狗起名大全科技公司起名 新颖创意上海教育电视台直播在线观看高清七绝山副本名典公司起名免费测试带火和木的女孩起名翡翠店起名取名深圳布吉二手房给姓林是什么男孩起名相起名字男孩用硕字起名字徐州电信淑字组词起名非你莫属北大怼老板完整视频青岛区号诛仙1电影淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化