Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter: Google Speech-To-Text API always returns null

I'm trying to call google speech-to-text api but it always return me null result. I got the implementation hint from this answer: Using gcloud speech api for real-time speech recognition in dart, flutter

I'm using flutter_sound (https://pub.dev/packages/flutter_sound) package to record audio and then send base64 encoded audio to speech API

Code for recording audio

String path = await flutterSound.startRecorder(
        Platform.isIOS ? 'ios.' : 'android.aac',
        androidEncoder: AndroidEncoder.AAC,
        sampleRate: 16000 ,
        numChannels: 1,
        androidAudioSource: AndroidAudioSource.MIC,
      );
      print('startRecorder: $path');

The audio file android.aac with .aac extension is generated successfully from above code.

Below code is used for sending audio data to speech api

final _credentials = new ServiceAccountCredentials.fromJson(r'''
{
  "type": "service_account",
  "project_id": "",
  "private_key_id": "",
   ....

''');

  final _SCOPES = const [SpeechApi.CloudPlatformScope];

  void convert() async {
    clientViaServiceAccount(_credentials, _SCOPES).then((http_client) {
      var speech = new SpeechApi

      try{
        String myPath= _path;
        _readFileByte(myPath).then((bytesData) async {
          String audioString = base64.encode(bytesData);
          print('audioString: $audioString');
          String audioStringSample = "";
          RecognizeRequest r = RecognizeRequest();
          RecognitionAudio audio = RecognitionAudio.fromJson({ 'content': audioString});
          r.audio = audio;
          RecognitionConfig config = RecognitionConfig.fromJson({
            'languageCode' : 'en-US',
            'encoding' : 'LINEAR16',
            'sampleRateHertz' : 16000,
          });
          r.config = config;
          speech.speech.recognize(r).then((results) {
            for (var result in results.results) {
              print(result.alternatives[0].transcript);
            }
          });

        });
      } catch (e) {
        // if path invalid or not able to read
        print(e);
      }
    });
  }

  Future<Uint8List> _readFileByte(String filePath) async {
    Uri myUri = Uri.parse(filePath);
    File audioFile = File.fromUri(myUri);
    Uint8List bytes;
    await audioFile.readAsBytes().then((value) {
      bytes = Uint8List.fromList(value);
      print('reading of bytes is completed');
    }).catchError((onError) {
      print('Exception Error while reading audio from path:' +
          onError.toString());
    });
    return bytes;
  }

The above code works perfect with audioStringSample(Find sample audio content here: https://gist.github.com/DazWilkin/34d628b998b4266be818ffb3efd688aa) but when I pass my own audio i.e audioString the result is always null. Anything I am doing wrong here?

P.S: I've also tried different encoding methods which are listed in Speech API reference (https://cloud.google.com/speech-to-text/docs/encoding) but remained unsuccessful.

like image 549
Hamza Ahmed Khan Avatar asked Oct 28 '25 17:10

Hamza Ahmed Khan


2 Answers

The problem lied in the recorder library. The recorder which resolved the problem: https://pub.dev/packages/flutter_audio_recorder

like image 105
Hamza Ahmed Khan Avatar answered Oct 31 '25 06:10

Hamza Ahmed Khan


I recently ran into this exact problem as well and I think the problem lies with the encoding of the file. I'm using v2.0.3 for flutter_sound and the default file type after recording is aac, however, according to https://cloud.google.com/speech-to-text/docs/encoding, they only acceptable file types are flac, amr, wav and some others.

I was using https://pub.dev/packages/google_speech and the preset encode is

'encoding' : 'LINEAR16',

which explains why the wav file worked

like image 45
mojo Avatar answered Oct 31 '25 06:10

mojo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!