Browse Source

修改选择音色

newdev_shunjiawei
tanlongsheng 2 years ago
parent
commit
310f2f8672
  1. 6
      lib/data/services/speech_factory.dart
  2. 19
      lib/modules/settings/controllers/settings_controller.dart
  3. 26
      lib/modules/settings/views/settings_view.dart
  4. 24
      lib/modules/timbre/controllers/timbre_controller.dart
  5. 50
      lib/modules/timbre/views/timbre_view.dart

6
lib/data/services/speech_factory.dart

@ -41,6 +41,12 @@ class SpeechFactory extends GetxService {
} }
} }
/// 设置语音音色服务类型
void setTimbreServiceType() {
// 重新注册服务
_registerServices();
}
/// 注册语音服务 /// 注册语音服务
void _registerServices() { void _registerServices() {
// 注销现有服务 // 注销现有服务

19
lib/modules/settings/controllers/settings_controller.dart

@ -59,6 +59,8 @@ class SettingsController extends GetxController {
}, },
]; ];
RxString timbreName = '默认音色'.obs;
//用户信息 //用户信息
static const String userKey = 'user_info'; static const String userKey = 'user_info';
//final _storage=GetStorage(); //final _storage=GetStorage();
@ -72,6 +74,8 @@ class SettingsController extends GetxController {
// 获取系统语言 // 获取系统语言
_getLanguage(); _getLanguage();
_getTimbre();
// 从存储中加载上次保存的主题设置 // 从存储中加载上次保存的主题设置
final savedDarkMode = _themeService.isSavedDarkMode(); final savedDarkMode = _themeService.isSavedDarkMode();
@ -144,6 +148,21 @@ class SettingsController extends GetxController {
language.value = data; language.value = data;
} }
// 获取音色
void _getTimbre() {
List? timbreList = _storage.read('timbreList');
String? timbre = _storage.read('timbre');
if (timbreList != null && timbre != null) {
Map data = timbreList.firstWhere(
(element) => element['type'] == timbre,
orElse: () => {},
);
if (data.isNotEmpty) {
timbreName.value = data['name'];
}
}
}
void setLanguage(LanguageModel data) { void setLanguage(LanguageModel data) {
if (data.value != 'system') { if (data.value != 'system') {
List languageList = data.value.split('_'); List languageList = data.value.split('_');

26
lib/modules/settings/views/settings_view.dart

@ -339,6 +339,32 @@ class SettingsView extends GetView<SettingsController> {
// 语音服务选择 // 语音服务选择
_buildSpeechServiceSetting(isDarkMode), _buildSpeechServiceSetting(isDarkMode),
Divider(
height: 1,
color: isDarkMode
? Colors.white.withOpacity(0.1)
: Colors.grey[200]),
Obx(
() => _buildNavigationSetting(
title: '音色服务',
subtitle: '选择音色语音合成服务',
icon: Icons.photo_camera_front_outlined,
iconBgColor: isDarkMode
? Colors.cyan[900]!.withOpacity(0.3)
: Colors.cyan[100]!,
iconColor:
isDarkMode ? Colors.cyan[300]! : Colors.cyan[600]!,
value: controller.timbreName.value,
valueStyle: TextStyle(
fontSize: 12.sp,
color: isDarkMode ? Colors.white70 : Colors.grey[500],
),
onTap: () {
Get.toNamed(Routes.timbre);
},
isDarkMode: isDarkMode,
),
),
Divider( Divider(
height: 1, height: 1,
color: isDarkMode color: isDarkMode

24
lib/modules/timbre/controllers/timbre_controller.dart

@ -8,7 +8,12 @@ import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:record/record.dart'; import 'package:record/record.dart';
import '../../../data/services/speech_factory.dart';
import '../../settings/controllers/settings_controller.dart';
class TimbreController extends GetxController { class TimbreController extends GetxController {
final SettingsController settingsController = Get.find<SettingsController>();
final GetStorage _storage = GetStorage(); final GetStorage _storage = GetStorage();
final _record = AudioRecorder(); final _record = AudioRecorder();
@ -24,7 +29,7 @@ class TimbreController extends GetxController {
int _textId = 0; int _textId = 0;
int _segId = 0; int _segId = 0;
String _taskId = '67e0f5e6025cf871b1de31b2'; String _taskId = '';
@override @override
void onInit() { void onInit() {
@ -218,7 +223,7 @@ class TimbreController extends GetxController {
text.value = ''; text.value = '';
dataList.add({ dataList.add({
'type': _taskId, 'type': _taskId,
'name': '声音复刻$_taskId', 'name': '声音复刻${dataList.length}',
'description': '复刻本人音色服务', 'description': '复刻本人音色服务',
'isUsable': false 'isUsable': false
}); });
@ -254,7 +259,6 @@ class TimbreController extends GetxController {
dataList.firstWhereOrNull((item) => item['type'] == id); dataList.firstWhereOrNull((item) => item['type'] == id);
if (dataMap != null) { if (dataMap != null) {
dataMap['type'] = body['data']['assetId']; dataMap['type'] = body['data']['assetId'];
dataMap['name'] = '声音复刻${body['data']['assetId']}';
dataMap['isUsable'] = true; dataMap['isUsable'] = true;
dataList.refresh(); dataList.refresh();
_storage.write('timbreList', dataList); _storage.write('timbreList', dataList);
@ -280,8 +284,20 @@ class TimbreController extends GetxController {
// 选择音色 // 选择音色
void selectTone(Map data) { void selectTone(Map data) {
if (!data['isUsable']) return; if (!data['isUsable'] || type.value == data['type']) return;
type.value = data['type']; type.value = data['type'];
settingsController.timbreName.value = data['name'];
_storage.write('timbre', data['type']); _storage.write('timbre', data['type']);
setSpeechServiceType();
}
// 设置语音音色服务类型
void setSpeechServiceType() {
try {
final factory = Get.find<SpeechFactory>();
factory.setTimbreServiceType();
} catch (e) {
// 处理错误
}
} }
} }

50
lib/modules/timbre/views/timbre_view.dart

@ -201,26 +201,36 @@ class TimbreView extends GetView<TimbreController> {
], ],
), ),
), ),
Container( data['isUsable']
width: 24.w, ? Container(
height: 24.w, width: 24.w,
margin: EdgeInsets.only(left: 12.w), height: 24.w,
decoration: BoxDecoration( margin: EdgeInsets.only(left: 12.w),
color: controller.type.value == data['type'] decoration: BoxDecoration(
? (isDarkMode ? Colors.teal[300] : Colors.teal[600]) color: controller.type.value == data['type']
: (isDarkMode ? (isDarkMode ? Colors.teal[300] : Colors.teal[600])
? Colors.white.withOpacity(0.1) : (isDarkMode
: Colors.grey[300]), ? Colors.white.withOpacity(0.1)
shape: BoxShape.circle, : Colors.grey[300]),
), shape: BoxShape.circle,
child: controller.type.value == data['type'] ),
? Icon( child: controller.type.value == data['type']
Icons.check, ? Icon(
size: 16.w, Icons.check,
color: Colors.white, size: 16.w,
) color: Colors.white,
: null, )
), : null,
)
: SizedBox(
width: 24.w,
height: 24.w,
child: CircularProgressIndicator(
strokeWidth: 2.w,
valueColor:
const AlwaysStoppedAnimation<Color>(Colors.blue),
),
),
], ],
), ),
), ),

Loading…
Cancel
Save