You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
5.2 KiB

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../controllers/azure_asr_test_controller.dart';
import '../../../data/services/azure_asr_service.dart';
class AzureAsrTestView extends GetView<AzureAsrTestController> {
const AzureAsrTestView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Azure语音识别测试'),
actions: [
_buildLanguageDropdown(),
],
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
_buildStatusCard(),
const SizedBox(height: 16),
_buildRecognitionResultCard(),
const SizedBox(height: 16),
_buildControlButtons(context),
],
),
),
);
}
// 构建状态卡片
Widget _buildStatusCard() {
return Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'状态信息',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
Obx(() => Text('识别状态: ${_getStateText(controller.asrState.value)}')),
Obx(() => Text('是否正在监听: ${controller.isListening.value ? "是" : "否"}')),
Obx(() => Text('当前语言: ${controller.selectedLanguage.value}')),
],
),
),
);
}
// 构建识别结果卡片
Widget _buildRecognitionResultCard() {
return Expanded(
child: Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'识别结果',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
const Text('部分识别结果:'),
Obx(() => Text(
controller.partialText.value,
style: const TextStyle(color: Colors.blue),
)),
const SizedBox(height: 16),
const Text('最终识别结果:'),
Expanded(
child: Obx(() => SingleChildScrollView(
child: Text(
controller.recognizedText.value,
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
),
)),
),
],
),
),
),
);
}
// 构建控制按钮
Widget _buildControlButtons(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded(
child: Obx(() => ElevatedButton(
onPressed: controller.isListening.value
? null
: controller.startSimpleRecognition,
child: const Text('简单识别'),
)),
),
const SizedBox(width: 16),
Expanded(
child: Obx(() => ElevatedButton(
onPressed: controller.toggleContinuousRecognition,
style: ElevatedButton.styleFrom(
backgroundColor: controller.isListening.value
? Colors.red
: Theme.of(context).primaryColor,
),
child: Text(
controller.isListening.value ? '停止连续识别' : '开始连续识别',
),
)),
),
],
);
}
// 构建语言下拉菜单
Widget _buildLanguageDropdown() {
return Padding(
padding: const EdgeInsets.only(right: 16.0),
child: Obx(() => DropdownButton<String>(
value: controller.selectedLanguage.value,
onChanged: controller.isListening.value
? null
: (value) {
if (value != null) {
controller.changeLanguage(value);
}
},
items: controller.availableLanguages
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
)),
);
}
// 获取状态文本
String _getStateText(AzureAsrState state) {
switch (state) {
case AzureAsrState.notInitialized:
return '未初始化';
case AzureAsrState.initialized:
return '已初始化';
case AzureAsrState.listening:
return '正在监听';
case AzureAsrState.notListening:
return '未监听';
case AzureAsrState.error:
return '错误';
default:
return '未知';
}
}
}