Comment diffuser / download et lire un file audio depuis une URL?

Je dois diffuser ou download et lire un file audio provenant d'une URL dans Unity3D, fonctionnant sur iOS. L'audio provient d'un service text-audio et j'ai besoin de le jouer sur Unity:

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

J'ai été googling toute la matinée et pas trouvé une solution valide … Il y a un extrait de code dans la documentation de Unity3D ( WWW-audioClip , WWW.GetAudioClip ), mais ne fonctionne pas, j'ai débogué et l'erreur indique qu'il couldn n'ouvre pas le file.

using UnityEngine; using System.Collections; public class AudioURLScript : MonoBehaviour { public ssortingng 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(); } } 

Merci

SOLUTION

C'est ma solution de travail en ce moment.

 void Start(){ StartCoroutine(DownloadAndPlay("http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=Hola+que+tal")); } IEnumerator DownloadAndPlay(ssortingng url) { WWW www = new WWW(url); yield return www; AudioSource audio = GetComponent<AudioSource>(); audio.clip = www.GetAudioClip(false, true,AudioType.MPEG); audio.Play(); } 

Vous ne mentionnez pas la plate-forme sur laquelle vous êtes, donc je vais supposer Windows.

L'exécution de Windows Unity ne prend en charge que WAV ou OGG. Le lien vers le file de service audio que vous avez fourni est téléchargeable en tant que file audio MP2 (commun dans la diffusion). Unity ne sera pas capable de jouer ça (ou MP3).

Pour reference, les plateforms Android et iOS supportent le format MP3 (mais pas MP2).

Donc, votre premier problème est de vous assurer que votre source audio est au format compatible.

L'exemple de code est incorrect pour 3 raisons;

  1. l'URL est https: (qui indique l'unité à download à partir d'Internet) mais ensuite vous pré-joignez le file: à lui (qui dit à l'unité de charger à partir du système de files local). Donc, vous devriez choisir l'un ou l'autre.
  2. cela ne fonctionnerait pas si vous choisissiez https parce que ce lien particulier (je sais que c'est juste un exemple) mais il faut qu'un user soit connecté au service (et utilise des cookies pour le savoir), donc il ne vous envoie pas de file audio, il vous envoie une page HTML indiquant à l'user de se connecter ou de s'save.
  3. Comme dit @fafase, le WWW doit être placé dans une co-routine, de sorte qu'il peut download sur plusieurs images.

OK, voici ce que je suggère.

Si vous connaissez les files audio, téléchargez-les et convertissez-les en OGG (si windows) ou MP3 (si mobile) et téléchargez-les sur votre propre server (disons Amazon S3 ou un site web illimité à 10 $ par mois).

Ensuite, utilisez ce code pour le download et le lire:

 StartCoroutine(DownloadAndPlay("http://myserver.com/audio/test.ogg")); IEnumerator DownloadAndPlay(ssortingng url) { WWW www = new WWW(url); yield return www; AudioSource audio = GetComponent<AudioSource>(); audio.clip = www.GetAudioClip(false, false); audio.Play(); } 

Un object WWW est un wrapper pour une requête HTTP, contenant la création de la connection, le transfert des données et la fermeture de la connection (et quelques actions supplémentaires).

Cela ne se produit pas dans un cadre et nécessite une coroutine.

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