2015-12-02 171 views
2

我需要流式處理或下載並播放iOS中運行的Unity3D中的URL。 音頻來自一個文本到音頻業務,我需要發揮它統一:如何從URL流式傳輸/下載和播放音頻?

http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=hola+que+tal

我一直在谷歌上搜索所有的早上沒有找到有效的解決辦法... 有Unity3D文檔中的代碼片段(WWW-audioClip,WWW.GetAudioClip),但不起作用,我已調試過,錯誤表示無法打開文件。

using UnityEngine; 
using System.Collections; 

public class AudioURLScript : MonoBehaviour { 
    public string url = "http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=hola+que+tal"; 
    public AudioSource source; 
    void Start() { 
     WWW www = new WWW("file://"+url); 
     source = GetComponent<AudioSource>(); 
     source.clip = www.GetAudioClip(false,true); 
    } 
    void Update() { 
     if (!source.isPlaying && source.clip.isReadyToPlay) 
      source.Play(); 

    } 
} 

感謝

SOLUTION

這是我工作的解決方案現在。

void Start(){ 
    StartCoroutine(DownloadAndPlay("http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=Hola+que+tal")); 
} 

IEnumerator DownloadAndPlay(string url) 
{ 
    WWW www = new WWW(url); 
    yield return www; 
    AudioSource audio = GetComponent<AudioSource>(); 
    audio.clip = www.GetAudioClip(false, true,AudioType.MPEG); 
    audio.Play(); 
} 

回答

2

你沒有提到你所在的平臺,所以我將假定Windows。

Unity Windows運行時只支持WAV或OGG。您提供的音頻服務文件的鏈接是作爲MP2音頻文件下載(在廣播中常見)。 Unity將無法播放該(或MP3)。

作爲參考,Android和iOS平臺確實支持MP3(但不支持MP2)。

所以,你的第一個問題是確保你的音頻源是兼容的格式。

代碼示例不正確,原因有三:

  1. URL是https:(它告訴統一從網上下載),但是然後你預先掛接file:它(它告訴統一從本地文件系統加載)。所以你應該選擇一個或另一個。
  2. 如果你選擇https是因爲這個特定的鏈接(我知道這只是一個例子),但它需要用戶登錄到服務(並使用cookie來知道),所以它不會工作,所以它不會向你發送一個音頻文件,它會向你發送一個告訴用戶登錄或註冊的HTML頁面。
  3. 正如@fafase所說,WWW必須放在一個協同例程中,以便它可以在多個幀下載。

好的,這是我的建議。

如果你可以知道音頻文件的時間頭,下載它們並轉碼到OGG(如果是Windows)或MP3(如果是移動的)並上傳到你自己的服務器(比如Amazon S3,或者每月10美元網站)。

然後,使用此代碼下載和播放:

StartCoroutine(DownloadAndPlay("http://myserver.com/audio/test.ogg")); 

IEnumerator DownloadAndPlay(string url) 
{ 
    WWW www = new WWW(url); 
    yield return www; 

    AudioSource audio = GetComponent<AudioSource>(); 
    audio.clip = www.GetAudioClip(false, false); 
    audio.Play(); 
} 
+0

對不起,這將iOS上運行的,是的,我對代碼的網址是不是最好的例子。我真正需要的是播放來自文本到音頻服務的聲音,因爲它會由AI產生(讀取來自Feed等新聞的消息) – MaDowen

+0

通常這樣的服務可以讓您創建一個帳戶,然後爲您提供一個令牌和/或密鑰。然後,您將通過REST API與JSON進行通信。該API可讓您請求翻譯並提供一種機制,通過直接鏈接下載所需的音頻文件 - 這就是您在答案中提供給WWW電話的鏈接。 – peterept

2

甲WWW對象爲HTTP請求的包裝器,包含在創建連接時,數據的傳送和連接(和一些額外的動作)的關閉。

這不會發生在一幀中,並需要一個協程。

void Start() { 
     StartCoroutine(GetAudio(url)); 
    } 
private IEnumerator GetAudio(string url) 
{ 
    WWW www = new WWW("file://"+url); 
    yield return www; 
    if(string.IsNullOrEmpty(www.error) == false) 
    { 
     Debug.Log("Did not work"); 
     yield break; 
    } 
    source = GetComponent<AudioSource>(); 
    source.clip = www.GetAudioClip(false,true); 
} 
相關問題