【发布时间】:2021-02-16 22:06:44
【问题描述】:
我正在尝试在 Expo 上录制音频并使用 Google 的 Speech to Text Service 进行转录。
它已经在 iOS 上运行,但还没有在 Android 上运行。我认为这是 Android 的录制选项有问题。
我没有收到来自 Google 服务器的错误响应,只有一个空对象。
代码如下:
const recordingOptions = {
// android not currently in use, but parameters are required
android: {
extension: ".m4a",
outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_MPEG_4,
audioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AAC,
sampleRate: 44100,
numberOfChannels: 1,
bitRate: 128000,
},
ios: {
extension: ".wav",
audioQuality: Audio.RECORDING_OPTION_IOS_AUDIO_QUALITY_HIGH,
sampleRate: 44100,
numberOfChannels: 1,
bitRate: 128000,
linearPCMBitDepth: 16,
linearPCMIsBigEndian: false,
linearPCMIsFloat: false,
},
};
const [recording, setRecording] = useState<Audio.Recording | null>(null);
const startRecording = async () => {
const { status } = await Permissions.askAsync(Permissions.AUDIO_RECORDING);
if (status !== "granted") return;
// some of these are not applicable, but are required
await Audio.setAudioModeAsync({
allowsRecordingIOS: true,
interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX,
playsInSilentModeIOS: true,
shouldDuckAndroid: true,
interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX,
playThroughEarpieceAndroid: true,
});
const newRecording = new Audio.Recording();
try {
await newRecording.prepareToRecordAsync(recordingOptions);
await newRecording.startAsync();
} catch (error) {
console.log(error);
stopRecording();
}
setRecording(newRecording);
};
const stopRecording = async () => {
try {
await recording!.stopAndUnloadAsync();
} catch (error) {
// Do nothing -- we are already unloaded.
}
};
const getAudioTranscription = async () => {
try {
const info = await FileSystem.getInfoAsync(recording!.getURI()!);
console.log(`FILE INFO: ${JSON.stringify(info)}`);
const uri = info.uri;
await toDataUrl(uri, async function (base64content: string) {
if (Platform.OS == "ios")
base64content = base64content.replace("data:audio/vnd.wave;base64,", "");
else
base64content = base64content.replace("data:audio/aac;base64,", "");
console.log(recording?._options?.android)
const body = {
audio: {
content: base64content,
},
config: {
enableAutomaticPunctuation: true,
encoding: "LINEAR16",
languageCode: "pt-BR",
model: "default",
sampleRateHertz: 44100,
},
};
const transcriptResponse = await fetch(
"https://speech.googleapis.com/v1p1beta1/speech:recognize?key=MY_KEY",
{ method: "POST", body: JSON.stringify(body) }
);
const data = await transcriptResponse.json();
const userMessage = data.results && data.results[0].alternatives[0].transcript || "";
});
} catch (error) {
console.log("There was an error", error);
}
stopRecording();
};
【问题讨论】:
标签: javascript android react-native expo google-speech-api