riva_flutter 1.0.7
riva_flutter: ^1.0.7 copied to clipboard
The library shows device-specific speech recognition and speech-to-text conversion capabilities with Riva technology.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:model_viewer_plus/model_viewer_plus.dart';
import 'package:provider/provider.dart';
import 'package:riva_flutter/riva_shelf.dart';
import 'audio_model.dart';
void main() async {
await FRivaManager.initSdk(host: '', languageTTS: LanguageSupport.vietnamese, voiceName: "huyennguyen");
runApp(MultiProvider(
providers: [ChangeNotifierProvider(create: (context) => AudioModel())],
child: const MyApp(),
));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Riva Example',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: Center(
child: Stack(children: [
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Consumer<AudioModel>(
builder: (BuildContext context, AudioModel value, Widget? child) {
return Stack(
alignment: Alignment.bottomRight,
children: [
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8), color: Colors.lightBlueAccent.withAlpha(100)),
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
margin: const EdgeInsets.all(16),
height: 150,
width: double.infinity,
child: SingleChildScrollView(child: Text(value.resultRecord))),
Padding(
padding: const EdgeInsets.all(8),
child: IconButton(onPressed: _startSpeak, icon: const Icon(Icons.volume_up_rounded)),
)
],
);
},
),
Consumer<AudioModel>(
builder: (BuildContext context, AudioModel value, Widget? child) {
return Center(
child: value.isRecording
? const Text('Loading')
: TextButton(
onPressed: _startRecord,
style: ButtonStyle(
shape: MaterialStatePropertyAll(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
side: const BorderSide(color: Colors.lightBlue))),
minimumSize: const MaterialStatePropertyAll(Size(double.minPositive, 100)),
backgroundColor: const MaterialStatePropertyAll(Colors.lightBlue),
),
child: const Text('Start record', style: TextStyle(color: Colors.white)),
),
);
},
),
],
),
]),
),
);
}
void _startRecord() {
FRivaManager.startSTT(
onStart: () {
context.read<AudioModel>().isRecording = true;
},
onSpeeching: (textSpeeching) {},
onSuccess: (textRecognized) {
context.read<AudioModel>().resultRecord = textRecognized;
context.read<AudioModel>().isRecording = false;
},
onError: (error) {
context.read<AudioModel>().resultRecord = error;
context.read<AudioModel>().isRecording = false;
},
onComplete: () {
context.read<AudioModel>().isRecording = false;
});
}
bool _toggleSpeak = true;
void _startSpeak() {
var textOrigin = context.read<AudioModel>().resultRecord;
// var textOrigin = 'Hiện tại đối tác đã up lên server test, tuy nhiên họ bảo nếu làm auto login sẽ không kịp thời gian, hiện tại đang để login thủ công trong game luôn. Tuy nhiên là nó lại bị lỗi này khi login bằng facebook thì có cách nào khắc phục đc k?';
if (_toggleSpeak) {
FRivaManager.startTTS(textOrigin: textOrigin);
} else {
FRivaManager.stopTTS();
}
_toggleSpeak = !_toggleSpeak;
}
}