使用SAPI的Speechlib(Microsoft文本到语音API)作为Unity音频源

本文关键字:API 作为 Unity 音频 语音 SAPI Speechlib 文本 Microsoft 使用 | 更新日期: 2023-09-27 17:58:22

我正在构建一个应用程序,它有一个聊天机器人,使用SAPI进行文本到语音转换,并为LypSync使用SALSA资产。我试图实现的是创建一个直接从TTS音频输出中馈送的实时AudioSource。我已经成功地完成了这一点,方法是为每一句话保存到wav文件中,然后在运行时将wav文件加载到具有LypSync等功能的GameObject中。这是可行的,但连续加载wav文件会使应用程序速度变慢,每次都会冻结,甚至崩溃。

我知道用电脑上的麦克风制作现场音频源是可能的。所以我想做的就是这样的事情。

我尝试了从我的程序员的天真水平将是逻辑的方式。只需将TTS的udioOutput流连接为AudiSource音频剪辑,如下所示:

TTSvoice.AudioOutputStream = AudioSource.clip;

并得到这个错误:

错误CS0029:无法将类型UnityEngine.AudioClip隐式转换为SpeechLib.ISpeechBaseStream `SpeechLib/ISpeechBaseStream'

我知道在Python中,你可以通过numpy将音频转换为标准的原始数组数据来连接来自不同库的音频对象。但我对C#和Unity也有点陌生。

这是我的代码:

using UnityEngine;
using System.Collections;
 using SpeechLib;
 using System.Xml;
 using System.IO;
 using System;
 using System.Diagnostics;
 public class controller : MonoBehaviour {

 private SpVoice voice;
 public AudioSource soundvoice;
 // Use this for initialization
 void Start () {
     voice = new SpVoice();
     GameObject character = GameObject.Find("character");
     soundvoice = character.GetComponent(typeof(AudioSource)) as AudioSource;
     voice.AudioOutputStream = soundvoice.clip;
     StartCoroutine(talksome());
 }
 // Update is called once per frame
 void Update () {

 }
 IEnumerator talksome() {
     while (true)
     {
         counter++;
         string sentence = "counting " + counter;
         voice.Speak(sentence);
         print(sentence);
         voice.WaitUntilDone(1);
         yield return new WaitForSeconds(2);
     }
 }
 }

使用SAPI的Speechlib(Microsoft文本到语音API)作为Unity音频源

我对Unity不太熟悉,但看起来你需要做的是向AudioClip提供一个自定义的PCMReaderCallback委托,该委托将调整来自AudioOutputStream的数据(特别是,它需要将数据从16位int规范化为float)。