Browse Source

Merge branch 'music_score'

Joburgess 4 years ago
parent
commit
d4e55d6e76

+ 8 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundServiceImpl.java

@@ -11,6 +11,7 @@ import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
 import be.tarsos.dsp.onsets.ComplexOnsetDetector;
 import be.tarsos.dsp.onsets.OnsetHandler;
 import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.SysMusicScoreAccompanimentDao;
 import com.ym.mec.biz.dal.dao.SysMusicScoreDao;
 import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
@@ -23,6 +24,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -268,7 +270,7 @@ public class SoundServiceImpl implements SoundService {
         //存储录音文件
         String filePath_r =  tmpDir + idGeneratorService.generatorId("sound") + "_r.wav";
 
-        LOGGER.info("录音文件大小:{}MB, 保存路径:{}", record.getSize()/1048576f, filePath_r);
+        LOGGER.info("录音文件大小:{}MB, 保存路径:{}, musicXml信息:{}", record.getSize()/1048576f, filePath_r, JSON.toJSONString(musicXmlInfos));
 
         BigDecimal oneHundred = new BigDecimal(100);
         //总分
@@ -299,7 +301,7 @@ public class SoundServiceImpl implements SoundService {
             //音准匹配误差范围
             float intonationErrRange = 10;
             //音准有效阈值
-            float intonationValidDuty = 0.7f;
+            float intonationValidDuty = 0.8f;
 
             //节奏匹配数量
             float cadenceNum = 0;
@@ -364,9 +366,11 @@ public class SoundServiceImpl implements SoundService {
 
             score = intonation.multiply(new BigDecimal(0.4)).add(cadence.multiply(new BigDecimal(0.4))).add(integrity.multiply(new BigDecimal(0.2))).setScale(0, BigDecimal.ROUND_HALF_UP);
         } catch (UnsupportedAudioFileException e) {
-            e.printStackTrace();
+            LOGGER.error("文件类型不支持:{}", FilenameUtils.getExtension(filePath_r));
         } catch (IOException e) {
-            e.printStackTrace();
+            LOGGER.error("IO异常:{}", e);
+        } catch (ArithmeticException e){
+            LOGGER.info("无musicXml信息");
         }finally {
             if(f_r!=null){
                 f_r.deleteOnExit();

+ 9 - 6
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SoundController.java

@@ -1,18 +1,17 @@
 package com.ym.mec.teacher.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
 import com.ym.mec.biz.service.SoundService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
@@ -37,8 +36,12 @@ public class SoundController extends BaseController {
 
     @ApiOperation(value = "小节评分")
     @PostMapping("measureCompare")
-    public HttpResponseResult measureCompare(List<MusicPitchDetailDto> musicXmlInfos, MultipartFile record){
-        return soundService.measureCompare(musicXmlInfos, record);
+    public HttpResponseResult measureCompare(@RequestParam("musicXmlInfos") String musicXmlInfos,@RequestParam("record") MultipartFile record){
+        if(StringUtils.isBlank(musicXmlInfos)){
+            return failed();
+        }
+        List<MusicPitchDetailDto> musicXmlInfoList =  JSON.parseArray(musicXmlInfos, MusicPitchDetailDto.class);
+        return soundService.measureCompare(musicXmlInfoList, record);
     }
 
 }