public static RecognizerResults DoCallRecognition(string name, TimeSpan segmentStartOffset, AudioRecording recording, Lazy <IndexCalculateResult[]> indices, DirectoryInfo outputDirectory, int imageWidth) { Log.Debug("Looking for recognizer and config files for " + name); // find an appropriate event recognizer var recognizer = AnalyseLongRecording.FindAndCheckAnalyzer <IEventRecognizer>(name, name + ".yml"); // load up the standard config file for this species var configurationFile = ConfigFile.Resolve(name + ".yml"); var configuration = recognizer.ParseConfig(configurationFile); // TODO: adapt sample rate to required rate int?resampleRate = configuration.ResampleRate; if (resampleRate.HasValue && recording.WavReader.SampleRate != resampleRate.Value) { Log.Warn("Sample rate of provided file does does match"); } // execute it Log.Info("MultiRecognizer: Executing single recognizer " + name); RecognizerResults result = recognizer.Recognize( recording, configuration, segmentStartOffset, indices, outputDirectory, imageWidth); Log.Debug("MultiRecognizer: Completed single recognizer" + name); var scoreTracks = result.Plots.Select(p => GenerateScoreTrackImage(name, p?.data, imageWidth)).ToList(); if (scoreTracks.Count != 0) { result.ScoreTrack = ImageTools.CombineImagesVertically(scoreTracks); } return(result); }
public override AnalysisResult2 Analyze <T>(AnalysisSettings analysisSettings, SegmentSettings <T> segmentSettings) { var recording = new AudioRecording(segmentSettings.SegmentAudioFile.FullName); // get indices configuration - extracted in BeforeAnalyze var acousticIndicesConfig = (RecognizerConfig)analysisSettings.Configuration; // get a lazily calculated indices function - if you never get the lazy value, the indices will never be calculated var lazyIndices = this.GetLazyIndices( recording, analysisSettings, segmentSettings, acousticIndicesConfig.HighResolutionIndices); // determine imageWidth for output images int imageWidth = (int)Math.Floor( recording.Duration.TotalSeconds / acousticIndicesConfig.HighResolutionIndices.IndexCalculationDuration); // execute actual analysis RecognizerResults results = this.Recognize( recording, analysisSettings.Configuration, segmentSettings.SegmentStartOffset, lazyIndices, segmentSettings.SegmentOutputDirectory, imageWidth); var analysisResults = new AnalysisResult2(analysisSettings, segmentSettings, recording.Duration); BaseSonogram sonogram = results.Sonogram; double[,] hits = results.Hits; var predictedEvents = results.Events; // double check all the events have the right offset in case it was missed foreach (var predictedEvent in predictedEvents) { predictedEvent.SegmentStartSeconds = segmentSettings.SegmentStartOffset.TotalSeconds; } analysisResults.Events = predictedEvents.ToArray(); // compress high resolution indices - and save them. // IF they aren't used, empty values are returned. if (lazyIndices.IsValueCreated) { this.SummarizeHighResolutionIndices( analysisResults, lazyIndices.Value, acousticIndicesConfig.HighResolutionIndices); } // write intermediate output if necessary if (analysisSettings.AnalysisDataSaveBehavior) { this.WriteEventsFile(segmentSettings.SegmentEventsFile, analysisResults.Events); analysisResults.EventsFile = segmentSettings.SegmentEventsFile; } if (analysisSettings.AnalysisDataSaveBehavior) { this.WriteSummaryIndicesFile(segmentSettings.SegmentSummaryIndicesFile, analysisResults.SummaryIndices); } if (analysisSettings.AnalysisDataSaveBehavior) { analysisResults.SpectraIndicesFiles = this.WriteSpectrumIndicesFiles( segmentSettings.SegmentSpectrumIndicesDirectory, segmentSettings.Segment.SourceMetadata.Identifier, analysisResults.SpectralIndices); } if (analysisSettings.AnalysisImageSaveBehavior.ShouldSave(analysisResults.Events.Length)) { string imagePath = segmentSettings.SegmentImageFile.FullName; const double EventThreshold = 0.1; var plots = results.Plots ?? new List <Plot>(); Image image = this.DrawSonogram(sonogram, hits, plots, predictedEvents, EventThreshold); image.Save(imagePath); analysisResults.ImageFile = segmentSettings.SegmentImageFile; // draw a fancy high res index image // IF indices aren't used, no image is drawn. if (lazyIndices.IsValueCreated) { this.DrawLongDurationSpectrogram( segmentSettings.SegmentOutputDirectory, recording.BaseName, results.ScoreTrack, lazyIndices.Value, acousticIndicesConfig.HighResolutionIndices); } } return(analysisResults); }