Как использовать Google Speech API от Codename One?

Я хочу записать звук с телефона, а затем отправить его в непотоковый API речи Google. Я могу записывать с помощью Capture.captureAudio(), но тогда я не знаю, что такое кодировка звука и частота дискретизации, так как они нужны для запроса API. Как я могу получить кодировку звука и частоту дискретизации, чтобы я мог отправить их с моим запросом API?


person Hristo Vrigazov    schedule 11.09.2016    source источник


Ответы (1)


Если вы проверите источники на Android записываются в AMR-WB

        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
        recorder.setOutputFile(temp.getAbsolutePath());

API речи Google принимает AMR-WB, если вы правильно настроили аудиоформат .

Другая проблема заключается в том, что файл записан как AMR-WB в контейнере 3GPP, поэтому вам нужен собственный код для извлечения аудиоданных из 3GPP, вы можете найти его здесь:

// #!AMR\n
private static byte[] AMR_MAGIC_HEADER = {0x23, 0x21, 0x41, 0x4d, 0x52, 0x0a};


public byte[] convert3gpDataToAmr(byte[] data) {
    if (data == null) {
        return null;
    }

    ByteArrayInputStream bis = new ByteArrayInputStream(data);
    // read FileTypeHeader
    FileTypeBox ftypHeader = new FileTypeBox(bis);
    // You can check if it is correct here
    // read MediaDataHeader
    MediaDataBox mdatHeader = new MediaDataBox(bis);
    // You can check if it is correct here
    int rawAmrDataLength = mdatHeader.getDataLength();
    int fullAmrDataLength = AMR_MAGIC_HEADER.length + rawAmrDataLength;
    byte[] amrData = new byte[fullAmrDataLength];
    System.arraycopy(AMR_MAGIC_HEADER, 0, amrData, 0, AMR_MAGIC_HEADER.length);
    bis.read(amrData, AMR_MAGIC_HEADER.length, rawAmrDataLength);
    return amrData;
}

Также обратите внимание, что AMR-WB дает вам немного более низкую точность, поэтому вы можете рассмотреть возможность захвата необработанного звука с более подробным API, а не с кодовым именем.

person Nikolay Shmyrev    schedule 11.09.2016
comment
А как насчет платформ, отличных от Android? Должен ли я использовать собственные интерфейсы для каждой платформы? - person Hristo Vrigazov; 11.09.2016
comment
iOS и BlackBerry также записывают amr. Я не уверен, какие другие платформы вас интересуют - person Nikolay Shmyrev; 11.09.2016
comment
Вы можете записывать AMR, который будет работать на iOS, Android и, возможно, других ОС, используя Codename One API: codenameone.com/javadoc/com/codename1/media/ Вы можете получить MIME-типы, поддерживаемые ОС, через codenameone.com/javadoc/com/codename1/media/ - person Shai Almog; 12.09.2016
comment
Шай, не могли бы вы написать простой пример вызова API без жесткого кодирования AMR? Я не могу открыть входной поток после MediaManager.createMediaRecorder(filename, audio/amr); Я пытаюсь: Storage.getInstance().createInputStream(имя файла); - person Hristo Vrigazov; 12.09.2016
comment
См. это: github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/ - person Shai Almog; 15.09.2016