Воспроизвести аудиофайл из запроса API

Я использую ElevenLabs Api для преобразования текста в речь, этот API в основном возвращает byte[] как аудио, я пытался воспроизвести его с помощью MediaPlayer и AudioTrack, но не смог этого сделать, кто-нибудь знает, как это сделать, заранее спасибо

  • Печатные байты[]
 [-61, -65, -61, -69, 80, -61, -124, 0, 0, 7, 40, 1, 103, -62, -76, 17, -62, -128, 1, -61, -113, -62, -99, -61, -83, 115, 24, -62, -80, 0, 0, 57, 38, 104, 0, -61, -108, 47, -61,
  • Это мой запрос API
  private  void elevenLab() throws JSONException {

        // Request a string response from the provided URL.
        StringRequest stringRequest = new StringRequest(Request.Method.POST, LAB_URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            // getting response as byte
                            playFile(response.getBytes());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        Log.d("VALUE","Response " + Arrays.toString(response.getBytes()));
                    }
                     }, new Response.ErrorListener() {
                   @Override
                  public void onErrorResponse(VolleyError error) {
                       Log.d("TAG","Error is " + error.getMessage());
                  }
             }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<String, String>();
                headers.put("accept", "audio/mpeg");
                headers.put("xi-api-key", LAB_KEY);
                headers.put("Content-Type", "application/json");
                return headers;
            }

            @Override
            public byte[] getBody() {
                JSONObject jsonBody = new JSONObject();
                try {
                    jsonBody.put("text", "Hello How are you man?");
                    JSONObject voiceSettings = new JSONObject();
                    voiceSettings.put("stability", 0);
                    voiceSettings.put("similarity_boost", 0);
                    jsonBody.put("voice_settings", voiceSettings);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return jsonBody.toString().getBytes();
            }
        };

        requestQueue.add(stringRequest);
    }
  • Воспроизведение файла с помощью AudioTrack

 private void playFile(byte[] response) throws IOException {
        int sampleRate = 44100;
        int channelConfig = AudioFormat.CHANNEL_OUT_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        int bufferSize = AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat);
        AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate, channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM);
        audioTrack.play();
        audioTrack.write(response, 0, response.length);
    }
  • Изображение ответа от почтальона

1
0
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основная проблема с этим кодом заключается в том, что вы запрашиваете строки и работаете со строками, а возвращаемый объект — это byte[].

Вот предлагаемое изменение в вашем коде:

 Request<byte[]> request = new Request<byte[]>(Request.Method.POST, LAB_URL, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // Handle error
                }})
       {
        @Override
        public byte[] getBody() throws AuthFailureError {
            JSONObject jsonBody = new JSONObject();
            try {
                jsonBody.put("text", responseMsg);
                JSONObject voiceSettings = new JSONObject();
                voiceSettings.put("stability", 0);
                voiceSettings.put("similarity_boost", 0);
                jsonBody.put("voice_settings", voiceSettings);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return jsonBody.toString().getBytes();
        }

        @Override
        public String getBodyContentType() {
            return "application/json";
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = new HashMap<>();
            headers.put("accept", "audio/mpeg");
            headers.put("xi-api-key", "apikey");
            return headers;
        }

        @Override
        protected Response<byte[]> parseNetworkResponse(NetworkResponse response) {
            return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response));
        }

        @Override
        protected void deliverResponse(byte[] response) {
            try {
                playFile(response);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    };

    requestQueue.add(request);

Обратите внимание, что это не проверяет, равен ли ответ 200. Согласно их спецификациям, он вернет содержимое приложения/json, если что-то не так с запросом.

проблема в том что нет такого класса под названием ByteArrayRequest в залпе

Taki 17.04.2023 03:08

Другие вопросы по теме