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