riva_flutter 1.0.2
riva_flutter: ^1.0.2 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:lottie/lottie.dart';
import 'package:provider/provider.dart';
import 'package:riva_flutter/riva_shelf.dart';
import 'audio_model.dart';
void main() async {
await FRivaManager.initSdk(host: 'riva.ai.ftech.ai', languageTTS: LanguageSupport.english);
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: 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
? Lottie.asset('assets/lottie/recording.json', width: 100, height: 70)
: 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;
if(_toggleSpeak){
FRivaManager.startTTS(textOrigin: textOrigin);
}else{
FRivaManager.stopTTS();
}
_toggleSpeak = !_toggleSpeak;
}
}