【问题标题】:Audio transcription with Expo + google speech to text使用 Expo + google 语音到文本的音频转录
【发布时间】: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


    【解决方案1】:

    这种组合绝对有效,尽管在得出这个结论之前,让 Expo 表现得还有很多其他问题。

          extension: '.amr',
          outputFormat: Audio.RECORDING_OPTION_ANDROID_OUTPUT_FORMAT_AMR_WB,
          audioEncoder: Audio.RECORDING_OPTION_ANDROID_AUDIO_ENCODER_AMR_WB,
          sampleRate: 16000,
          numberOfChannels: 1,
          bitRate: 128000,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      相关资源
      最近更新 更多