Могу ли я изменить голос для Google TTS в Flutter?

#flutter #dart #text-to-speech

#flutter #dart #преобразование текста в речь

Вопрос:

Я написал функцию, которая принимает 2 строки (утверждение, вопрос) и использует Google TTS для чтения этого вслух.

Я использую flutter_tts: ^1.3.0 пакет и попробовал setVoice метод изменения голоса говорящего на один из голосов, поддерживаемых в Google voices:

Вот мой код:

 Future _speak(statement, question) async {
    flutterTts.setLanguage("cmn-CN");
    flutterTts.setVoice("cmn-CN-Standard-B");
    flutterTts.setSpeechRate(0.7);
    await flutterTts.speak(statement   question);
  }
  

Функция работает, поскольку текст читается, но я получаю сообщение об ошибке в setVoice методе, в котором говорится:

 D/TTS     (12461): Voice name not found: cmn-CN-Standard-B
  

Может кто-нибудь помочь с этим, пожалуйста? Спасибо!


Обновить

Я понял, что не использую службу Google TTS, поэтому я сделал это, чтобы реализовать как мужские, так и женские голоса. Этот код работает для меня сейчас.

 import 'dart:typed_data';

import 'package:http/http.dart' as http;
import 'dart:convert';

import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:audioplayers/audioplayers.dart';

var _apikey = "AIzaSyDWx34PZW0hjSpwExBo5bwrENvyRkLisBE";
AudioPlayer audioPlayer = AudioPlayer();

const String femalevoice = "cmn-CN-Standard-A";
const String malevoice = "cmn-CN-Standard-B";

Future<http.Response> texttospeech(String text, String voicetype) {
  String url =
      "https://texttospeech.googleapis.com/v1beta1/text:synthesize?key=$_apikey";

  var body = json.encode({
    "audioConfig": {"audioEncoding": "LINEAR16", "pitch": 0, "speakingRate": 1},
    "input": {"text": text},
    "voice": {"languageCode": "cmn-CN", "name": voicetype}
  });

  var response =
      http.post(url, headers: {"Content-type": "application/json"}, body: body);

  return response;
}

// Play male voice
playmalevoice(String text) async {
  var response = await texttospeech(text, malevoice);
  var jsonData = jsonDecode(response.body);

  String audioBase64 = jsonData['audioContent'];

  Uint8List bytes = base64Decode(audioBase64);

  String dir = (await getApplicationDocumentsDirectory()).path;
  File file =
      File("$dir/"   DateTime.now().millisecondsSinceEpoch.toString()   ".mp3");

  await file.writeAsBytes(bytes);

  int result = await audioPlayer.play(file.path);
  audioPlayer.setPlaybackRate(playbackRate: 0.7);
  audioPlayer.setVolume(1);
  if (result == 1) {
    // success
  }
}

// play female voice
playfemalevoice(String text) async {
  var response = await texttospeech(text, femalevoice);
  var jsonData = jsonDecode(response.body);

  String audioBase64 = jsonData['audioContent'];

  Uint8List bytes = base64Decode(audioBase64);

  String dir = (await getApplicationDocumentsDirectory()).path;
  File file =
      File("$dir/"   DateTime.now().millisecondsSinceEpoch.toString()   ".mp3");

  await file.writeAsBytes(bytes);

  int result = await audioPlayer.play(file.path);
  audioPlayer.setPlaybackRate(playbackRate: 0.7);
  audioPlayer.setVolume(1);
  if (result == 1) {
    // success
  }
}
  

Комментарии:

1. Я пробовал await flutterTts.setVolume(громкость); await flutterTts.setSpeechRate(скорость); await flutterTts.setPitch(высота тона); Map<Строка, строка> ссылка = {‘voice’: «cmn-CN-Standard-B»}; await flutterTts.setVoice(ссылка); но setVoicesне изменился на женский голос

Ответ №1:

С помощью flutter tts вы можете задать только голос, который существует в наборе голосов, возвращаемых getvoices().

Голоса, возвращаемые getvoices(), будут голосами, доступными движку TTS, который используется устройством, на котором запущено ваше приложение.

Flutter tts не использует Google Cloud speech — он использует все, что есть на устройстве — либо речевой движок IOS, либо любой из многих возможных движков tts на Android.

Единственный способ сделать то, что вы пытаетесь сделать, — это использовать Google cloud speech в вашем приложении вместо flutter tts, но это будет означать, что вашему приложению потребуется интернет и, возможно, будет стоить вам денег за ключ api и т. Д.