Android: Записать аудио для последующей фоновой трансляции в речь? - PullRequest
1 голос
/ 03 февраля 2020

В моем приложении Android я хочу иметь возможность записывать устное аудио, онлайн или офлайн, а затем, при желании, передавать потоковые фрагменты записанного аудио в Google для преобразования речи в текст, транскрибируя все в фоновом режиме, чтобы не влияет на текущую активность. Новая запись голоса и потоковая / транскрипция могут происходить в одно и то же время.

Какие классы я должен изучить, чтобы выполнить sh выше?

Спасибо

1 Ответ

0 голосов
/ 03 февраля 2020

Простой AudioRecord API выполнит:

    recorder = new AudioRecord(
            AudioSource.VOICE_RECOGNITION, sampleRate,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT, bufferSize * 2);

Затем внутри потока

private final class RecognizerThread extends Thread {

    private int remainingSamples;
    private int timeoutSamples;
    private final static int NO_TIMEOUT = -1;

    public RecognizerThread(int timeout) {
        if (timeout != NO_TIMEOUT)
            this.timeoutSamples = timeout * sampleRate / 1000;
        else
            this.timeoutSamples = NO_TIMEOUT;
        this.remainingSamples = this.timeoutSamples;
    }

    public RecognizerThread() {
        this(NO_TIMEOUT);
    }

    @Override
    public void run() {

        recorder.startRecording();
        if (recorder.getRecordingState() == AudioRecord.RECORDSTATE_STOPPED) {
            recorder.stop();
            IOException ioe = new IOException(
                    "Failed to start recording. Microphone might be already in use.");
            mainHandler.post(new OnErrorEvent(ioe));
            return;
        }

        Log.d(TAG, "Starting decoding");

        short[] buffer = new short[bufferSize];

        while (!interrupted()
                && ((timeoutSamples == NO_TIMEOUT) || (remainingSamples > 0))) {
            int nread = recorder.read(buffer, 0, buffer.length);

            if (nread < 0) {
                throw new RuntimeException("error reading audio buffer");
            } else {
                boolean isFinal = recognizer.AcceptWaveform(buffer, nread);
                if (isFinal) {
                    mainHandler.post(new ResultEvent(recognizer.Result(), true));
                } else {
                    mainHandler.post(new ResultEvent(recognizer.PartialResult(), false));
                }
            }

            if (timeoutSamples != NO_TIMEOUT) {
                remainingSamples = remainingSamples - nread;
            }
        }

        recorder.stop();

        // Remove all pending notifications.
        mainHandler.removeCallbacksAndMessages(null);

        // If we met timeout signal that speech ended
        if (timeoutSamples != NO_TIMEOUT && remainingSamples <= 0) {
            mainHandler.post(new TimeoutEvent());
        }
    }

Полный пример здесь .

...