2016-07-22 3 views
1

Ich baue eine App mit einem Chatbot und SAPI für Text-to-Speech zusammen mit SALSA Asset für LypSync. Ich versuche, eine Live-Audioquelle zu erstellen, die direkt von der TTS-Audioausgabe gespeist wird. Ich habe dies erfolgreich durch Speichern in WAV-Dateien für jeden Satz und dann Laden der WAV-Dateien in Runtime zu dem GameObject, das LypSync usw. hat. Dies funktioniert, aber das kontinuierliche Laden von WAV-Dateien macht die App langsam, friert jedes Mal ein tut das und stürzt sogar ab.Speechlib von SAPI (Microsoft Text-zu-Sprache-API) als Unity AudioSource verwenden

Ich weiß, dass es möglich ist, eine AudioSource live von einem Mikrofon auf dem Computer zu machen. Also was ich machen möchte ist so etwas.

Ich versuchte, was von meiner naiven Ebene des Programmierers wäre der logische Weg. Verbinden Sie einfach aus dem TTS als AudiSource Audio-Clip, wie dies die udioOutput stream:

TTSvoice.AudioOutputStream = AudioSource.clip; 

und diese Fehlermeldung erhalten:

error CS0029: Cannot implicitly convert type UnityEngine.AudioClip' to SpeechLib.ISpeechBaseStream'`SpeechLib.ISpeechBaseStream'

ich in Python kennen, können Sie Audio-Objekte aus verschiedenen Bibliotheken durch numpy verbinden Konvertieren von Audio in Standard-RAW-Daten. Aber ich bin auch irgendwie neu in C# und Unity.

hier ist mein Code:

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

Erstens: Sie können die Update-Funktion löschen, obwohl sie leer ist. Unity ruft jedes Bild auf. Zweitens bin ich kein Experte für das Text-zu-Sprache-Feld, aber Ihr Fehler ist, dass Sie über nicht übereinstimmende Datentypen. Sie geben das Quellziel falsch aus. – Cabrra

+0

Ich weiß, wo ist mein Fehler, wie ich bereits auf meine Frage beschrieben habe. – Macumbaomuerte

Antwort

1

ich mit Unity nicht so vertraut bin, aber es sieht aus wie das, was Sie tun müssen, einen benutzerdefinierten PCMReaderCallback Delegierter den Audioclip zu liefern, die die Daten aus der Anpassung würden AudioOutputStream (insbesondere müssen die Daten von 16-Bit-Ints zu Floats normalisiert werden).

+0

danke! Das ist ein Platz zum Starten! – Macumbaomuerte

Verwandte Themen