Commit 31d42f066b548015d4ad38cf8fad54321acf581c
1 parent
6b0947ca
feat:视频跟读录音修改
Showing
5 changed files
with
56 additions
and
25 deletions
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, |