Как я могу передавать аудио непосредственно из ответа на запрос API?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу передавать аудио непосредственно из ответа на запрос API?

Сообщение Anonymous »

Я использую API, который, когда я делаю запрос POST и отправляю аудиофайл через данные формы, возвращает потоковый звук. Я не знаю способа немедленного воспроизведения аудио без необходимости ждать полной загрузки всего аудиофайла.
  • API возвращает аудиопоток MP3. . Я могу воспроизвести аудио после его полной загрузки, используя BestHTTP для вызова следующим образом (в OnRequestFinished):
private IEnumerator WaitAndSendRequest(byte[] audioData, string conversationId)
{
request = new HTTPRequest(new Uri(serverUrl), HTTPMethods.Post, OnRequestFinished);
request.SetHeader("Content-Type", "multipart/form-data");
request.AddField("conversation_id", conversationId);
request.AddBinaryData("audio_file", audioData, "audio_sample.mp3", "audio/mpeg");
request.StreamChunksImmediately = true;
request.StreamFragmentSize = 1024;
request.OnDownloadProgress = OnDownloadProgress;
request.OnUploadProgress = OnUploadProgressDelegate;
request.OnStreamingData = OnStreamingDataReceived;
Debug.Log("Uploading audio...");
request.Send();
yield return new WaitUntil(() => !isRequestInProgress);
}
private void OnDownloadProgress(HTTPRequest request, long downloaded, long downloadLength)
{
float progress = (float)downloaded / downloadLength * 100f;
//Debug.Log($"Download progress: {progress:F2}% ({downloaded} / {downloadLength} bytes)");

}
private void OnUploadProgressDelegate(HTTPRequest request, long downloaded, long downloadLength)
{
float progress = (float)downloaded / downloadLength * 100f;
// Debug.Log($"Upload progress: {progress:F2}% ({downloaded} / {downloadLength} bytes)");

}
private bool OnStreamingDataReceived(HTTPRequest request, HTTPResponse response, byte[] dataFragment, int dataFragmentLength)
{
Debug.Log("dataFragmentLength: " + dataFragmentLength);

StartCoroutine(PlayReceivedAudioChunk(dataFragment));
return true;
}

private IEnumerator PlayReceivedAudioChunk(byte[] audioData)
{
AudioClip audioClip = WavUtility.ToAudioClip(audioData, "AudioStream");

if (audioClip != null)
{
audioSource.clip = audioClip;
audioSource.Play();
Debug.Log("Playing audio chunk." + audioData);
yield return new WaitUntil(() => !audioSource.isPlaying);
}
else
{
Debug.LogError("Failed to create audio clip from chunk.");
}
}

private void OnRequestFinished(HTTPRequest req, HTTPResponse resp)
{
try
{
if (resp == null || !resp.IsSuccess)
{
Debug.LogError("Error uploading audio: " + (resp != null ? resp.Message : "Unknown error"));

UIManager.Instance.connectionTxt.text = "An error occurred, please help me check the network connection!.";

return;
}

Debug.Log("Audio uploaded successfully. Processing response...");
byte[] responseAudioData = resp.Data;

StartCoroutine(PlayReceivedAudio(responseAudioData));
}
finally
{
isRequestInProgress = false;
}
}

private IEnumerator PlayReceivedAudio(byte[] audioData)
{
string tempFilePath = Path.Combine(Application.temporaryCachePath, "processed_audio.mp3");
File.WriteAllBytes(tempFilePath, audioData);

using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip("file://" + tempFilePath, AudioType.MPEG))
{
yield return www.SendWebRequest();

if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error loading audio: " + www.error);
yield break;
}

AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www);

audioSource.clip = audioClip;
audioSource.Play();
Debug.Log("Playing received audio.");
StartCoroutine(CheckAudioFinished());
}
}
  • Однако при вызове PlayReceivedAudioChunk звук не слышен. это функция ToAudioClip:
public static AudioClip ToAudioClip(byte[] data, string name)
{
int sampleCount = data.Length / 2;
float[] samples = new float[sampleCount];

for (int i = 0; i < sampleCount; i++)
{
samples = (short)(data[i * 2] | (data[i * 2 + 1]

Подробнее здесь: https://stackoverflow.com/questions/792 ... pi-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»