Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理

这篇具有很好参考价值的文章主要介绍了Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理

目录

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理

一、简单介绍

二、实现原理

三、注意事项

四、实现步骤

五、关键代码


一、简单介绍

Unity 工具类,自己整理的一些游戏开发可能用到的模块,单独独立使用,方便游戏开发。

本节介绍,这里在使用微软的Azure 使用SSML进行SS语音合成的音频,并且获取表情嘴型Animation 数据,并且保存到本地,在特定的情况下,用于本地读取音频和表情嘴型Animation 数据,直接使用,避免可能网络访问造成的延迟问题,这里简单说明,如果你有更好的方法,欢迎留言交流。

语音合成标记语言 (SSML) 是一种基于 XML 的标记语言,可用于微调文本转语音输出属性,例如音调、发音、语速、音量等。 与纯文本输入相比,你拥有更大的控制权和灵活性。

可以使用 SSML 来执行以下操作:

  •     定义输入文本结构,用于确定文本转语音输出的结构、内容和其他特征。 例如,可以使用 SSML 来定义段落、句子、中断/暂停或静音。 可以使用事件标记(例如书签或视素)来包装文本,这些标记可以稍后由应用程序处理。
  •     选择语音、语言、名称、样式和角色。 可以在单个 SSML 文档中使用多个语音。 调整重音、语速、音调和音量。 还可以使用 SSML 插入预先录制的音频,例如音效或音符。
  •     控制输出音频的发音。 例如,可以将 SSML 与音素和自定义词典配合使用来改进发音。 还可以使用 SSML 定义单词或数学表达式的具体发音。
     

下面是 SSML 文档的基本结构和语法的子集:

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xmlns:mstts="https://www.w3.org/2001/mstts" xml:lang="string">
    <mstts:backgroundaudio src="string" volume="string" fadein="string" fadeout="string"/>
    <voice name="string" effect="string">
        <audio src="string"></audio>
        <bookmark mark="string"/>
        <break strength="string" time="string" />
        <emphasis level="value"></emphasis>
        <lang xml:lang="string"></lang>
        <lexicon uri="string"/>
        <math xmlns="http://www.w3.org/1998/Math/MathML"></math>
        <mstts:audioduration value="string"/>
        <mstts:express-as style="string" styledegree="value" role="string"></mstts:express-as>
        <mstts:silence type="string" value="string"/>
        <mstts:viseme type="string"/>
        <p></p>
        <phoneme alphabet="string" ph="string"></phoneme>
        <prosody pitch="value" contour="value" range="value" rate="value" volume="value"></prosody>
        <s></s>
        <say-as interpret-as="string" format="string" detail="string"></say-as>
        <sub alias="string"></sub>
    </voice>
</speak>

 SSML 语音和声音
语音合成标记语言 (SSML) 的语音和声音 - 语音服务 - Azure AI services | Microsoft Learn

官网注册:

面向学生的 Azure - 免费帐户额度 | Microsoft Azure

官网技术文档网址:

技术文档 | Microsoft Learn

官网的TTS:

文本转语音快速入门 - 语音服务 - Azure Cognitive Services | Microsoft Learn

Azure Unity SDK  包官网:

安装语音 SDK - Azure Cognitive Services | Microsoft Learn

SDK具体链接:

https://aka.ms/csspeech/unitypackage

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

 文章来源地址https://www.toymoban.com/news/detail-652289.html

二、实现原理

1、官网申请得到语音合成对应的 SPEECH_KEY 和 SPEECH_REGION

2、然后对应设置 语言 和需要的声音 配置

3、使用 SSML 带有流式获取得到音频数据,在声源中播放或者保存即可,样例如下

public static async Task SynthesizeAudioAsync()
{
    var speechConfig = SpeechConfig.FromSubscription("YourSpeechKey", "YourSpeechRegion");
    using var speechSynthesizer = new SpeechSynthesizer(speechConfig, null);
 
    var ssml = File.ReadAllText("./ssml.xml");
    var result = await speechSynthesizer.SpeakSsmlAsync(ssml);
 
    using var stream = AudioDataStream.FromResult(result);
    await stream.SaveToWaveFileAsync("path/to/write/file.wav");
}

4、本地保存音频,以及表情嘴型 Animation 数据

    // 获取到视频的数据,保存为 .wav 
    using var stream = AudioDataStream.FromResult(speechSynthesisResult);
    await stream.SaveToWaveFileAsync($"./{fileName}.wav");



    /// <summary>
    /// 嘴型 animation 数据,本地保存为 json 数据
    /// </summary>
    /// <param name="fileName">保存文件名</param>
    /// <param name="content">保存内容</param>
    /// <returns></returns>
    static async Task CommitAsync(string fileName,string content)
    {
        var bits = Encoding.UTF8.GetBytes(content);
        using (var fs = new FileStream(
            path: @$"d:\temp\{fileName}.json",
            mode: FileMode.Create,
            access: FileAccess.Write,
            share: FileShare.None,
            bufferSize: 4096,
            useAsync: true))
        {
            await fs.WriteAsync(bits, 0, bits.Length);
        }
    }

三、注意事项

1、不是所有的 speechSynthesisVoiceName 都能生成对应的 表情嘴型 Animation 数据

四、实现步骤

这里是直接使用 .Net VS 中进行代码测试

1、在 NuGet 中安装 微软的 Speech 包

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

 2、代码编写实现 SSML 合成语音,并且本地保存对应的 音频文件和表情嘴型 Animation json 数据

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

3、运行代码,运行完后,就会本地保存对应的 音频文件和表情嘴型 Animation json 数据

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

 Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

 4、本地查看保存的数据

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理,Unity,SSML,语音合成,表情嘴型Animation数据,Microsoft,Azure Speech

 

五、关键代码

using Microsoft.CognitiveServices.Speech;
using System.Text;

class Program
{
    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    static string speechKey = "YOUR_SPEECH_KEY";
    static string speechRegion = "YOUR_SPEECH_REGION";
    static string speechSynthesisVoiceName = "zh-CN-XiaoxiaoNeural";
    static string fileName = "Test" + "Hello";
    static string InputAudioContent = "黄河之水天上来,奔流到海不复回";  // 生成的

    static int index = 0;   // 记录合成的表情口型动画的数据数组个数
    static string content="[";  // [ 是为了组成 json 数组

    async static Task Main(string[] args)
    {
        var speechConfig = SpeechConfig.FromSubscription(speechKey, speechRegion);

        // 根据需要可以使用更多 xml 配置,让合成的声音更加生动立体
        var ssml = @$"<speak version='1.0' xml:lang='zh-CN' xmlns='http://www.w3.org/2001/10/synthesis' xmlns:mstts='http://www.w3.org/2001/mstts'>
            <voice name='{speechSynthesisVoiceName}'>
                <mstts:viseme type='FacialExpression'/>
                <mstts:express-as style='friendly'>{InputAudioContent}</mstts:express-as>
            </voice>
        </speak>";

        // Required for sentence-level WordBoundary events
        speechConfig.SetProperty(PropertyId.SpeechServiceResponse_RequestSentenceBoundary, "true");

        using (var speechSynthesizer = new SpeechSynthesizer(speechConfig))
        {
            // Subscribe to events
            // 注册表情嘴型数据
            speechSynthesizer.VisemeReceived += async (s, e) =>
            {
                Console.WriteLine($"VisemeReceived event:" +
                    $"\r\n\tAudioOffset: {(e.AudioOffset + 5000) / 10000}ms" 
                   + $"\r\n\tVisemeId: {e.VisemeId}" 
                    // + $"\r\n\tAnimation: {e.Animation}"
                    );
                if (string.IsNullOrEmpty( e.Animation)==false)
                {
                    // \r\n, 是为了组合 json 格式
                    content += e.Animation + "\r\n,";
                    index++;
                }
                
            };
            
            // 注册合成完毕的事件
            speechSynthesizer.SynthesisCompleted += async (s, e) =>
            {
                Console.WriteLine($"SynthesisCompleted event:" +
                    $"\r\n\tAudioData: {e.Result.AudioData.Length} bytes" +
                    $"\r\n\tindex: {index} " +
                    $"\r\n\tAudioDuration: {e.Result.AudioDuration}");
                content = content.Substring(0, content.Length-1);
                content += "]";
                await CommitAsync(fileName, content);
            };

            // Synthesize the SSML
            Console.WriteLine($"SSML to synthesize: \r\n{ssml}");
            var speechSynthesisResult = await speechSynthesizer.SpeakSsmlAsync(ssml);

            // 获取到视频的数据,保存为 .wav 
            using var stream = AudioDataStream.FromResult(speechSynthesisResult);
            await stream.SaveToWaveFileAsync(@$"d:\temp\{fileName}.wav");

            // Output the results
            switch (speechSynthesisResult.Reason)
            {
                case ResultReason.SynthesizingAudioCompleted:
                    Console.WriteLine("SynthesizingAudioCompleted result");
                    break;
                case ResultReason.Canceled:
                    var cancellation = SpeechSynthesisCancellationDetails.FromResult(speechSynthesisResult);
                    Console.WriteLine($"CANCELED: Reason={cancellation.Reason}");

                    if (cancellation.Reason == CancellationReason.Error)
                    {
                        Console.WriteLine($"CANCELED: ErrorCode={cancellation.ErrorCode}");
                        Console.WriteLine($"CANCELED: ErrorDetails=[{cancellation.ErrorDetails}]");
                        Console.WriteLine($"CANCELED: Did you set the speech resource key and region values?");
                    }
                    break;
                default:
                    break;
            }
        }

        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }


    /// <summary>
    /// 嘴型 animation 数据,本地保存为 json 数据
    /// </summary>
    /// <param name="fileName">保存文件名</param>
    /// <param name="content">保存内容</param>
    /// <returns></returns>
    static async Task CommitAsync(string fileName,string content)
    {
        var bits = Encoding.UTF8.GetBytes(content);
        using (var fs = new FileStream(
            path: @$"d:\temp\{fileName}.json",
            mode: FileMode.Create,
            access: FileAccess.Write,
            share: FileShare.None,
            bufferSize: 4096,
            useAsync: true))
        {
            await fs.WriteAsync(bits, 0, bits.Length);
        }
    }
}

到了这里,关于Unity C# 之 Azure 微软SSML语音合成TTS流式获取音频数据以及表情嘴型 Animation 的简单整理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [chatgpt+Azure]unity AI二次元小女友之使用微软Azure服务实现RestfulApi->语音识别+语音合成

            如题所述,这个小项目是在unity引擎端,使用了chatgpt+微软azure的一个AI二次元女友对话的项目,实现原理也比较简单,即在unity端实现AI二次元女友的交互界面,接入chatgpt-3.5-turbo的api接口,借助chatgpt的自然语言生成能力,作为这个项目的聊天引擎。聊天功能也比较

    2024年02月04日
    浏览(49)
  • 微软语音合成(tts)服务申请和调用

    https://azure.microsoft.com/zh-cn/free/ 这里有个视频教程,根据此完成申请流程: https://www.bilibili.com/video/BV15a4y1W7re?vd_source=bf07f28d37849885d215dc3aea189eba 申请完成后,就可以到这里申请资源: https://portal.azure.com/#home 点击资源组,里面就有部署好的服务了 点击这里,可以获取 subscription

    2024年02月11日
    浏览(52)
  • 【语音合成】微软 edge-tts

    目录 1. edge-tts 介绍 2. 代码示例 https://github.com/rany2/edge-tts 在Python代码中使用Microsoft Edge的在线文本到语音服务

    2024年02月14日
    浏览(45)
  • MS-TTS:免费微软TTS语音合成工具(一键合成导出MP3音频)

    声明 本工具是个免费工具,遇到问题,还请自行解决,下面有文字教程,B站有视频教程(链接在文章末尾); 其次,微软接口卡顿,连接超时等问题下方有详细说明,请仔细看一下; 再次,强制升级是为了统一版本方便问题的收集与解决,如果你能理解最好,不能理解的话

    2024年02月03日
    浏览(45)
  • 微软语音合成助手 TTS-VUE 文字转语音工具

    我们在刷短视频的时候经常会听到一些AI合成声音,它们有各种音色、语调,甚至不同的情绪,听起来与人声无异 其实这些大都是利用微软Azure的文字转语音技术来实现的 虽然国内也有很多配音工具,但体验下来还是微软的效果最好,语气最为自然 不过Azure的文字转语音功能

    2024年02月02日
    浏览(44)
  • Unity调用微软SpeechLib.Dll的C#类实现语音合成功能

    using System.Collections; using System.Collections.Generic; using UnityEngine; using SpeechLib; public class Speech : MonoBehaviour { // Start is called before the first frame update void Start() { } 将Interop.SpeechLib.dll文件导入Unity,然后把上面的脚本挂载到游戏对象上就能测试语音合成的效果了。 经测试 调用v.Speak这个方

    2024年02月13日
    浏览(58)
  • 使用微软Azure的tts文本转语音服务出现java.lang.UnsatisfiedLinkError

    最近,在使用微软tts文本转语音的speech服务时,项目正常整合了微软的依赖,服务也正常启动。但是只要调用微软文本转语音服务api时,就会出现如下报错。 该方法是一个native方法,我以为是依赖中的dll文件没有加载到,结果检查不是。 最后分析:native依赖的是底层实现的

    2024年02月14日
    浏览(60)
  • Python让AI虚拟主播接入微软Azure语音合成并精准嘴型同步

    上一篇文字中讲了利用Python实现利用微软Azure无限免费将文本转mp3格式的音频文件并下载到本地。微软Azure TTS的优点不用多说,今天将讲如何利用Python将其接入到虚拟主播中来。 订阅专栏 ,我将免费向您提供具体的方案。 看过专栏其他文章的朋友,一定知道,我们使用的虚

    2024年02月15日
    浏览(67)
  • [Unity+OpenAI TTS] 集成openAI官方提供的语音合成服务,构建海王暖男数字人

            最近openAI官方发布了很多新功能,其中就包括了最新发布的TTS语音合成服务的api接口。说到这个语音合成接口,大家可能会比较陌生,但是说到chatgpt官方应用上的聊天机器人,那个台湾腔的海王暖男的声音,可能就有印象了吧。那么从官方文档中,可以发现,openA

    2024年02月04日
    浏览(45)
  • 【C#】Whisper 离线语音识别(微软晓晓语音合成的音频)(带时间戳、srt字幕)...

    语音合成语音识别 用微软语音合成功能生成xiaoxiao的语音。 用Whisper离线识别合成的语音输出srt字幕。 一、语音合成 参考这个网址:https://www.bilibili.com/read/cv19064633 合成的音频:晓晓朗读-温柔 二、Whisper 语音识别 下载模型后放入程序目录下: 请注意,主要示例目前仅使用

    2024年02月06日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包