yonge 3 年之前
父节点
当前提交
cf6bf3944e

+ 23 - 13
audio-analysis/src/main/java/com/yonge/netty/dto/UserChannelContext.java

@@ -2,6 +2,7 @@ package com.yonge.netty.dto;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -34,6 +35,9 @@ public class UserChannelContext {
 	
 	private final static Logger LOGGER = LoggerFactory.getLogger(UserChannelContext3.class);
 	
+	//打击乐
+	private final static List<Integer> percussionList = Arrays.asList(23, 113);
+	
 	private String user;
 	
 	private double standardFrequecy = 442;
@@ -327,12 +331,15 @@ public class UserChannelContext {
 		//int playFrequency = (int) frequencyDetector.getFrequency(samples);
 		
 		FastYin detector = new FastYin(audioFormat.getSampleRate(), samples.length);
-		int playFrequency = (int)detector.getPitch(samples).getPitch();
+		int playFrequency = -1;
+		if(!percussionList.contains(subjectId)){
+			playFrequency = (int)detector.getPitch(samples).getPitch();
+		}
 		
 		int splDb = (int) Signals.soundPressureLevel(samples);
 		int power = (int) Signals.power(samples);
 		int amplitude = (int) Signals.norm(samples);
-		float rms = Signals.rms(samples);
+		//float rms = Signals.rms(samples);
 		
 		double durationTime = 1000 * (samples.length * 2) / audioFormat.getSampleRate() / (audioFormat.getSampleSizeInBits() / 8);
 		
@@ -361,7 +368,7 @@ public class UserChannelContext {
 		
 		if (noteAnalysis.getMusicalNotesIndex() >= 0 && noteAnalysis.getMusicalNotesIndex() <= getTotalMusicNoteIndex(null)) {
 			
-			LOGGER.info("user:{} dynamicOffset:{}  Frequency:{}  splDb:{}  Power:{}  amplitude:{}  rms:{}  time:{}", user, dynamicOffset, playFrequency, splDb, power, amplitude, rms, playTime);
+			LOGGER.info("user:{}  delayProcessed:{}  dynamicOffset:{}  Frequency:{}  splDb:{}  amplitude:{}  time:{}", user, delayProcessed, dynamicOffset, playFrequency, splDb, amplitude, playTime);
 			
 			ChunkAnalysis chunkAnalysis = new ChunkAnalysis(playTime - durationTime, playTime, playFrequency, splDb, power, amplitude);
 			
@@ -373,7 +380,7 @@ public class UserChannelContext {
 			totalChunkAnalysisList.add(chunkAnalysis);
 			
 			boolean flag = false;
-			if(subjectId == 23 || subjectId == 113){
+			if(percussionList.contains(subjectId)){
 				flag = chunkAnalysis.getAmplitude() > hardLevel.getAmplitudeThreshold();
 			}else{
 				flag = chunkAnalysis.getFrequency() > 100;
@@ -397,13 +404,13 @@ public class UserChannelContext {
 					noteAnalysis.setIgnore(true);
 				}
 				
-				noteAnalysis.setPlayFrequency(computeFrequency(musicXmlNote));
-				
 				//判断节奏(音符持续时间内有不间断的音高,就节奏正确)
 				boolean tempo = true;
-				if (subjectId == 23 || subjectId == 113) {
+				if (percussionList.contains(subjectId)) {
+					noteAnalysis.setPlayFrequency(-1);
 					tempo = computeTempoWithAmplitude2(musicXmlNote);
 				}else{
+					noteAnalysis.setPlayFrequency(computeFrequency(musicXmlNote));
 					tempo = computeTempoWithFrequency(musicXmlNote);
 				}
 				
@@ -535,7 +542,7 @@ public class UserChannelContext {
 		
 		double playDurationTime = 0;
 		
-		if (subjectId == 23 || subjectId == 113) {
+		if (percussionList.contains(subjectId)) {
 			if (noteAnalysis.getFrequency() == -1) {// 休止符
 				if (!noteAnalysis.isTempo()) {
 					noteAnalysis.setMusicalErrorType(NoteErrorType.CADENCE_WRONG);
@@ -619,7 +626,7 @@ public class UserChannelContext {
 			noteAnalysis.setIntegrityScore(integrityScore);
 		}
 		noteAnalysis.setIntonationScore(intonationScore);
-		if (subjectId == 23 || subjectId == 113) {
+		if (percussionList.contains(subjectId)) {
 			noteAnalysis.setScore(tempoScore);
 		} else {
 			noteAnalysis.setScore(new BigDecimal(intonationScore + tempoScore + integrityScore).divide(new BigDecimal(3), 2).setScale(0, BigDecimal.ROUND_UP)
@@ -794,13 +801,16 @@ public class UserChannelContext {
 		if(chunkAnalysisList == null || chunkAnalysisList.size() == 0){
 			return false;
 		}
+		
+		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
+		
+		LOGGER.info("-------startTime:{}  endTime:{}------", firstChunkAnalysis.getStartTime(), chunkAnalysisList.get(chunkAnalysisList.size() - 1)
+				.getEndTime());
 
 		if (musicXmlNote.getFrequency() == -1) {// 休止符
 			return chunkAnalysisList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).count() <= 0;
 		}
 		
-		ChunkAnalysis firstChunkAnalysis = chunkAnalysisList.get(0);
-		
 		Optional<ChunkAnalysis> chunkAnalysisOptional = totalChunkAnalysisList.stream().filter(t -> Double.doubleToLongBits(t.getEndTime()) == Double.doubleToLongBits(firstChunkAnalysis.getStartTime())).findFirst();
 
 		ChunkAnalysis lastChunkAnalysis = null;
@@ -823,7 +833,7 @@ public class UserChannelContext {
 		int firstPeakIndex = -1;
 		int peakSize = 0;
 		for (int i = 1; i < chunkAmplitudeList.size(); i++) {
-			if (chunkAmplitudeList.get(i) > hardLevel.getAmplitudeThreshold() && chunkAmplitudeList.get(i) > chunkAmplitudeList.get(i - 1) + 2) {
+			if (chunkAmplitudeList.get(i) > hardLevel.getAmplitudeThreshold() && chunkAmplitudeList.get(i) > chunkAmplitudeList.get(i - 1) + 1) {
 				tempo = true;
 				if(firstPeakIndex == -1){
 					firstPeakIndex = i;
@@ -866,7 +876,7 @@ public class UserChannelContext {
 			return musicXmlNote.getTimeStamp() + dynamicOffset;
 		}
 		
-		if (subjectId == 23 || subjectId == 113) {
+		if (percussionList.contains(subjectId)) {
 			Optional<ChunkAnalysis> optional = chunkAnalysisList.stream().filter(t -> t.getAmplitude() > hardLevel.getAmplitudeThreshold()).findFirst();
 			if(optional.isPresent()){
 				return optional.get().getStartTime();

+ 12 - 16
audio-analysis/src/main/java/com/yonge/netty/server/service/AudioCompareHandler.java

@@ -104,21 +104,19 @@ public class AudioCompareHandler implements MessageHandler {
 		String command = (String) JSONPath.extract(jsonMsg, "$.header.commond");
 
 		JSONObject dataObj = (JSONObject) JSONPath.extract(jsonMsg, "$.body");
-
+		
 		UserChannelContext channelContext = userChannelContextService.getChannelContext(channel);
 		
 		MusicXmlBasicInfo musicXmlBasicInfo = null;
 
 		switch (command) {
 		case "musicXml": // 同步music xml信息
-
+			
 			musicXmlBasicInfo = JSONObject.toJavaObject(dataObj, MusicXmlBasicInfo.class);
-
+			
 			userChannelContextService.remove(channel);
 
-			if (channelContext == null) {
-				channelContext = new UserChannelContext();
-			}
+			channelContext = new UserChannelContext();
 			
 			channelContext.setHandlerSwitch(false);
 
@@ -142,7 +140,7 @@ public class AudioCompareHandler implements MessageHandler {
 				Date date = new Date();
 				SysMusicCompareRecord sysMusicCompareRecord = new SysMusicCompareRecord(FeatureType.CLOUD_STUDY_EVALUATION);
 				sysMusicCompareRecord.setCreateTime(date);
-				sysMusicCompareRecord.setUserId(Integer.parseInt(nettyChannelManager.getUser(channel)));
+				sysMusicCompareRecord.setUserId(Integer.parseInt(user));
 				sysMusicCompareRecord.setSysMusicScoreId(musicXmlBasicInfo.getExamSongId());
 				sysMusicCompareRecord.setBehaviorId(musicXmlBasicInfo.getBehaviorId());
 				//sysMusicCompareRecord.setClientId();
@@ -224,7 +222,7 @@ public class AudioCompareHandler implements MessageHandler {
 				
 				WebSocketResponse<Map<String, Object>> resp = new WebSocketResponse<Map<String, Object>>("overall", params);
 
-				nettyChannelManager.sendTextMessage(nettyChannelManager.getUser(channel), resp);
+				nettyChannelManager.sendTextMessage(user, resp);
 			}
 
 			// 清空缓存信息
@@ -279,7 +277,7 @@ public class AudioCompareHandler implements MessageHandler {
 			channelContext.setWaveFileProcessor(waveFileProcessor);
 		}
 		waveFileProcessor.process(datas);
-
+		
 		datas = channelContext.skipMetronome(datas);
 
 		if (datas.length == 0) {
@@ -295,15 +293,12 @@ public class AudioCompareHandler implements MessageHandler {
 		}
 		
 		if (channelContext.getOffsetMS() > 0) {
-			// 减掉空白
-			int durationTime = (int) (1000 * totalLength / audioFormat.getSampleRate() / (audioFormat.getSampleSizeInBits() / 8));
-
-			if (durationTime > channelContext.getOffsetMS()) {
-				int beatByteLength = WaveformWriter.SAMPLE_RATE * WaveformWriter.BITS_PER_SAMPLE / 8 * channelContext.getOffsetMS() / 1000;
+			int beatByteLength = WaveformWriter.SAMPLE_RATE * WaveformWriter.BITS_PER_SAMPLE / 8 * channelContext.getOffsetMS() / 1000;
+			
+			if(totalLength > beatByteLength){
 				channelContext.setChannelBufferBytes(ArrayUtil.extractByte(channelContext.getChannelBufferBytes(), beatByteLength, totalLength - 1));
 				channelContext.setOffsetMS(0);
-			} else {
-				channelContext.setOffsetMS(channelContext.getOffsetMS() - durationTime);
+			}else{
 				return false;
 			}
 		}
@@ -312,6 +307,7 @@ public class AudioCompareHandler implements MessageHandler {
 		if(totalLength % 2 != 0){
 			totalLength--;
 		}
+		
 
 		while (totalLength >= bufferSize) {
 			byte[] bufferData = ArrayUtil.extractByte(channelContext.getChannelBufferBytes(), 0, bufferSize - 1);