Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
liwei1dao 1 year ago
parent
commit
24859e7ed5
  1. 26
      lib/modules/agent/views/message_bubble.dart
  2. 2
      lib/modules/agent/views/music_card.dart
  3. 0
      lib/modules/agent/widgets/circular_progress_button.dart
  4. 25
      lib/modules/meeting/controllers/meeting_record_controller.dart
  5. 13
      lib/modules/music/views/music_playlist_view.dart
  6. 51
      lib/modules/settings/views/settings_view.dart
  7. 7
      local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt

26
lib/modules/agent/views/message_bubble.dart

@ -46,28 +46,20 @@ class MessageBubble extends GetView<AgentController> {
isUser ? CrossAxisAlignment.end : CrossAxisAlignment.start, isUser ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [ children: [
Container( Container(
padding: hasImage padding: (hasImage && message == '[图片]')
? (message == '[图片]' ? EdgeInsets.zero
? EdgeInsets.zero : const EdgeInsets.all(12),
: isUser
? const EdgeInsets.fromLTRB(
12, 12, 16, 12) // 用户消息右侧多一点内边距
: const EdgeInsets.fromLTRB(
16, 12, 12, 12)) // AI消息左侧多一点内边距
: isUser
? const EdgeInsets.fromLTRB(
12, 12, 16, 12) // 用户消息右侧多一点内边距
: const EdgeInsets.fromLTRB(
16, 12, 12, 12), // AI消息左侧多一点内边距
decoration: BoxDecoration( decoration: BoxDecoration(
color: _getBubbleColor(context), color: _getBubbleColor(context),
borderRadius: BorderRadius.circular(18).copyWith( borderRadius: BorderRadius.only(
topLeft: isUser topLeft: isUser
? const Radius.circular(18) ? const Radius.circular(18)
: const Radius.circular(4), : const Radius.circular(4),
topRight: !isUser topRight: isUser
? const Radius.circular(18) ? const Radius.circular(4)
: const Radius.circular(4), : const Radius.circular(18),
bottomLeft: const Radius.circular(18),
bottomRight: const Radius.circular(18),
), ),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(

2
lib/modules/agent/views/music_card.dart

@ -3,7 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../../../routes/app_routes.dart'; import '../../../routes/app_routes.dart';
import '../controllers/agent_controller.dart'; import '../controllers/agent_controller.dart';
import 'circular_progress_button.dart'; import '../widgets/circular_progress_button.dart';
/// 构建音乐项目 /// 构建音乐项目
Widget buildMusicItem(BuildContext context, int id, String name, String url, Widget buildMusicItem(BuildContext context, int id, String name, String url,

0
lib/modules/agent/views/circular_progress_button.dart → lib/modules/agent/widgets/circular_progress_button.dart

25
lib/modules/meeting/controllers/meeting_record_controller.dart

@ -90,7 +90,7 @@ class MeetingRecordController extends GetxController
Future<void> _reinitializeAsrService() async { Future<void> _reinitializeAsrService() async {
try { try {
// 重新初始化ASR服务 // 重新初始化ASR服务
// await _asrService.initialize(); await _asrService.initialize();
Logger.info('ASR服务重新初始化成功'); Logger.info('ASR服务重新初始化成功');
} catch (e) { } catch (e) {
@ -163,7 +163,7 @@ class MeetingRecordController extends GetxController
_bleManager.closeCodec(); _bleManager.closeCodec();
} }
_asrService.stopRecord(true); _asrService.stopRecord(true);
//_asrService.stopContinuousRecognition(); _asrService.stopContinuousRecognition();
isRecording.value = false; isRecording.value = false;
} }
@ -196,12 +196,12 @@ class MeetingRecordController extends GetxController
/// Toggles visibility of transcribed text content /// Toggles visibility of transcribed text content
Future<void> toggleTextDisplay() async { Future<void> toggleTextDisplay() async {
// final recognitionStream = await _asrService.recognizeCallback(); final recognitionStream = await _asrService.recognizeCallback();
// _recognitionSubscription?.cancel(); _recognitionSubscription?.cancel();
// _recognitionSubscription = _recognitionSubscription =
// recognitionStream.listen(_handleRecognitionEvent); recognitionStream.listen(_handleRecognitionEvent);
//await _asrService.startContinuousRecognition(_audioSourceType); await _asrService.startContinuousRecognition(_audioSourceType);
showTextContent.toggle(); showTextContent.toggle();
} }
@ -242,8 +242,8 @@ class MeetingRecordController extends GetxController
/// Starts recording session /// Starts recording session
Future<void> _startRecording() async { Future<void> _startRecording() async {
// Initialize speech recognition // Initialize speech recognition
// final recognitionStream = final recognitionStream =
// await _asrService.startContinuousRecognition(_audioSourceType); await _asrService.startContinuousRecognition(_audioSourceType);
// Prepare storage directory // Prepare storage directory
final appDir = await appDocDir; final appDir = await appDocDir;
@ -284,14 +284,14 @@ class MeetingRecordController extends GetxController
/// Pauses current recording session /// Pauses current recording session
Future<void> _pauseRecording() async { Future<void> _pauseRecording() async {
// await _asrService.stopContinuousRecognition(); await _asrService.stopContinuousRecognition();
await _asrService.pauseRecord(); await _asrService.pauseRecord();
pauseTimer(); pauseTimer();
} }
/// Resumes paused recording session /// Resumes paused recording session
Future<void> _resumeRecording() async { Future<void> _resumeRecording() async {
//await _asrService.startContinuousRecognition(_audioSourceType); await _asrService.startContinuousRecognition(_audioSourceType);
startTimer(); startTimer();
} }
@ -303,7 +303,6 @@ class MeetingRecordController extends GetxController
intermediateContent.value = event.text; intermediateContent.value = event.text;
break; break;
case RecognitionEventType.onAudio: case RecognitionEventType.onAudio:
print("音波数据:${event.audio!.length}");
// 添加新音频数据到波形 // 添加新音频数据到波形
_processAudioData(event.audio!); _processAudioData(event.audio!);
break; break;
@ -462,7 +461,7 @@ class MeetingRecordController extends GetxController
} }
} }
//await _asrService.stopContinuousRecognition(); await _asrService.stopContinuousRecognition();
_resetToDefaultState(); _resetToDefaultState();
isRecording.value = false; isRecording.value = false;
} }

13
lib/modules/music/views/music_playlist_view.dart

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import '../../../core/utils/logger.dart'; import '../../../core/utils/logger.dart';
import '../../agent/controllers/agent_controller.dart'; import '../../agent/controllers/agent_controller.dart';
import '../../agent/views/circular_progress_button.dart'; import '../../agent/widgets/circular_progress_button.dart';
class MusicPlaylistView extends StatelessWidget { class MusicPlaylistView extends StatelessWidget {
const MusicPlaylistView({Key? key}) : super(key: key); const MusicPlaylistView({Key? key}) : super(key: key);
@ -115,7 +115,9 @@ class MusicPlaylistView extends StatelessWidget {
); );
} }
final title = currentSong['name'] ?? currentSong['title'] ?? 'unknownSong'.tr; // 未知歌曲 final title = currentSong['name'] ??
currentSong['title'] ??
'unknownSong'.tr; // 未知歌曲
final artist = currentSong['singer'] ?? final artist = currentSong['singer'] ??
currentSong['sgener'] ?? currentSong['sgener'] ??
currentSong['artist'] ?? currentSong['artist'] ??
@ -192,7 +194,8 @@ class MusicPlaylistView extends StatelessWidget {
final id = item["id"] ?? 0; final id = item["id"] ?? 0;
final name = item["name"] ?? 'unknownSong'.tr; // 未知歌曲 final name = item["name"] ?? 'unknownSong'.tr; // 未知歌曲
final url = item["url"] ?? ""; final url = item["url"] ?? "";
final singer = item["singer"] ?? item["sgener"] ?? 'unknownArtist'.tr; // 未知歌手 final singer =
item["singer"] ?? item["sgener"] ?? 'unknownArtist'.tr; // 未知歌手
final image = item["image"] ?? ""; final image = item["image"] ?? "";
return _buildMusicItem( return _buildMusicItem(
@ -628,8 +631,8 @@ class MusicPlaylistView extends StatelessWidget {
} }
// 播放选中的歌曲 // 播放选中的歌曲
Future<void> _playSelectedSong(AgentController controller, Map<String, dynamic> song, Future<void> _playSelectedSong(AgentController controller,
List<Map<String, dynamic>> playlist) async { Map<String, dynamic> song, List<Map<String, dynamic>> playlist) async {
// 防止重复点击导致的状态混乱 // 防止重复点击导致的状态混乱
if (controller.isLoadingMusic.value) { if (controller.isLoadingMusic.value) {
return; return;

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

@ -418,32 +418,31 @@ class SettingsView extends GetView<SettingsController> {
}, },
isDarkMode: isDarkMode, isDarkMode: isDarkMode,
), ),
if (Platform.isAndroid) ...[ // if (Platform.isAndroid) ...[
Divider( Divider(
height: 1, height: 1,
color: isDarkMode color: isDarkMode
? Colors.white.withOpacity(0.1) ? Colors.white.withOpacity(0.1)
: Colors.grey[200]), : Colors.grey[200]),
// 隐私设置 // 隐私设置
_buildSimpleNavigationSetting( _buildSimpleNavigationSetting(
title: 'privacySettings'.tr, // 隐私设置 title: 'privacySettings'.tr, // 隐私设置
subtitle: 'privacySettingsInfo'.tr, // 管理数据收集和权限 subtitle: 'privacySettingsInfo'.tr, // 管理数据收集和权限
icon: Icons.shield_outlined, icon: Icons.shield_outlined,
iconBgColor: isDarkMode iconBgColor: isDarkMode
? Colors.purple[900]!.withOpacity(0.3) ? Colors.purple[900]!.withOpacity(0.3)
: Colors.purple[100]!, : Colors.purple[100]!,
iconColor: isDarkMode iconColor:
? Colors.purple[300]! isDarkMode ? Colors.purple[300]! : Colors.purple[600]!,
: Colors.purple[600]!, titleColor: isDarkMode ? Colors.white : null,
titleColor: isDarkMode ? Colors.white : null, subtitleColor: isDarkMode ? Colors.white70 : null,
subtitleColor: isDarkMode ? Colors.white70 : null, onTap: () {
onTap: () { AppSettings.openAppSettings();
AppSettings.openAppSettings(); },
}, isDarkMode: isDarkMode,
isDarkMode: isDarkMode, ),
) // ],
],
Divider( Divider(
height: 1, height: 1,
@ -599,7 +598,7 @@ class SettingsView extends GetView<SettingsController> {
? Colors.white.withOpacity(0.1) ? Colors.white.withOpacity(0.1)
: Colors.grey[200]), : Colors.grey[200]),
// 添加权限管理设置项 // 权限管理设置项
_buildSimpleNavigationSetting( _buildSimpleNavigationSetting(
title: 'permissionManagement'.tr, // 权限管理 title: 'permissionManagement'.tr, // 权限管理
subtitle: 'permissionManagementInfo'.tr, // 管理应用权限设置 subtitle: 'permissionManagementInfo'.tr, // 管理应用权限设置

7
local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureAsrHelper.kt

@ -717,7 +717,7 @@ class AzureAsrHelper(private val context: Context) {
if (bytesToWrite < data.size) data.copyOf(bytesToWrite) else data if (bytesToWrite < data.size) data.copyOf(bytesToWrite) else data
try { try {
continuousCallback?.onAudio(finalData) //continuousCallback?.onAudio(finalData)
pushAudioStream?.write(finalData) pushAudioStream?.write(finalData)
recordfile?.saveAudioDataToWav(finalData) recordfile?.saveAudioDataToWav(finalData)
} catch (e: Exception) { } catch (e: Exception) {
@ -922,7 +922,6 @@ class AzureAsrHelper(private val context: Context) {
fun onError(error: String) fun onError(error: String)
} }
/** /**
* 连续识别回调接口 * 连续识别回调接口
*/ */
@ -954,9 +953,9 @@ class AzureAsrHelper(private val context: Context) {
fun onSessionStopped() fun onSessionStopped()
/** /**
* 返回音频数据 * 返回音频
* *
* @param data 音频字节数组 * @param data 识别的音频
*/ */
fun onAudio(data: ByteArray) fun onAudio(data: ByteArray)

Loading…
Cancel
Save