Я хочу записать звук с телефона, а затем отправить его в непотоковый API речи Google. Я могу записывать с помощью Capture.captureAudio(), но тогда я не знаю, что такое кодировка звука и частота дискретизации, так как они нужны для запроса API. Как я могу получить кодировку звука и частоту дискретизации, чтобы я мог отправить их с моим запросом API?
Как использовать Google Speech API от Codename One?
Ответы (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
А как насчет платформ, отличных от Android? Должен ли я использовать собственные интерфейсы для каждой платформы?
- person Hristo Vrigazov; 11.09.2016
iOS и BlackBerry также записывают amr. Я не уверен, какие другие платформы вас интересуют
- person Nikolay Shmyrev; 11.09.2016
Вы можете записывать 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
Шай, не могли бы вы написать простой пример вызова API без жесткого кодирования AMR? Я не могу открыть входной поток после MediaManager.createMediaRecorder(filename, audio/amr); Я пытаюсь: Storage.getInstance().createInputStream(имя файла);
- person Hristo Vrigazov; 12.09.2016
См. это: github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/
- person Shai Almog; 15.09.2016