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 | 30 | if (!dict.keys.isEmpty) { |
| 31 | 31 | appKey = dict["appKey"] as? String ?? "" |
| 32 | 32 | secretKey = dict["secretKey"] as? String ?? "" |
| 33 | + service = dict["service"] as? String ?? "" | |
| 33 | 34 | userId = dict["userId"] as? String ?? "guest" |
| 34 | 35 | frontTime = dict["frontTime"] as? String ?? "3" |
| 35 | 36 | backTime = dict["frontTime"] as? String ?? "3" |
| 36 | - service = dict["service"] as? String ?? "" | |
| 37 | 37 | } |
| 38 | 38 | let config = SSOralEvaluatingManagerConfig.init() |
| 39 | 39 | config.vad = true |
| ... | ... | @@ -102,6 +102,11 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate { |
| 102 | 102 | SSOralEvaluatingManager.share().stopEvaluate(); |
| 103 | 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 | 11 | static const String userTermSdkUrl = 'http://page.kouyuxingqiu.com/term_sdk.html'; |
| 12 | 12 | |
| 13 | 13 | /// 先声SDK |
| 14 | - static String xsAppKey = BasicConfig().isTestDev?'t418':'a418'; | |
| 14 | + static String xsAppKey = 'a418'; | |
| 15 | 15 | static String xsAppSecretKey = BasicConfig().isTestDev?'1a16f31f2611bf32fb7b3fc38f5b2c81':'c11163aa6c834a028da4a4b30955be99'; |
| 16 | 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 | 35 | unKnow, |
| 36 | 36 | ///测评开始 |
| 37 | 37 | start, |
| 38 | + ///评测结果 | |
| 39 | + result, | |
| 38 | 40 | ///测评结束 |
| 39 | 41 | stop, |
| 40 | 42 | } |
| ... | ... | @@ -111,6 +113,11 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo |
| 111 | 113 | if (call.method == 'voiceResult') {//评测结果 |
| 112 | 114 | add(XSVoiceResultEvent(call.arguments)); |
| 113 | 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 | 173 | try { |
| 167 | 174 | await loading(() async { |
| 168 | 175 | _entityList = await ListenDao.followResult(_recordNumber.toString(),courseLessonId); |
| 169 | - | |
| 170 | 176 | }); |
| 171 | 177 | } catch (e) { |
| 172 | 178 | if (e is ApiException) { |
| ... | ... | @@ -227,6 +233,7 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo |
| 227 | 233 | final result = args['result'] as Map; |
| 228 | 234 | final overall = result['overall'].toString(); |
| 229 | 235 | _voiceTestResult = {'overall':overall}; |
| 236 | + _xSCheckState = XSVoiceCheckState.result; | |
| 230 | 237 | emitter(XSVoiceTestState()); |
| 231 | 238 | } |
| 232 | 239 | |
| ... | ... | @@ -275,16 +282,13 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo |
| 275 | 282 | } |
| 276 | 283 | Directory tempDir = await getTemporaryDirectory(); |
| 277 | 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 | 287 | _path = path; |
| 281 | 288 | debugPrint('=====> 准备开始录音'); |
| 282 | 289 | await _soundRecorder.startRecorder( |
| 283 | 290 | toFile: path, |
| 284 | - codec: Codec.aacADTS, | |
| 285 | - bitRate: 8000, | |
| 286 | - numChannels: 1, | |
| 287 | - sampleRate: 8000, | |
| 291 | + codec: Codec.pcm16WAV, | |
| 288 | 292 | ); |
| 289 | 293 | debugPrint('=====> 开始录音'); |
| 290 | 294 | _voiceRecordState = VoiceRecordState.voiceRecording; | ... | ... |
lib/pages/repeataftercontent/repeat_after_content_page.dart
| ... | ... | @@ -27,7 +27,6 @@ class RepeatAfterContentPage extends StatelessWidget { |
| 27 | 27 | 'appKey':AppConsts.xsAppKey, |
| 28 | 28 | 'service':AppConsts.xsAppService, |
| 29 | 29 | 'secretKey':AppConsts.xsAppSecretKey, |
| 30 | - 'userId':UserUtil.getUser()!.id.toString(), | |
| 31 | 30 | } |
| 32 | 31 | )), |
| 33 | 32 | child: _RepeatAfterContentPage(), |
| ... | ... | @@ -158,6 +157,12 @@ class _RepeatAfterContentPage extends StatelessWidget { |
| 158 | 157 | ///播放中 |
| 159 | 158 | Widget _buildPlayVideoWidget() { |
| 160 | 159 | return BlocBuilder<RepeatAfterContentBloc,RepeatAfterContentState>( |
| 160 | + buildWhen: (previous, current) { | |
| 161 | + if (current is ChangeVideoPlayIndexEvent) { | |
| 162 | + return true; | |
| 163 | + } | |
| 164 | + return false; | |
| 165 | + }, | |
| 161 | 166 | builder: (context,state){ |
| 162 | 167 | final bloc = BlocProvider.of<RepeatAfterContentBloc>(context); |
| 163 | 168 | return Column( |
| ... | ... | @@ -252,28 +257,46 @@ class _RepeatAfterContentPage extends StatelessWidget { |
| 252 | 257 | builder: (context,state){ |
| 253 | 258 | final bloc = BlocProvider.of<RepeatAfterContentBloc>(context); |
| 254 | 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 | 268 | return Column( |
| 256 | 269 | mainAxisAlignment: MainAxisAlignment.end, |
| 257 | 270 | children: [ |
| 258 | 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 | 273 | child: Column( |
| 262 | 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 | 322 | ), |
| 300 | 323 | ), |
| 301 | 324 | Offstage( |
| 302 | - // offstage: true, | |
| 303 | 325 | offstage: bloc.voiceRecordState == VoiceRecordState.voiceRecordUnkonw || bloc.xSCheckState != XSVoiceCheckState.unKnow, |
| 304 | 326 | child: Container( |
| 305 | 327 | color: Colors.grey, | ... | ... |