Unity 科大讯飞离线语音合成

离线语音合成
本文介绍了一种使用C#实现的离线语音合成方法,并对比了在线语音合成方式。通过引入特定SDK及参数配置,实现了流畅自然的语音输出。文中详细记录了从SDK下载到代码实现的全过程。
该文章已生成可运行项目,

好久没有更新文章了,今天我们继续更新科大讯飞的语音的文章。
之前在语音合成部分由于在线语音合成的处理时间太长,所以使用了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()
本文章已经生成可运行项目
科大讯飞离线语音合成具有显著的技术特点,在使用方法和开发指南方面也有相应的规范。 技术特点上,离线语音合成技术基于语法规则,可将与语法一致的自然语言音频转换为文本输出,语法识别结果值域只在语法文件所列出的规则里,有很好的匹配率。并且,语法识别结果携带了结果的置信度,应用可根据置信分数决定结果是否有效,多用于要更准确结果且有限说法的语音控制,如家庭环境中空调、电视、电灯的控制等[^3]。 使用方法方面,不同场景有不同的操作流程。对于Java开发者,可通过相关项目将科大讯飞离线语音合成功能集成到自己的项目中,为智能客服、教育应用、智能家居系统等增添语音交互能力[^2]。在Windows环境下使用科大讯飞离线TTS语音朗读引擎,需获取科大讯飞SDK,由于其离线SDK与AppID捆绑,要在科大讯飞开发平台生成自己的应用和AppID,并下载Windows离线语音合成SDK;运行科大讯飞提供的Demo,确保能运行其中samples内的测试文件;使用特定仓库中的tts_offline_sample.c代码替换Demo中的对应文件;在代码中正确配置AppID以保证SDK正常运行;最后在Unity项目中使用ToSpeech.cs脚本调用封装好的DLL,实现文字到语音的转换,将文字合成为.wav音频文件。需注意在科大讯飞开发平台生成的AppID要与代码中的一致,否则可能导致SDK无法正常工作,且该Demo仅实现了将文字合成为.wav文件的功能,如需进一步扩展,需根据实际需求修改[^4]。在代码调用方面,可直接在代码里进行相关调用,如`import { SpeechInit, SpeechListener, SpeechListerTTS, BeginTTS, jumpToPermissionPage, deleteAllOutPutDir, startPlay, stopPlay, getAllFiles, unInitAi, unInit } from '@/uni_modules/yao-speech';` [^5]。 开发指南涵盖了多个方面。要进行离线命令词识别开发,需先了解离线命令词识别简介,它是把人的自然语言音频数据转换成文本数据的技术,这里主要介绍的离线ASR应用是只在本地识别个数受限制的语音,即离线的命令词识别(语法识别)。使用离线语法识别时,要先编写一个语法文件,然后通过调用QISRBuildGrammar接口编译本地语法文件,获得语法ID,并在会话时传入语法ID以使用该语法,后续会话继续使用此语法进行识别,无需再次构建。开发者可以去讯飞开放平台,登录自己账户后下载对应的离线命令词SDK [^3]。 ```python # 以下为示例代码框架,实际使用需根据具体情况修改 # 假设这是一个简单的Java集成示例 import com.iflytek.speech.*; public class OfflineTTSExample { public static void main(String[] args) { // 初始化 SpeechUtility.createUtility(SpeechUtility.APPID + "=your_app_id"); // 后续进行语音合成操作 } } ```
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

VAIN_K

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

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

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

打赏作者

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

抵扣说明:

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

余额充值