C# 使用SAPI(Microsoft文本到语音API)中的Speechlib作为统一音频源
我正在构建一个应用程序,它有一个聊天机器人,使用SAPI进行文本到语音转换,同时使用SALSA asset进行LypSync。我试图实现的是创建一个直接从TTS音频输出馈送的实时音频源。我已经成功地完成了这项工作,通过将每个句子保存到wav文件中,然后在运行时将wav文件加载到具有LypSync等功能的游戏对象中。这项工作是可行的,但持续加载wav文件会使应用程序变慢,每次都会冻结,甚至崩溃 我知道可以通过电脑上的麦克风制作现场音频源。所以我想做的就是这样 我尝试了从我天真的程序员水平来看的逻辑方法。只需将来自TTS的AudioOutput流连接为AudioSource音频片段,如下所示:C# 使用SAPI(Microsoft文本到语音API)中的Speechlib作为统一音频源,c#,audio,unity3d,sapi,C#,Audio,Unity3d,Sapi,我正在构建一个应用程序,它有一个聊天机器人,使用SAPI进行文本到语音转换,同时使用SALSA asset进行LypSync。我试图实现的是创建一个直接从TTS音频输出馈送的实时音频源。我已经成功地完成了这项工作,通过将每个句子保存到wav文件中,然后在运行时将wav文件加载到具有LypSync等功能的游戏对象中。这项工作是可行的,但持续加载wav文件会使应用程序变慢,每次都会冻结,甚至崩溃 我知道可以通过电脑上的麦克风制作现场音频源。所以我想做的就是这样 我尝试了从我天真的程序员水平来看的逻辑
TTSvoice.AudioOutputStream = AudioSource.clip;
并获取以下错误:
错误CS0029:无法将类型UnityEngine.AudioClip“”隐式转换为SpeechLib.ISpeechBaseStream'`SpeechLib.ISpeechBaseStream'
我知道在Python中,通过将音频转换为标准原始数组数据,可以连接来自不同库的音频对象。但我对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);
}
}
}
我对Unity不太熟悉,但看起来您需要做的是为音频剪辑提供一个定制的
PCMReaderCallback
委托,该委托将调整AudioOutputStream
中的数据(特别是,它需要将数据从16位整数规范化为浮点).首先:您可以删除更新函数->即使是空的Unity也会在每一帧调用它。第二,我不是文本到语音领域的专家,但是您的错误是,您担心数据类型不匹配。您正在错误地转换源目标。正如我在问题中所描述的,我知道我的错误在哪里。