Anonymous
Почему я не получаю результаты транскрипции из Google Speech API в своем приложении React Native?
Сообщение
Anonymous » 08 дек 2024, 14:43
Я создаю приложение React Native, которое записывает звук на устройстве Android, передает его в мой собственный модуль, а затем отправляет записанный звук в Google Speech API для транскрипции. Однако, несмотря на получение ответа от Google Speech API, я не могу получить текст транскрипции. Ответ API включает статус: 429, но данные транскрипции не возвращаются.
Вот код, который я использую в своем приложении React Native:
React Native Component (SpeechMode. js):
Код: Выделить всё
import React, { useEffect, useState } from 'react';
import { NativeEventEmitter, NativeModules, View, Text, StyleSheet, Button } from 'react-native';
import axios from 'axios';
const { AudioInputModule } = NativeModules;
const audioEventEmitter = new NativeEventEmitter(AudioInputModule);
const SpeechMode = () => {
const [isRecording, setIsRecording] = useState(false);
const [transcription, setTranscription] = useState('');
useEffect(() => {
const subscription = audioEventEmitter.addListener('AudioData', (data) => {
processAudioChunk(data);
});
return () => {
AudioInputModule.stopAudioStream();
subscription.remove();
};
}, []);
const startRecording = () => {
setIsRecording(true);
setTranscription(''); // Clear previous transcription
AudioInputModule.startAudioStream();
};
const stopRecording = () => {
setIsRecording(false);
AudioInputModule.stopAudioStream();
};
const processAudioChunk = async (base64Data) => {
try {
const transcriptionResult = await transcribeAudio(base64Data);
if (transcriptionResult) {
setTranscription((prev) => prev + ' ' + transcriptionResult);
}
} catch (error) {
console.error('Error in transcription:', error);
}
};
const transcribeAudio = async (base64Data) => {
const GOOGLE_API_KEY = 'api key';
const url = `https://speech.googleapis.com/v1/speech:recognize?key=${GOOGLE_API_KEY}`;
const requestBody = {
config: {
encoding: 'LINEAR16',
sampleRateHertz: 16000,
languageCode: 'en-US',
},
audio: {
content: base64Data,
},
};
try {
const response = await axios.post(url, requestBody);
if (response.data && response.data.results) {
return response.data.results
.map((result) => result.alternatives[0].transcript)
.join(' ');
}
} catch (error) {
console.error('Google API Error:', error.response || error.message);
}
return '';
};
return (
Real-Time Speech-to-Text
{isRecording ? 'Listening...' : 'Ready to Record'}
Transcription:
{transcription}
);
};
export default SpeechMode;
Код собственного модуля:
AudioInputModule.java (код Java):
Код: Выделить всё
package com.webrtcexample;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Base64;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.modules.core.DeviceEventManagerModule;
public class AudioInputModule extends ReactContextBaseJavaModule {
private static final int SAMPLE_RATE = 16000;
private boolean isRecording = false;
private Thread recordingThread;
public AudioInputModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "AudioInputModule";
}
@ReactMethod
public void startAudioStream() {
if (isRecording) return;
isRecording = true;
recordingThread = new Thread(() -> {
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
AudioRecord.getMinBufferSize(
SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT
)
);
if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
sendEvent("onError", "AudioRecord initialization failed");
return;
}
audioRecord.startRecording();
byte[] buffer = new byte[2048];
while (isRecording) {
int read = audioRecord.read(buffer, 0, buffer.length);
if (read > 0) {
// Convert PCM data to Base64 and send to React Native
String base64Audio = Base64.encodeToString(buffer, 0, read, Base64.NO_WRAP);
sendEvent("AudioData", base64Audio);
}
}
audioRecord.stop();
audioRecord.release();
});
recordingThread.start();
}
@ReactMethod
public void stopAudioStream() {
isRecording = false;
if (recordingThread != null) {
try {
recordingThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
recordingThread = null;
}
}
private void sendEvent(String eventName, Object data) {
getReactApplicationContext()
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, data);
}
}
Я думаю, проблема в аудиовходе. Я беру то, что должен, и знаю об пределе, но до достижения предела он не выдавал текст
Подробнее здесь:
https://stackoverflow.com/questions/792 ... n-my-react
1733658191
Anonymous
Я создаю приложение React Native, которое записывает звук на устройстве Android, передает его в мой собственный модуль, а затем отправляет записанный звук в Google Speech API для транскрипции. Однако, несмотря на получение ответа от Google Speech API, я не могу получить текст транскрипции. Ответ API включает статус: 429, но данные транскрипции не возвращаются. Вот код, который я использую в своем приложении React Native: React Native Component (SpeechMode. js): [code]import React, { useEffect, useState } from 'react'; import { NativeEventEmitter, NativeModules, View, Text, StyleSheet, Button } from 'react-native'; import axios from 'axios'; const { AudioInputModule } = NativeModules; const audioEventEmitter = new NativeEventEmitter(AudioInputModule); const SpeechMode = () => { const [isRecording, setIsRecording] = useState(false); const [transcription, setTranscription] = useState(''); useEffect(() => { const subscription = audioEventEmitter.addListener('AudioData', (data) => { processAudioChunk(data); }); return () => { AudioInputModule.stopAudioStream(); subscription.remove(); }; }, []); const startRecording = () => { setIsRecording(true); setTranscription(''); // Clear previous transcription AudioInputModule.startAudioStream(); }; const stopRecording = () => { setIsRecording(false); AudioInputModule.stopAudioStream(); }; const processAudioChunk = async (base64Data) => { try { const transcriptionResult = await transcribeAudio(base64Data); if (transcriptionResult) { setTranscription((prev) => prev + ' ' + transcriptionResult); } } catch (error) { console.error('Error in transcription:', error); } }; const transcribeAudio = async (base64Data) => { const GOOGLE_API_KEY = 'api key'; const url = `https://speech.googleapis.com/v1/speech:recognize?key=${GOOGLE_API_KEY}`; const requestBody = { config: { encoding: 'LINEAR16', sampleRateHertz: 16000, languageCode: 'en-US', }, audio: { content: base64Data, }, }; try { const response = await axios.post(url, requestBody); if (response.data && response.data.results) { return response.data.results .map((result) => result.alternatives[0].transcript) .join(' '); } } catch (error) { console.error('Google API Error:', error.response || error.message); } return ''; }; return ( Real-Time Speech-to-Text {isRecording ? 'Listening...' : 'Ready to Record'} Transcription: {transcription} ); }; export default SpeechMode; [/code] Код собственного модуля: AudioInputModule.java (код Java): [code]package com.webrtcexample; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; import android.util.Base64; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.modules.core.DeviceEventManagerModule; public class AudioInputModule extends ReactContextBaseJavaModule { private static final int SAMPLE_RATE = 16000; private boolean isRecording = false; private Thread recordingThread; public AudioInputModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "AudioInputModule"; } @ReactMethod public void startAudioStream() { if (isRecording) return; isRecording = true; recordingThread = new Thread(() -> { AudioRecord audioRecord = new AudioRecord( MediaRecorder.AudioSource.MIC, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, AudioRecord.getMinBufferSize( SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT ) ); if (audioRecord.getState() != AudioRecord.STATE_INITIALIZED) { sendEvent("onError", "AudioRecord initialization failed"); return; } audioRecord.startRecording(); byte[] buffer = new byte[2048]; while (isRecording) { int read = audioRecord.read(buffer, 0, buffer.length); if (read > 0) { // Convert PCM data to Base64 and send to React Native String base64Audio = Base64.encodeToString(buffer, 0, read, Base64.NO_WRAP); sendEvent("AudioData", base64Audio); } } audioRecord.stop(); audioRecord.release(); }); recordingThread.start(); } @ReactMethod public void stopAudioStream() { isRecording = false; if (recordingThread != null) { try { recordingThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } recordingThread = null; } } private void sendEvent(String eventName, Object data) { getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, data); } } [/code] Я думаю, проблема в аудиовходе. Я беру то, что должен, и знаю об пределе, но до достижения предела он не выдавал текст Подробнее здесь: [url]https://stackoverflow.com/questions/79262380/why-am-i-not-receiving-transcription-results-from-google-speech-api-in-my-react[/url]