Commit dae7f2fdfad70424942de10f37b470be6421d580
1 parent
cacfac41
feat:增加android端先声评测(自己录音,先声只评测)
Showing
7 changed files
with
43 additions
and
16 deletions
android/app/src/main/kotlin/com/kouyuxingqiu/wow_english/methodChannels/SingSoungMethodChannel.kt
| ... | ... | @@ -18,6 +18,7 @@ import java.lang.ref.WeakReference |
| 18 | 18 | */ |
| 19 | 19 | class SingSoungMethodChannel(activity: FlutterActivity, flutterEngine: FlutterEngine): SingEngineLifecycles.OnSingEngineAdapter() { |
| 20 | 20 | private var methodChannel: MethodChannel? = null |
| 21 | + private val TAG = "SingSoungMethodChannel" | |
| 21 | 22 | |
| 22 | 23 | companion object { |
| 23 | 24 | var channel: WeakReference<SingSoungMethodChannel>? = null |
| ... | ... | @@ -36,20 +37,29 @@ class SingSoungMethodChannel(activity: FlutterActivity, flutterEngine: FlutterEn |
| 36 | 37 | ) |
| 37 | 38 | init(activity) |
| 38 | 39 | methodChannel?.setMethodCallHandler { call, result -> |
| 40 | + Log.d(TAG, "SingSoungMethodChannel CALL=${call.method} ${call.arguments}") | |
| 39 | 41 | when (call.method) { |
| 40 | 42 | "initVoiceSdk" -> { |
| 41 | 43 | |
| 42 | 44 | } |
| 43 | 45 | "startVoice" -> { |
| 44 | 46 | val paramMap = call.arguments as HashMap<String, String> |
| 45 | - Log.d("WQF", "SingSoungMethodChannel startVoice=${call.arguments.javaClass} paramMap=$paramMap") | |
| 47 | + Log.d(TAG, "SingSoungMethodChannel startVoice=${call.arguments.javaClass} paramMap=$paramMap") | |
| 46 | 48 | paramMap["word"]?.let { SingEngineHelper.startRecord(it) } |
| 47 | - //do nothing | |
| 48 | 49 | } |
| 49 | 50 | "stopVoice" -> { |
| 50 | - Log.d("WQF", "SingSoungMethodChannel stopVoice") | |
| 51 | + Log.d(TAG, "SingSoungMethodChannel stopVoice") | |
| 51 | 52 | SingEngineHelper.stopRecord() |
| 52 | 53 | } |
| 54 | + "startLocalVoice" -> { | |
| 55 | + val paramMap = call.arguments as HashMap<String, String> | |
| 56 | + Log.d(TAG, "SingSoungMethodChannel startLocalVoice=${call.arguments.javaClass} paramMap=$paramMap") | |
| 57 | + paramMap["voicePath"]?.let { voiceFilePath -> | |
| 58 | + paramMap["word"]?.let { evaluateContent -> | |
| 59 | + SingEngineHelper.evaluate(voiceFilePath, evaluateContent) } | |
| 60 | + } | |
| 61 | + | |
| 62 | + } | |
| 53 | 63 | else -> { |
| 54 | 64 | result.notImplemented() |
| 55 | 65 | } | ... | ... |
android/app/src/main/kotlin/com/kouyuxingqiu/wow_english/singsound/SingEngineHelper.kt
| ... | ... | @@ -106,8 +106,29 @@ object SingEngineHelper : |
| 106 | 106 | } |
| 107 | 107 | } |
| 108 | 108 | |
| 109 | - // 开始语音评测 | |
| 110 | - fun startRecord(originText: String, @EvalTargetType evalTargetType: Int? = EvalTargetType.SENTENCE) { | |
| 109 | + // 开始语音评测(先声录音+评测) | |
| 110 | + fun startRecord(originText: String, @EvalTargetType evalTargetType: Int? = EvalTargetType.SENTENCE, userId: String? = VoiceConfig.UserID) { | |
| 111 | + buildEvaluateConfig(originText, evalTargetType, userId) | |
| 112 | + //开始测评 | |
| 113 | + mSingEngine?.start() | |
| 114 | + mCurEvalType = evalTargetType | |
| 115 | + Log.w(TAG, "startRecord originText=$originText evalTargetType =$evalTargetType") | |
| 116 | + } | |
| 117 | + | |
| 118 | + /** | |
| 119 | + * 评测外部录音文件 | |
| 120 | + * @param voiceFilePath 录音文件路径 | |
| 121 | + */ | |
| 122 | + fun evaluate(voiceFilePath: String, originText: String, @EvalTargetType evalTargetType: Int? = EvalTargetType.SENTENCE, userId: String? = VoiceConfig.UserID) { | |
| 123 | + buildEvaluateConfig(originText, evalTargetType, userId) | |
| 124 | + if (mIsReady) { | |
| 125 | + mSingEngine?.startWithPCM(voiceFilePath) | |
| 126 | + Log.w(TAG, "startWithPCM") | |
| 127 | + } | |
| 128 | + mCurEvalType = evalTargetType | |
| 129 | + } | |
| 130 | + | |
| 131 | + private fun buildEvaluateConfig(originText: String, @EvalTargetType evalTargetType: Int? = EvalTargetType.SENTENCE, userId: String? = VoiceConfig.UserID) { | |
| 111 | 132 | try { |
| 112 | 133 | val request = JSONObject() |
| 113 | 134 | when (evalTargetType) { |
| ... | ... | @@ -130,7 +151,6 @@ object SingEngineHelper : |
| 130 | 151 | .put("typeThres", SingSoundConfig.BASE_TYPETHRES) |
| 131 | 152 | .put("precision", 1) // 评分精度,默认1 |
| 132 | 153 | .put("attachAudioUrl", 1) // 评分结果中是否包含音频 url |
| 133 | - .put("userId", "test") | |
| 134 | 154 | .put("phones", jsonObj) // 指定单词的发音。 |
| 135 | 155 | .put("rank", 100) |
| 136 | 156 | } else { |
| ... | ... | @@ -161,16 +181,12 @@ object SingEngineHelper : |
| 161 | 181 | } |
| 162 | 182 | |
| 163 | 183 | //构建评测请求参数 |
| 164 | - val startCfg = mSingEngine?.buildStartJson(VoiceConfig.UserID, request) | |
| 184 | + val startCfg = mSingEngine?.buildStartJson(userId, request) | |
| 165 | 185 | //设置评测请求参数 |
| 166 | 186 | mSingEngine?.setStartCfg(startCfg) |
| 167 | - //开始测评 | |
| 168 | - mSingEngine?.start() | |
| 169 | - mCurEvalType = evalTargetType | |
| 170 | 187 | } catch (e: Exception) { |
| 171 | 188 | e.printStackTrace() |
| 172 | 189 | } |
| 173 | - Log.w(TAG, "startRecord originText=$originText evalTargetType =$evalTargetType") | |
| 174 | 190 | } |
| 175 | 191 | |
| 176 | 192 | fun stopRecord() { // 停止录音(有回调) | ... | ... |
ios/Runner/XSMessageMehtodChannel.swift
| ... | ... | @@ -93,7 +93,7 @@ class XSMessageMehtodChannel: NSObject,SSOralEvaluatingManagerDelegate { |
| 93 | 93 | return |
| 94 | 94 | } |
| 95 | 95 | |
| 96 | - if (call.method == "starLocalVoice") { | |
| 96 | + if (call.method == "startLocalVoice") { | |
| 97 | 97 | self.evaluateLocalVoice(dict: call.arguments as! Dictionary<String, Any>) |
| 98 | 98 | return |
| 99 | 99 | } | ... | ... |
lib/pages/reading/bloc/reading_bloc.dart
| ... | ... | @@ -7,6 +7,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; |
| 7 | 7 | import 'package:permission_handler/permission_handler.dart'; |
| 8 | 8 | import 'package:wow_english/pages/reading/widgets/ReadingModeType.dart'; |
| 9 | 9 | |
| 10 | +import '../../../common/core/user_util.dart'; | |
| 10 | 11 | import '../../../common/request/dao/listen_dao.dart'; |
| 11 | 12 | import '../../../common/request/exception.dart'; |
| 12 | 13 | import '../../../models/course_process_entity.dart'; |
| ... | ... | @@ -296,7 +297,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { |
| 296 | 297 | ); |
| 297 | 298 | if (result) { |
| 298 | 299 | methodChannel.invokeMethod( |
| 299 | - 'startVoice', {'word': content, 'type': '0', 'userId': '1'}); | |
| 300 | + 'startVoice', {'word': content, 'type': '0', 'userId': UserUtil.getUser()?.id.toString()}); | |
| 300 | 301 | } |
| 301 | 302 | } |
| 302 | 303 | ... | ... |
lib/pages/reading/bloc/reading_event.dart
| ... | ... | @@ -38,7 +38,7 @@ class XSVoiceResultEvent extends ReadingPageEvent { |
| 38 | 38 | class XSVoiceStartEvent extends ReadingPageEvent { |
| 39 | 39 | final String content; |
| 40 | 40 | final String type; |
| 41 | - final String userId; | |
| 41 | + final String? userId; | |
| 42 | 42 | XSVoiceStartEvent(this.content,this.type,this.userId); |
| 43 | 43 | } |
| 44 | 44 | ... | ... |
lib/pages/reading/reading_page.dart
| ... | ... | @@ -179,7 +179,7 @@ class _ReadingPage extends StatelessWidget { |
| 179 | 179 | bloc.add(XSVoiceStartEvent( |
| 180 | 180 | bloc.currentPageData()?.word ?? '', |
| 181 | 181 | '0', |
| 182 | - UserUtil.getUser()!.id.toString())); | |
| 182 | + UserUtil.getUser()?.id.toString())); | |
| 183 | 183 | } |
| 184 | 184 | }, |
| 185 | 185 | child: Image.asset( | ... | ... |
lib/pages/repeataftercontent/bloc/repeat_after_content_bloc.dart
| ... | ... | @@ -197,7 +197,7 @@ class RepeatAfterContentBloc extends Bloc<RepeatAfterContentEvent, RepeatAfterCo |
| 197 | 197 | ///先声测试 |
| 198 | 198 | void _voiceXsTest(XSVoiceTestEvent event,Emitter<RepeatAfterContentState> emitter) async { |
| 199 | 199 | await methodChannel.invokeMethod( |
| 200 | - 'starLocalVoice', | |
| 200 | + 'startLocalVoice', | |
| 201 | 201 | { |
| 202 | 202 | 'type':event.type, |
| 203 | 203 | 'word':event.testWord, | ... | ... |