Commit 31d42f066b548015d4ad38cf8fad54321acf581c

Authored by liangchengyou
1 parent 6b0947ca

feat:视频跟读录音修改

assets/images/sorrow_face.png 0 → 100644

8.23 KB

ios/Runner/XSMessageMehtodChannel.swift
@@ -30,10 +30,10 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate { @@ -30,10 +30,10 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate {
30 if (!dict.keys.isEmpty) { 30 if (!dict.keys.isEmpty) {
31 appKey = dict["appKey"] as? String ?? "" 31 appKey = dict["appKey"] as? String ?? ""
32 secretKey = dict["secretKey"] as? String ?? "" 32 secretKey = dict["secretKey"] as? String ?? ""
  33 + service = dict["service"] as? String ?? ""
33 userId = dict["userId"] as? String ?? "guest" 34 userId = dict["userId"] as? String ?? "guest"
34 frontTime = dict["frontTime"] as? String ?? "3" 35 frontTime = dict["frontTime"] as? String ?? "3"
35 backTime = dict["frontTime"] as? String ?? "3" 36 backTime = dict["frontTime"] as? String ?? "3"
36 - service = dict["service"] as? String ?? ""  
37 } 37 }
38 let config = SSOralEvaluatingManagerConfig.init() 38 let config = SSOralEvaluatingManagerConfig.init()
39 config.vad = true 39 config.vad = true
@@ -102,6 +102,11 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate { @@ -102,6 +102,11 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate {
102 SSOralEvaluatingManager.share().stopEvaluate(); 102 SSOralEvaluatingManager.share().stopEvaluate();
103 return 103 return
104 } 104 }
  105 +
  106 + if (call.method == "cancelVoice") {
  107 + SSOralEvaluatingManager.share().cancelEvaluate();
  108 + return;
  109 + }
105 } 110 }
106 111
107 //评测结果回调 112 //评测结果回调
lib/common/core/app_consts.dart
@@ -11,7 +11,7 @@ class AppConsts { @@ -11,7 +11,7 @@ class AppConsts {
11 static const String userTermSdkUrl = 'http://page.kouyuxingqiu.com/term_sdk.html'; 11 static const String userTermSdkUrl = 'http://page.kouyuxingqiu.com/term_sdk.html';
12 12
13 /// 先声SDK 13 /// 先声SDK
14 - static String xsAppKey = BasicConfig().isTestDev?'t418':'a418'; 14 + static String xsAppKey = 'a418';
15 static String xsAppSecretKey = BasicConfig().isTestDev?'1a16f31f2611bf32fb7b3fc38f5b2c81':'c11163aa6c834a028da4a4b30955be99'; 15 static String xsAppSecretKey = BasicConfig().isTestDev?'1a16f31f2611bf32fb7b3fc38f5b2c81':'c11163aa6c834a028da4a4b30955be99';
16 static String xsAppService = BasicConfig().isTestDev?'ws://trial.cloud.ssapi.cn:8080':'"wss://api.cloud.ssapi.cn'; 16 static String xsAppService = BasicConfig().isTestDev?'ws://trial.cloud.ssapi.cn:8080':'"wss://api.cloud.ssapi.cn';
17 } 17 }
lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart
@@ -35,6 +35,8 @@ enum XSVoiceCheckState { @@ -35,6 +35,8 @@ enum XSVoiceCheckState {
35 unKnow, 35 unKnow,
36 ///测评开始 36 ///测评开始
37 start, 37 start,
  38 + ///评测结果
  39 + result,
38 ///测评结束 40 ///测评结束
39 stop, 41 stop,
40 } 42 }
@@ -111,6 +113,11 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo @@ -111,6 +113,11 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo
111 if (call.method == 'voiceResult') {//评测结果 113 if (call.method == 'voiceResult') {//评测结果
112 add(XSVoiceResultEvent(call.arguments)); 114 add(XSVoiceResultEvent(call.arguments));
113 add(PostFollowReadContentEvent()); 115 add(PostFollowReadContentEvent());
  116 + return;
  117 + }
  118 +
  119 + if (call.method == 'voiceEnd') {
  120 + return;
114 } 121 }
115 }); 122 });
116 123
@@ -166,7 +173,6 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo @@ -166,7 +173,6 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo
166 try { 173 try {
167 await loading(() async { 174 await loading(() async {
168 _entityList = await ListenDao.followResult(_recordNumber.toString(),courseLessonId); 175 _entityList = await ListenDao.followResult(_recordNumber.toString(),courseLessonId);
169 -  
170 }); 176 });
171 } catch (e) { 177 } catch (e) {
172 if (e is ApiException) { 178 if (e is ApiException) {
@@ -227,6 +233,7 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo @@ -227,6 +233,7 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo
227 final result = args['result'] as Map; 233 final result = args['result'] as Map;
228 final overall = result['overall'].toString(); 234 final overall = result['overall'].toString();
229 _voiceTestResult = {'overall':overall}; 235 _voiceTestResult = {'overall':overall};
  236 + _xSCheckState = XSVoiceCheckState.result;
230 emitter(XSVoiceTestState()); 237 emitter(XSVoiceTestState());
231 } 238 }
232 239
@@ -275,16 +282,13 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo @@ -275,16 +282,13 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo
275 } 282 }
276 Directory tempDir = await getTemporaryDirectory(); 283 Directory tempDir = await getTemporaryDirectory();
277 var time = DateTime.now().millisecondsSinceEpoch; 284 var time = DateTime.now().millisecondsSinceEpoch;
278 - String path = '${tempDir.path}/$time${ext[Codec.aacADTS.index]}'; 285 + String path = '${tempDir.path}/$time${ext[Codec.pcm16WAV.index]}';
279 286
280 _path = path; 287 _path = path;
281 debugPrint('=====> 准备开始录音'); 288 debugPrint('=====> 准备开始录音');
282 await _soundRecorder.startRecorder( 289 await _soundRecorder.startRecorder(
283 toFile: path, 290 toFile: path,
284 - codec: Codec.aacADTS,  
285 - bitRate: 8000,  
286 - numChannels: 1,  
287 - sampleRate: 8000, 291 + codec: Codec.pcm16WAV,
288 ); 292 );
289 debugPrint('=====> 开始录音'); 293 debugPrint('=====> 开始录音');
290 _voiceRecordState = VoiceRecordState.voiceRecording; 294 _voiceRecordState = VoiceRecordState.voiceRecording;
lib/pages/repeataftercontent/repeat_after_content_page.dart
@@ -27,7 +27,6 @@ class RepeatAfterContentPage extends StatelessWidget { @@ -27,7 +27,6 @@ class RepeatAfterContentPage extends StatelessWidget {
27 'appKey':AppConsts.xsAppKey, 27 'appKey':AppConsts.xsAppKey,
28 'service':AppConsts.xsAppService, 28 'service':AppConsts.xsAppService,
29 'secretKey':AppConsts.xsAppSecretKey, 29 'secretKey':AppConsts.xsAppSecretKey,
30 - 'userId':UserUtil.getUser()!.id.toString(),  
31 } 30 }
32 )), 31 )),
33 child: _RepeatAfterContentPage(), 32 child: _RepeatAfterContentPage(),
@@ -158,6 +157,12 @@ class _RepeatAfterContentPage extends StatelessWidget { @@ -158,6 +157,12 @@ class _RepeatAfterContentPage extends StatelessWidget {
158 ///播放中 157 ///播放中
159 Widget _buildPlayVideoWidget() { 158 Widget _buildPlayVideoWidget() {
160 return BlocBuilder<RepeatAfterContentBloc,RepeatAfterContentState>( 159 return BlocBuilder<RepeatAfterContentBloc,RepeatAfterContentState>(
  160 + buildWhen: (previous, current) {
  161 + if (current is ChangeVideoPlayIndexEvent) {
  162 + return true;
  163 + }
  164 + return false;
  165 + },
161 builder: (context,state){ 166 builder: (context,state){
162 final bloc = BlocProvider.of<RepeatAfterContentBloc>(context); 167 final bloc = BlocProvider.of<RepeatAfterContentBloc>(context);
163 return Column( 168 return Column(
@@ -252,28 +257,46 @@ class _RepeatAfterContentPage extends StatelessWidget { @@ -252,28 +257,46 @@ class _RepeatAfterContentPage extends StatelessWidget {
252 builder: (context,state){ 257 builder: (context,state){
253 final bloc = BlocProvider.of<RepeatAfterContentBloc>(context); 258 final bloc = BlocProvider.of<RepeatAfterContentBloc>(context);
254 final voiceResult = bloc.voiceTestResult; 259 final voiceResult = bloc.voiceTestResult;
  260 + Color color;
  261 + if (int.parse(voiceResult?['overall'].toString()??'0') >= 60 || int.parse(voiceResult?['overall'].toString()??'0') <= 75) {
  262 + color = const Color(0xFFFF0000);
  263 + } else if (int.parse(voiceResult?['overall'].toString()??'0') > 75 || int.parse(voiceResult?['overall'].toString()??'0') <= 85) {
  264 + color = const Color(0xFFFFCC00);
  265 + } else {
  266 + color = const Color(0xFF40E04B);
  267 + }
255 return Column( 268 return Column(
256 mainAxisAlignment: MainAxisAlignment.end, 269 mainAxisAlignment: MainAxisAlignment.end,
257 children: [ 270 children: [
258 Offstage( 271 Offstage(
259 - // offstage: false,  
260 - offstage:!(bloc.voiceRecordState == VoiceRecordState.voiceRecordEnd && bloc.xSCheckState == XSVoiceCheckState.stop), 272 + offstage:!(bloc.voiceRecordState == VoiceRecordState.voiceRecordEnd && bloc.xSCheckState == XSVoiceCheckState.result),
261 child: Column( 273 child: Column(
262 children: [ 274 children: [
263 - Container(  
264 - height: 45.h,  
265 - width: 45.h,  
266 - alignment: Alignment.center,  
267 - decoration: BoxDecoration(  
268 - color: const Color(0xFF40E04B),  
269 - borderRadius: BorderRadius.circular(22.5.r) 275 + Offstage(
  276 + offstage:int.parse(voiceResult?['overall'].toString()??'0') > 60,
  277 + child: Image.asset(
  278 + 'sorrow_face'.assetPng,
  279 + height: 46.h,
  280 + width: 46.w,
270 ), 281 ),
271 - child: Text(  
272 - voiceResult?['overall'].toString()??'0',  
273 - textAlign: TextAlign.center,  
274 - style: TextStyle(  
275 - color: Colors.white,  
276 - fontSize: 17.sp 282 + ),
  283 + Offstage(
  284 + offstage: int.parse(voiceResult?['overall'].toString()??'0') < 60,
  285 + child: Container(
  286 + height: 45.h,
  287 + width: 45.h,
  288 + alignment: Alignment.center,
  289 + decoration: BoxDecoration(
  290 + color: color,
  291 + borderRadius: BorderRadius.circular(22.5.r)
  292 + ),
  293 + child: Text(
  294 + voiceResult?['overall'].toString()??'0',
  295 + textAlign: TextAlign.center,
  296 + style: TextStyle(
  297 + color: Colors.white,
  298 + fontSize: 17.sp
  299 + ),
277 ), 300 ),
278 ), 301 ),
279 ), 302 ),
@@ -299,7 +322,6 @@ class _RepeatAfterContentPage extends StatelessWidget { @@ -299,7 +322,6 @@ class _RepeatAfterContentPage extends StatelessWidget {
299 ), 322 ),
300 ), 323 ),
301 Offstage( 324 Offstage(
302 - // offstage: true,  
303 offstage: bloc.voiceRecordState == VoiceRecordState.voiceRecordUnkonw || bloc.xSCheckState != XSVoiceCheckState.unKnow, 325 offstage: bloc.voiceRecordState == VoiceRecordState.voiceRecordUnkonw || bloc.xSCheckState != XSVoiceCheckState.unKnow,
304 child: Container( 326 child: Container(
305 color: Colors.grey, 327 color: Colors.grey,