[Clam-devel] adding frames to a segment

Greg Kellum greg.kellum at gmail.com
Wed Jun 20 09:30:18 PDT 2007


Hi Giacomo,

Thanks!  Those files are going to be really useful for me.

Best,
Greg


On 6/20/07, Giacomo Sommavilla <azeem at libero.it> wrote:
>
> hi greg!
>
> Here is a minimal program we use to analyze short speech audio chunks (we
> are developing a CLAM-based module for a TTS system) and store each one of
> them into a sdif file.
> I also attach a standard xml analysis config file..
>
> ..hope they are useful :-)
>
> giacomo.
>
>
>
>
> > Hi all,
> >
> > I've been trying to get CLAM to load an audio file, analyze it, and
> write
> > the results to an SDIF file.  So far I have CLAM reading audio into a
> > segment, but when I give this segment to the class SpectralAnalysis
> > everything goes down with a null pointer exception because the segment
> > doesn't yet have any frames.  I'm not sure what I need to do here.  I
> could
> > create a new Frame object and add it to the Segment's frame list, but
> there
> > must be a class that is responsible for chopping the audio data into
> > frames.  So, I really shouldn't need to do this.  The question is what
> class
> > does this?  After one loads audio data into a Segment what does one have
> to
> > do to create the list of frames before passing the Segment on to the
> > analysis routine?
> >
> > I've included an example file below that illustrates what I'm talking
> > about.  The null pointer exception comes at the line
> >          while (aSpectralAnalysis.Do( aSegment )) {}
> > And it's thrown inside the SpectralAnalysis object when that object
> tries to
> > access a Frame object that doesn't exist.
> >
> > Best,
> > Greg
> >
> >
> > #include "SimpleOscillator.hxx"
> > #include "SMSAnalysisCore.hxx"
> > #include "SMSAnalysisConfig.hxx"
> > #include "SMSSynthesis.hxx"
> > #include "Audio.hxx"
> > #include "Frame.hxx"
> > #include "Segment.hxx"
> > #include "AudioOutPort.hxx"
> > #include "MonoAudioFileReader.hxx"
> > #include "AudioDatabaseReader.hxx"
> > #include "Network.hxx"
> > #include "SpectralAnalysis.hxx"
> > #include "SpectralPeakDetect.hxx"
> > #include "Spectrum.hxx"
> > #include "SpectralPeakArray.hxx"
> > #include "SDIFOut.hxx"
> > #include "SpectralAnalysis.hxx"
> > #include "SpectralAnalysisConfig.hxx"
> > #include "AudioFileIn.hxx"
> > #include "AudioFileConfig.hxx"
> >
> > #define AUDIO_IN_FILE
> >
> "/Users/greg/Music/samples/MyPatches/EBowGuitarWav/EBow_Guitar_A4_RS.wav"
> > #define SDIF_OUT_FILE
> >
> "/Users/greg/Music/samples/MyPatches/EBowGuitarSDIF/EBow_Guitar_A4_RS_cmd.sdif"
> >
> > class SDIFWriterApp;
> >
> > class SDIFWriterApp
> > {
> > public:
> >     void setUp()
> >     {
> >     }
> >
> >     CLAM::SMSSynthesis mSynthesis;
> >
> >     const int helperResAnalWindowSize() { return 1025; }
> > //    const int helperAnalWindowSize() { return 2049; }
> >     const int helperAnalWindowSize() { return 1025; }
> >     const int helperAnalHopSize() {return 512;}
> >
> >
> >     //TODO: fix. it runs but produces a broken sinusoidal
> >     void testAnalysisSynthesis() //no segment, no frame just streaming
> inner
> > data
> >     {
> > //        CLAM::ErrAssertionFailed::breakpointInCLAMAssertEnabled =
> true;
> >
> >            unsigned int buffersize = 1024;
> >         int samplerate = 44100;
> >         int frameSize = 2048;
> >
> >         CLAM::Segment aSegment = CLAM::Segment();
> >         std::string filename = std::string(AUDIO_IN_FILE);
> >         LoadSound(filename, aSegment);
> >
> >         aSegment.SetFramesArray(CLAM::List<CLAM::Frame>());
> >         aSegment.SetChildren(CLAM::List<CLAM::Segment>());
> >         aSegment.mCurrentFrameIndex=0;
> >
> >         CLAM::SpectralAnalysisConfig aSpectralAnalysisConfig;
> >         aSpectralAnalysisConfig.SetprHopSize( 256 );
> >         aSpectralAnalysisConfig.SetprZeroPadding( 2 );
> >         aSpectralAnalysisConfig.SetprFFTSize( 2048 );
> >
> >         std::cout << "About to request audio from the segment." <<
> > std::endl;
> >         CLAM::Audio theAudio = aSegment.GetAudio();
> >         std::cout << "Retrieved " << theAudio.GetDuration() << "
> > milliseconds of audio from the segment." << std::endl;
> >
> >         CLAM::SpectralAnalysis aSpectralAnalysis(
> aSpectralAnalysisConfig );
> >         aSpectralAnalysis.Start();
> >         while (aSpectralAnalysis.Do( aSegment )) {}
> >         aSpectralAnalysis.Stop();
> >
> >         CLAM::SDIFOutConfig theSDIFOutConfig;
> >         theSDIFOutConfig.SetEnableFundFreq(false);
> >         theSDIFOutConfig.SetEnablePeakArray(true);
> >         theSDIFOutConfig.SetEnableResidual(true);
> >         theSDIFOutConfig.SetFileName( SDIF_OUT_FILE );
> >         theSDIFOutConfig.SetFrameSize(frameSize);
> >         theSDIFOutConfig.SetSamplingRate(samplerate);
> >         theSDIFOutConfig.SetSpectrumSize(buffersize);
> >         CLAM::SDIFOut theSDIFOut(theSDIFOutConfig);
> >
> >         theSDIFOut.Start();
> >         int nFrames = aSegment.GetnFrames();
> >         for( int i=0; i<nFrames; i++ )
> >         {
> >             theSDIFOut.Do( aSegment.GetFrame( i ) );
> >         }
> >         theSDIFOut.Stop(  );
> >         //myMonoAudioFileReader.Stop();
> >     }
> >
> >     // helper methods for the network tests
> >     const CLAM::SMSAnalysisConfig& helperAnalysisConfigInstance()
> >     {
> >
> >         int analHopSize = 512;
> > //        analHopSize= (resAnalWindowSize-1)/2 ;
> >
> > //        int synthFrameSize = analHopSize;
> >         int analZeroPaddingFactor= 2;
> >
> >         // SMS Analysis configuration
> >         static CLAM::SMSAnalysisConfig analConfig;
> >
> >         analConfig.SetSinWindowSize(helperAnalWindowSize() );
> >         analConfig.SetHopSize(analHopSize);
> > //        analConfig.SetSinWindowType(
> mGlobalConfig.GetAnalysisWindowType
> > ());
> >         analConfig.SetSinZeroPadding(analZeroPaddingFactor);
> >         analConfig.SetResWindowSize( helperResAnalWindowSize() );
> > //        analConfig.SetResWindowType(
> mGlobalConfig.GetResAnalysisWindowType
> > ());
> >
> > //        analConfig.GetPeakDetect().SetMagThreshold(
> > mGlobalConfig.GetAnalysisPeakDetectMagThreshold());
> > //        analConfig.GetPeakDetect().SetMaxFreq(
> > mGlobalConfig.GetAnalysisPeakDetectMaxFreq());
> > //        analConfig.GetSinTracking().SetIsHarmonic(
> > mGlobalConfig.GetAnalysisHarmonic());
> > //        analConfig.GetFundFreqDetect().SetReferenceFundFreq(
> > mGlobalConfig.GetAnalysisReferenceFundFreq());
> > //        analConfig.GetFundFreqDetect().SetLowestFundFreq(
> > mGlobalConfig.GetAnalysisLowestFundFreq());
> > //        analConfig.GetFundFreqDetect().SetHighestFundFreq(
> > mGlobalConfig.GetAnalysisHighestFundFreq());
> >
> >         return analConfig;
> >     }
> >
> >     const CLAM::SMSSynthesisConfig & helperSynthesisConfigInstance()
> >     {
> >         static CLAM::SMSSynthesisConfig synthConfig;
> >         int synthFrameSize = helperAnalHopSize();
> >         synthConfig.SetAnalWindowSize( helperResAnalWindowSize() );
> >         synthConfig.SetFrameSize(synthFrameSize);
> >         synthConfig.SetHopSize(synthFrameSize);
> >         return synthConfig;
> >     }
> >
> >     bool LoadSound(const std::string& filename, CLAM::Segment& segment)
> >     {
> >         CLAM::AudioFileIn myAudioFileIn;
> >         CLAM::AudioFileConfig infilecfg;
> >         infilecfg.SetFilename(filename);
> >         infilecfg.SetFiletype(CLAM::EAudioFileType::eWave);
> >         if(!myAudioFileIn.Configure(infilecfg))
> >         {
> >             std::cout << "Configuration of audio file failed. Does file
> > exist?" << std::endl;
> >             return false;
> >         }
> >
> >
> >
> /////////////////////////////////////////////////////////////////////////////
> >         // Initialization of the processing data objects :
> >         CLAM::TSize fileSize=myAudioFileIn.Size();
> >
> >         int mSamplingRate = int(myAudioFileIn.SampleRate());
> >
> >         // Spectral Segment that will actually hold data
> >         float duration=fileSize/mSamplingRate;
> >         segment.SetEndTime(duration);
> >         segment.SetSamplingRate(mSamplingRate);
> >         segment.mCurrentFrameIndex=0;
> >         segment.GetAudio().SetSize(fileSize);
> >         segment.GetAudio().SetSampleRate(mSamplingRate);
> >
> >
> >         //Read Audio File
> >         myAudioFileIn.Start();
> >         bool response = myAudioFileIn.Do(segment.GetAudio());
> >         myAudioFileIn.Stop();
> >         return true;
> >     }
> >
> > };
> >
> > int main(int argc,char** argv)
> > {
> > //    try
> > //    {
> >
> >         SDIFWriterApp app;
> >         app.testAnalysisSynthesis();
> >         std::cout << "all done" << std::endl;
> > /*
> >     }
> >     catch(Err error)
> >     {
> >         error.Print();
> >         std::cerr << "Abnormal Program Termination" << std::endl;
> >         return -1;
> >     }
> >     catch (std::exception e)
> >     {
> >         std::cout << e.what() << std::endl;
> >         return -1;
> >     }
> > */
> >     return 0;
> > }
> >
>
> _______________________________________________
> Clam-devel mailing list
> Clam-devel at llistes.projectes.lafarga.org
> https://llistes.projectes.lafarga.org/cgi-bin/mailman/listinfo/clam-devel
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.clam-project.org/pipermail/clam-devel-clam-project.org/attachments/20070620/24bf5e1e/attachment-0003.htm>


More information about the clam-devel mailing list