2016-07-22 161 views
1

我正在構建一個應用程序,該應用程序具有chatbot,並使用SAPI將文本轉換爲用於LypSync的SALSA資源的語音。我試圖完成的是創建一個直接從TTS音頻輸出提供的實時AudioSource。我已經成功地將這個通過保存到每個句子的wav文件中,然後在運行時將wav文件加載到具有LypSync的遊戲對象等。這可以工作,但持續加載wav文件會使應用程序變慢,每次凍結這樣做甚至崩潰。從SAPI(Microsoft文本到語音API)使用Speechlib作爲Unity AudioSource

我知道可以從計算機上的麥克風製作一個現場音頻源。所以我想要做的就是這樣的事情。

我試過從我的天真級程序員那裏得到的邏輯方式。只需將udioOutput流從TTS作爲AudiSource音頻片段連接起來,就像這樣:

TTSvoice.AudioOutputStream = AudioSource.clip; 

,並得到這個錯誤:

error CS0029: Cannot implicitly convert type UnityEngine.AudioClip' to 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

第一:您可以刪除更新功能 - >即使是空Unity會每幀調用它。其次,我不是文本到語音領域的專家,但是你的錯誤是你關於不匹配的數據類型。您正在錯誤地投射源目標。 – Cabrra

+0

我知道我的錯誤在哪裏,正如我在我的問題中所描述的那樣。 – Macumbaomuerte

回答

1

我不是那熟悉的團結,但它看起來像你需要做的是提供一個自定義PCMReaderCallback代表到會適應從數據的音頻剪輯AudioOutputStream(特別是,它需要將數據從16位整數歸一化爲浮點數)。

+0

謝謝!這是一個開始的地方! – Macumbaomuerte

相關問題