我正在构建一个具有聊天机器人的应用程序,并使用SAPI进行文本到语音以及LLSSync的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);
}
}
}
答案 0 :(得分:1)
我对Unity并不熟悉,但看起来你需要做的就是为AudioClip提供一个自定义的PCMReaderCallback
委托来调整来自AudioOutputStream
的数据(特别是,它需要将数据从16位整数归一化为浮点数。