【Unity】 HTFramework框架(二十八)Speech语音合成、语音识别

更新日期:2019年12月30日。
Github源码:[点我获取源码]

Speech语音合成、语音识别简介

对接百度AI开放平台,封装的语音技术接口。

使用Speech

语音合成

设置TOKEN

语音合成需要鉴权认证的通行令牌TOKEN,登录百度AI开放平台控制台,通过新建应用获取应用的APIKEYSECRETKEY,在任意初始化位置设置这两个key:

        Speecher.SetAPIKEY("你的应用APIKEY");
        Speecher.SetSECRETKEY("你的应用SECRETKEY");

然后在调用语音合成接口前,必须先生成TOKEN(一个TOKEN的有效期是30天,失效后必须重新生成):

		Speecher.GenerateTOKEN();

由于上文的生成TOKEN的接口无法跨域,所以在WebGL平台无效,所以我们只能在外部生成TOKEN再赋值给Speecher:

        Speecher.SetTOKEN("外部生成的TOKEN");

自定义合成规则

语音合成可以自定义合成规则,在合成规则内,你可以强制定义任何字的发音,或是让多音字在不同的词语组合内有不同的发音,比如如下定义一个合成规则:

        //自定义合成规则
        SynthesisRule rule = new SynthesisRule();
        //定义 大 字的发音为 xiao ,2 声
        rule.AddCustomTone("大", "xiao", 2);
        //定义 小 字的发音为 da ,4 声
        rule.AddCustomTone("小", "da", 4);
        //定义 的 字的发音为 di ,4 声(仅在词组为【目的地】时)
        rule.AddCustomTone("目的地", "di", 4, 1);
        //定义 单 字的发音为 shan ,4 声(仅在词组为【单春秋】时)
        rule.AddCustomTone("单春秋", "shan", 4, 0);

开始合成

设置了TOKEN之后便可以直接合成语音了,调用如下接口:

	private IEnumerator Start()
	{
        Speecher.SetAPIKEY("你的应用APIKEY");
        Speecher.SetSECRETKEY("你的应用SECRETKEY");

		//等待生成TOKEN完成
        yield return Speecher.GenerateTOKEN();

        //合成语音,如有自定义合成规则,可以传入合成规则
        Speecher.Synthesis("您好,百度!", SynthesisSucceed, SynthesisFailed);
    }
	
	private void SynthesisSucceed(AudioClip clip)
	{
        //语音合成成功,播放合成结果
        Main.m_Audio.PlayMultipleSound(clip);
	}

    private void SynthesisFailed()
    {
        GlobalTools.LogWarning("语音合成失败,请查看控制台日志!");
    }

语音合成为异步操作,可以通过yield return语句等待合成完成,以达到同步效果,但必须在协程方法体内:

    private IEnumerator Synthesis()
    {
        //合成语音
        yield return Speecher.Synthesis("您好,百度!", SynthesisSucceed, SynthesisFailed);

        GlobalTools.LogInfo("语音合成完毕!");
    }

编辑器内语音合成

通过如下菜单打开编辑器语音合成测试面板:
在这里插入图片描述
在这里插入图片描述
在面板输入你的APIKEY和SECRETKEY,点击Generate按钮生成TOKEN,然后输入待合成的文本,以及选择一些合成参数,点击下方的Synthesis按钮便可以将文本合成为语音文件。

目前已支持官方更新的所有精品发音人:
在这里插入图片描述

语音识别

设置TOKEN

语音识别需要鉴权认证的通行令牌TOKEN,与语音合成共用一个TOKEN。

开始识别

设置了TOKEN之后便可以直接识别语音了,调用如下接口:

    IEnumerator RecognitionTest()
    {
        AudioClip clip = null;

        //加载音频文件
        yield return Main.m_Resource.LoadAsset<AudioClip>(new AssetInfo("audio", "Assets/Audio/Test.wav", ""), null, (c) => { clip = c; });

        //语音识别
        yield return Speecher.Recognition(clip, RecognitionSucceed, RecognitionFailed);
    }

    private void RecognitionSucceed(string text)
    {
        //语音识别成功
        GlobalTools.LogInfo("语音识别成功:" + text);
    }

    private void RecognitionFailed()
    {
        GlobalTools.LogWarning("语音识别失败,请查看控制台日志!");
    }

猜你喜欢

转载自blog.csdn.net/qq992817263/article/details/103764141