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, | ... | ... |