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

时间:2016-07-22 09:51:47

标签: c# audio unity3d sapi

我正在构建一个具有聊天机器人的应用程序,并使用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);
     }
 }
 }

1 个答案:

答案 0 :(得分:1)

我对Unity并不熟悉,但看起来你需要做的就是为AudioClip提供一个自定义的PCMReaderCallback委托来调整来自AudioOutputStream的数据(特别是,它需要将数据从16位整数归一化为浮点数。