/// <summary> /// This method is called once per segment (typically one-minute segments). /// </summary> /// <param name="audioRecording">one minute of audio recording.</param> /// <param name="config">config file that contains parameters used by all profiles.</param> /// <param name="segmentStartOffset">when recording starts.</param> /// <param name="getSpectralIndexes">not sure what this is.</param> /// <param name="outputDirectory">where the recognizer results can be found.</param> /// <param name="imageWidth"> assuming ????.</param> /// <returns>recognizer results.</returns> public override RecognizerResults Recognize( AudioRecording audioRecording, Config config, TimeSpan segmentStartOffset, Lazy <IndexCalculateResult[]> getSpectralIndexes, DirectoryInfo outputDirectory, int?imageWidth) { //class NinoxBoobookConfig is defined at bottom of this file. var genericConfig = (NinoxBoobookConfig)config; var recognizer = new GenericRecognizer(); RecognizerResults combinedResults = recognizer.Recognize( audioRecording, genericConfig, segmentStartOffset, getSpectralIndexes, outputDirectory, imageWidth); // DO POST-PROCESSING of EVENTS // Filter out the chirp events for possible combining. var(chirpEvents, others) = combinedResults.NewEvents.FilterForEventType <ChirpEvent, EventCommon>(); // Uncomment the next line when want to obtain the event frequency profiles. // WriteFrequencyProfiles(chirpEvents); // Calculate frequency profile score for each event foreach (var ev in chirpEvents) { SetFrequencyProfileScore((ChirpEvent)ev); } // Combine overlapping events. If the dB threshold is set low, may get lots of little events. var newEvents = CompositeEvent.CombineOverlappingEvents(chirpEvents.Cast <EventCommon>().ToList()); if (genericConfig.CombinePossibleSyllableSequence) { // convert events to spectral events for possible combining. var(spectralEvents, _) = combinedResults.NewEvents.FilterForEventType <SpectralEvent, EventCommon>(); var startDiff = genericConfig.SyllableStartDifference; var hertzDiff = genericConfig.SyllableHertzGap; newEvents = CompositeEvent.CombineSimilarProximalEvents(spectralEvents, TimeSpan.FromSeconds(startDiff), (int)hertzDiff); } combinedResults.NewEvents = newEvents; //UNCOMMENT following line if you want special debug spectrogram, i.e. with special plots. // NOTE: Standard spectrograms are produced by setting SaveSonogramImages: "True" or "WhenEventsDetected" in <Towsey.PteropusSpecies.yml> config file. //GenericRecognizer.SaveDebugSpectrogram(territorialResults, genericConfig, outputDirectory, audioRecording.BaseName); return(combinedResults); }
/// <summary> /// This method is called once per segment (typically one-minute segments). /// </summary> /// <param name="audioRecording">one minute of audio recording.</param> /// <param name="config">config file that contains parameters used by all profiles.</param> /// <param name="segmentStartOffset">when recording starts.</param> /// <param name="getSpectralIndexes">not sure what this is.</param> /// <param name="outputDirectory">where the recognizer results can be found.</param> /// <param name="imageWidth"> assuming ????.</param> /// <returns>recognizer results.</returns> public override RecognizerResults Recognize( AudioRecording audioRecording, Config config, TimeSpan segmentStartOffset, Lazy <IndexCalculateResult[]> getSpectralIndexes, DirectoryInfo outputDirectory, int?imageWidth) { //class BotaurusPoiciloptilusConfig is define at bottom of this file. var genericConfig = (BotaurusPoiciloptilusConfig)config; var recognizer = new GenericRecognizer(); RecognizerResults combinedResults = recognizer.Recognize( audioRecording, genericConfig, segmentStartOffset, getSpectralIndexes, outputDirectory, imageWidth); // DO POST-PROCESSING of EVENTS var events = combinedResults.NewEvents; // Following two commented lines are different ways of casting lists. //var newEvents = spectralEvents.Cast<EventCommon>().ToList(); //var spectralEvents = events.Select(x => (SpectralEvent)x).ToList(); List <EventCommon> newEvents; // NOTE: If the dB threshold is set low, may get lots of little events. if (genericConfig.CombinePossibleSyllableSequence) { // Convert events to spectral events for combining of possible sequences. var spectralEvents = events.Cast <SpectralEvent>().ToList(); var startDiff = genericConfig.SyllableStartDifference; var hertzDiff = genericConfig.SyllableHertzGap; newEvents = CompositeEvent.CombineSimilarProximalEvents(spectralEvents, TimeSpan.FromSeconds(startDiff), (int)hertzDiff); } else { newEvents = events; } //filter the events for duration in seconds var minimumEventDuration = 0.5; if (genericConfig.CombinePossibleSyllableSequence) { minimumEventDuration = 2.0; } var filteredEvents = new List <EventCommon>(); foreach (var ev in newEvents) { var eventDuration = ((SpectralEvent)ev).EventDurationSeconds; if (eventDuration > minimumEventDuration && eventDuration < 11.0) { filteredEvents.Add(ev); } } combinedResults.NewEvents = filteredEvents; //UNCOMMENT following line if you want special debug spectrogram, i.e. with special plots. // NOTE: Standard spectrograms are produced by setting SaveSonogramImages: "True" or "WhenEventsDetected" in UserName.SpeciesName.yml config file. //GenericRecognizer.SaveDebugSpectrogram(territorialResults, genericConfig, outputDirectory, audioRecording.BaseName); return(combinedResults); }