Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SAPI(Microsoft文本到语音API)中的Speechlib作为统一音频源_C#_Audio_Unity3d_Sapi - Fatal编程技术网

C# 使用SAPI(Microsoft文本到语音API)中的Speechlib作为统一音频源

C# 使用SAPI(Microsoft文本到语音API)中的Speechlib作为统一音频源,c#,audio,unity3d,sapi,C#,Audio,Unity3d,Sapi,我正在构建一个应用程序,它有一个聊天机器人,使用SAPI进行文本到语音转换,同时使用SALSA asset进行LypSync。我试图实现的是创建一个直接从TTS音频输出馈送的实时音频源。我已经成功地完成了这项工作,通过将每个句子保存到wav文件中,然后在运行时将wav文件加载到具有LypSync等功能的游戏对象中。这项工作是可行的,但持续加载wav文件会使应用程序变慢,每次都会冻结,甚至崩溃 我知道可以通过电脑上的麦克风制作现场音频源。所以我想做的就是这样 我尝试了从我天真的程序员水平来看的逻辑

我正在构建一个应用程序,它有一个聊天机器人,使用SAPI进行文本到语音转换,同时使用SALSA asset进行LypSync。我试图实现的是创建一个直接从TTS音频输出馈送的实时音频源。我已经成功地完成了这项工作,通过将每个句子保存到wav文件中,然后在运行时将wav文件加载到具有LypSync等功能的游戏对象中。这项工作是可行的,但持续加载wav文件会使应用程序变慢,每次都会冻结,甚至崩溃

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

我尝试了从我天真的程序员水平来看的逻辑方法。只需将来自TTS的AudioOutput流连接为AudioSource音频片段,如下所示:

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也会在每一帧调用它。第二,我不是文本到语音领域的专家,但是您的错误是,您担心数据类型不匹配。您正在错误地转换源目标。正如我在问题中所描述的,我知道我的错误在哪里。