Commit dae7f2fdfad70424942de10f37b470be6421d580

Authored by 吴启风
1 parent cacfac41

feat:增加android端先声评测(自己录音,先声只评测)

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 &#39;package:flutter_easyloading/flutter_easyloading.dart&#39;;
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&lt;ReadingPageEvent, ReadingPageState&gt; {
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&lt;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,
... ...