#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 и т. Д.