<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shriphani Palakodety &#187; DSP</title>
	<atom:link href="http://shriphani.com/blog/category/dsp/feed/" rel="self" type="application/rss+xml" />
	<link>http://shriphani.com/blog</link>
	<description>In Pursuit Of Truth and Beauty</description>
	<lastBuildDate>Thu, 17 May 2012 17:59:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>More Updates to Listener</title>
		<link>http://shriphani.com/blog/2010/11/14/more-updates-to-listener/</link>
		<comments>http://shriphani.com/blog/2010/11/14/more-updates-to-listener/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 02:04:15 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=748</guid>
		<description><![CDATA[One of the rather irritating problems I was facing with Listener was that I had to set the intensity threshold for an alert manually (which is rather stupid). So I added a couple of lines that set the intensity threshold to what the average intensity of the surroundings currently is. So I no longer have [...]]]></description>
			<content:encoded><![CDATA[<p>One of the rather irritating problems I was facing with<a href="http://github.org/shriphani/listener" target="_blank"> Listener</a> was that I had to set the intensity threshold for an alert manually (which is rather stupid). So I added a couple of lines that set the intensity threshold to what the average intensity of the surroundings currently is. So I no longer have to calibrate my app to fire alerts at the right intensity.</p>
<p>Besides this, Microsoft interview on Tuesday, thanksgiving break and finals approaching fast etc. etc. Whatever.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2010/11/14/more-updates-to-listener/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Listener Gets Another VAD</title>
		<link>http://shriphani.com/blog/2010/08/09/listener-gets-another-vad/</link>
		<comments>http://shriphani.com/blog/2010/08/09/listener-gets-another-vad/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 23:46:49 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA["voice activity detection"]]></category>
		<category><![CDATA["voice"]]></category>
		<category><![CDATA[Listener]]></category>
		<category><![CDATA[VAD]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=631</guid>
		<description><![CDATA[A list of additions to Listener. The additions include a new Voice Activity Detection algorithm.]]></description>
			<content:encoded><![CDATA[<p>Over this summer, I wanted to make <a href="http://shriphani.com/blog/Listener" target="_blank">Listener</a> Python only (there was a ton of needless applescript) and since my work @ VACCINE [<a href="http://www.purdue.edu/discoverypark/vaccine/" target="_blank">VACCINE homepage</a>] (more on this in a new post) didn&#8217;t leave much time for tinkering with things, I had to push this back as much as I could. I also added another voice activity detection algorithm which I believe works a lot better than what I had previously. And I also moved my project over to GITHUB.</p>
<p>The additions to Listener:</p>
<ul>
<li>A new Voice Activity Detection algorithm <a href="http://www.eurasip.org/proceedings/eusipco/eusipco2009/contents/papers/1569192958.pdf" target="_blank">[ link to pdf by Moattar and Homayounpour]</a>.</li>
<li>Skype4Py is still buggy on OS X with Python2.5 and it takes a nice solid dump (segfault) with Python2.6 so I am sure if the Skype part of the code works.</li>
<li>Python only. I removed the applescript portion from my code.</li>
</ul>
<p>I have moved the entire code over to github: <a href="http://github.com/shriphani/Listener/">http://github.com/shriphani/Listener/</a> . The VAD algorithms can be seen in the file <a href="http://github.com/shriphani/Listener/blob/master/VAD.py" target="_blank">VAD.py</a>.</p>
<p>This VAD also works by starting off with a base threshold for energy, power and an attribute called Spectral Flatness Measure. Luckily the paper had pseudocode so my DSP n00bishness wouldn&#8217;t get in the way of progress.</p>
<p>Anyway, to get this version of Listener running, download <a href="http://github.com/downloads/shriphani/Listener/Listener.tar" target="_blank">Listener.tar</a> , untar it and run:</p>
<pre>python2.5 audio_analysis.py</pre>
<p>And you should be all set.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2010/08/09/listener-gets-another-vad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Listener Gets a VAD</title>
		<link>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/</link>
		<comments>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 01:15:23 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=419</guid>
		<description><![CDATA[So, the beginning of the 4th semester in the midst of losers and overachievers and this sem promises to set my a$$ on fire. As usual, I plan to continue working under Dr. Kihara this sem so that should be interesting. Anyway, I decided to improve upon what listener offered and decided to add a [...]]]></description>
			<content:encoded><![CDATA[<p>So, the beginning of the 4th semester in the midst of losers and overachievers and this sem promises to set my a$$ on fire. As usual, I plan to continue working under Dr. Kihara this sem so that should be interesting. Anyway, I decided to improve upon what listener offered and decided to add a VAD algorithm to it. I initially chose the algorithm by moattar and homayounpur and decided that I ended up with too much to do (it might certainly be a good candidate for later, when I have more time for example). Hence, I decided to snoop around for something simpler and found this paper which seemed small and had a sort of ever changing threshold for successive frames. The paper was authored by S.Milanovic, Z. Lukac and A. Domazetovic. I still don&#8217;t think I got it exactly right though. The paper mentioned that they used counters to mark frames as silence based on what the previous frame was and I had to come with a counter upper bound for myself and finally chose to go with 10 as a good counter for such stuff. i.e. even if a particular frame doesn&#8217;t make it beyond its threshold, it still will be marked as active if the previous frame was active. This is done to accommodate situations where we end up reducing our volume at the end of a word / sentence.</p>
<p>Finally to decide whether there was speech on an overall level, I look for at least 3 instances of 18 consecutive frames being marked as active (just random picks, 18 frames allows 8 active frames and 10 additional for the counter we have and 3 looked like a good candidate at the end when I spoke my own name out).</p>
<p>And as a final measure, I also ensure that the overall intensity beats 48 dB so that someone trying to have a conversation with me is only recognized.</p>
<p>Finally, I made the switch from GeekTool to Growl as this thing kept taking a solid amount of real estate and since I have one 23&#8221; monitor and a 15&#8221; monitor, this thing is positioned outside the real estate of my laptop&#8217;s display. Growl seems like a better candidate overall and since I could get growl bindings to build on my machine finally, I think I should let growl handle this.</p>
<p>So, the only places where my VAD implementation (or my mod of whatever was in that paper) doesn&#8217;t seem to work is in surroundings with a piano (in our dorm&#8217;s lobby for example), v inconvenient but whatever, probably some time in the future, I will begin understanding DSP and spectral analysis well enough to come up with a simple VAD algorithm (as opposed to implementing something straight from a paper without any understanding of what is going on). Anyway, here is the updated script, it seems to do well recognizing speech in sort of silent settings:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="co1">#!/usr/bin/env python</span><br />
<span class="co1">#Author: Shriphani Palakodety</span><br />
<span class="co1">#Tool to aid those with noise cancellation headphones</span></p>
<p><span class="kw1">import</span> pyaudio<br />
<span class="kw1">import</span> <span class="kw3">wave</span><br />
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">import</span> <span class="kw3">struct</span><br />
<span class="kw1">import</span> numpy<br />
<span class="kw1">import</span> <span class="kw3">time</span></p>
<p>Growl_exists = <span class="kw2">True</span></p>
<p><span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">import</span> Growl<br />
<span class="kw1">except</span> <span class="kw2">ImportError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;No Growl&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Growl_exists = <span class="kw2">False</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">pass</span></p>
<p>skype_on_call = <span class="kw2">False</span><br />
notifier = <span class="nu0">0</span><br />
<span class="kw1">if</span> Growl_exists:<br />
&nbsp; &nbsp; &nbsp; &nbsp; notifier = Growl.<span class="me1">GrowlNotifier</span><span class="br0">&#40;</span><span class="st0">&#8216;Listener&#8217;</span>, &nbsp;<span class="br0">&#91;</span><span class="st0">&#8216;Attention&#8217;</span>, <span class="st0">&#8216;test&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#notifier.applicationName = &#8216;Listener&#8217;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; notifier.<span class="me1">register</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> record<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Records Input From Microphone Using PyAudio&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; duration = <span class="nu0">3</span> <span class="co1">#record for 1 second. Pretty long duration don&#8217;t you think</span><br />
&nbsp; &nbsp; outfile = <span class="st0">&quot;analysis.wav&quot;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; p = pyaudio.<span class="me1">PyAudio</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; inStream = p.<span class="kw2">open</span><span class="br0">&#40;</span>format=pyaudio.<span class="me1">paInt16</span>, channels=<span class="nu0">1</span>, rate=<span class="nu0">44100</span>,<span class="kw2">input</span>=<span class="kw2">True</span>, frames_per_buffer=<span class="nu0">1024</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; out = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; upper_lim = <span class="nu0">44100</span> / <span class="nu0">1024</span> * duration <span class="co1">#upper limit of the range we record to. 44100 / 1024 sized chunk * 5 seconds</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">0</span>, upper_lim<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; data = inStream.<span class="me1">read</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; out.<span class="me1">append</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">#now the writing section where we write to file</span><br />
&nbsp; &nbsp; data = <span class="st0">&#8221;</span>.<span class="me1">join</span><span class="br0">&#40;</span>out<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span>outfile, <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setnchannels</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setsampwidth</span><span class="br0">&#40;</span>p.<span class="me1">get_sample_size</span><span class="br0">&#40;</span>pyaudio.<span class="me1">paInt16</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">setframerate</span><span class="br0">&#40;</span><span class="nu0">44100</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">writeframes</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; outFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; analyze<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p>
<span class="kw1">def</span> analyze<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">if</span> skype_on_call:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;<span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Skype Call In Progress&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Listener On Hold&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><br />
&nbsp; &nbsp; inFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;analysis.wav&quot;</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span> <span class="co1">#open a wav file in read mode</span><br />
&nbsp; &nbsp; thresh = <span class="nu0">1000</span> &nbsp;<span class="co1">#establish a minimum threshold</span><br />
&nbsp; &nbsp; max_samp = <span class="nu0">0</span>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; decision = <span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#for i in xrange(441):</span></p>
<p>&nbsp; &nbsp; inactive_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; vals = inFile.<span class="me1">readframes</span><span class="br0">&#40;</span>inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="co1">#read in 30 samples</span><br />
&nbsp; &nbsp; <span class="kw2">len</span><span class="br0">&#40;</span>vals<span class="br0">&#41;</span><br />
&nbsp; &nbsp; results = <span class="kw3">struct</span>.<span class="me1">unpack</span><span class="br0">&#40;</span><span class="st0">&quot;%dh&quot;</span>%<span class="br0">&#40;</span>inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, vals<span class="br0">&#41;</span> &nbsp;<span class="co1">#unpack to get the samples</span><br />
&nbsp; &nbsp; results = <span class="br0">&#91;</span><span class="kw2">abs</span><span class="br0">&#40;</span>x<span class="br0">&#41;</span> <span class="kw1">for</span> x <span class="kw1">in</span> results<span class="br0">&#93;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">#now we need to pull 30 samples at a time (30 samples = 1 frame).</span></p>
<p>&nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">4404</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; frame = results<span class="br0">&#91;</span><span class="nu0">30</span>*i: <span class="nu0">30</span>*<span class="br0">&#40;</span>i<span class="nu0">+1</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> frame<br />
&nbsp; &nbsp; &nbsp; &nbsp; new_thresh = <span class="br0">&#40;</span>thresh * <span class="br0">&#40;</span><span class="nu0">1</span> &#8211; <span class="br0">&#40;</span><span class="nu0">2.0</span> ** <span class="nu0">-7</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &nbsp;+ &nbsp;<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="nu0">2</span> ** <span class="nu0">-8</span><span class="br0">&#41;</span> * max_samp<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#check how many samples go above this new threshold</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; count = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> frame:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> j &gt; new_thresh:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> count / <span class="nu0">30.0</span> &gt;= <span class="nu0">0.9</span> : &nbsp; <span class="co1">#need it to beat 90%</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#frame is a candidate for speech</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#this is where we use a counter based implementation for labelling inactiveness</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> inactive_counter &lt; <span class="nu0">10</span> <span class="kw1">and</span> decision<span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span> == <span class="nu0">1</span>: <span class="co1">#we ignore silence for 10 runs</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inactive_counter += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; inactive_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; decision.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#update the threshold and the max sample values</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; thresh = new_thresh<br />
&nbsp; &nbsp; &nbsp; &nbsp; max_samp = <span class="kw2">max</span><span class="br0">&#40;</span>frame<span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="co1">#final check for characterization as speech, we use another counter</span><br />
&nbsp; &nbsp; active_counter = <span class="nu0">0</span> <span class="co1">#since the inactive counter will cause silence to be recognized as speech, we only consider speech as </span><br />
&nbsp; &nbsp; <span class="kw1">print</span> decision<br />
&nbsp; &nbsp; final_num = <span class="nu0">0</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> val <span class="kw1">in</span> decision:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> active_counter &gt;= <span class="nu0">18</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Speech!&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final_num += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> val == <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; active_counter = <span class="nu0">0</span></p>
<p>&nbsp; &nbsp; results = <span class="br0">&#91;</span>x ** <span class="nu0">2</span> <span class="kw1">for</span> x <span class="kw1">in</span> results<span class="br0">&#93;</span><br />
&nbsp; &nbsp; intensity = <span class="nu0">20</span> * numpy.<span class="me1">log10</span><span class="br0">&#40;</span>numpy.<span class="me1">sqrt</span><span class="br0">&#40;</span><span class="kw2">sum</span><span class="br0">&#40;</span>results<span class="br0">&#41;</span>/inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">if</span> final_num &gt;= <span class="nu0">3</span> <span class="kw1">and</span> intensity &gt; <span class="nu0">48</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> Growl_exists:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notifier.<span class="me1">notify</span><span class="br0">&#40;</span><span class="st0">&#8216;Attention&#8217;</span>,<span class="st0">&#8216;Listener&#8217;</span>, <span class="st0">&#8216;Speech Detected Nearby&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Speech Detected Nearby!<span class="es0">\n</span>Someone might be calling you&quot;</span><br />
&nbsp; &nbsp; inFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">if</span> __name__ == <span class="st0">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; f = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&quot;skype_Status&quot;</span>, <span class="st0">&quot;r&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> new_line <span class="kw1">in</span> f:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> new_line == <span class="st0">&quot;PROGRESS&quot;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; skype_on_call = <span class="kw2">True</span></p>
<p>&nbsp; &nbsp; <span class="kw1">if</span> skype_on_call:<br />
&nbsp; &nbsp; &nbsp; &nbsp; analyze<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; record<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p> Anyway, it would be really convenient if I could find something about VAD algorithms and improve listener to work better for my dorm room settings. It is doing a pretty good job already but there is always scope for improvement.</p>
<p>As always, my solutions need to be convoluted and over here, I make use of applescript to check if there&#8217;s a skype call going on or not, so yeah, you can find all that <a href="http://shriphani.com/scripts/listener">here</a>.</p>
<p>Screenshots etc available on Listener&#8217;s new home: <a href="http://shriphani.com/blog/listener/">http://shriphani.com/blog/listener/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2010/01/21/listener-gets-a-vad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>First DSP Attempts</title>
		<link>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/</link>
		<comments>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 13:51:02 +0000</pubDate>
		<dc:creator>Shriphani</dc:creator>
				<category><![CDATA[DSP]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://shriphani.com/blog/?p=349</guid>
		<description><![CDATA[Well, since my last post on detecting calls of attention using my microphone, I have been paying attention to DSP since it seems to be one cool topic to spend 3 months on. So, I decided to begin reading the dspguide and found some cool stuff which I decided to tinker with. After reading about [...]]]></description>
			<content:encoded><![CDATA[<p>Well, since my last post on detecting calls of attention using my microphone, I have been paying attention to DSP since it seems to be one cool topic to spend 3 months on. So, I decided to begin reading the <a href="http://www.dspguide.com/">dspguide</a> and found some cool stuff which I decided to tinker with. After reading about convolution, I decided to implement some basic filters that would help me amplify, add echoes and so on. First, implementations of convolution, the input side algorithm and the output side algorithm:</p>
<p><strong>The input side algorithm:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; len_out_signal = <span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span>+<span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="nu0">-1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; output_signal = <span class="br0">&#91;</span><span class="nu0">0</span> <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal<span class="br0">&#91;</span>i+j<span class="br0">&#93;</span> = output_signal<span class="br0">&#91;</span>i+j<span class="br0">&#93;</span> + input_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span>*impulse_response<span class="br0">&#91;</span>j<span class="br0">&#93;</span><br />
&nbsp;</div>
</p>
<p><strong>The output side algorithm:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> convolute_outside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; len_out_signal = <span class="kw2">len</span><span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span>+<span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="nu0">-1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal.<span class="me1">append</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span>len_out_signal<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> j <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print i, j</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> <span class="br0">&#40;</span>i-j<span class="br0">&#41;</span>&lt;<span class="nu0">0</span> <span class="kw1">and</span> <span class="kw1">not</span> <span class="br0">&#40;</span>i-j<span class="br0">&#41;</span>&gt;len<span class="br0">&#40;</span>input_signal<span class="br0">&#41;</span><span class="nu0">-1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span> += impulse_response<span class="br0">&#91;</span>j<span class="br0">&#93;</span> * input_signal<span class="br0">&#91;</span>i-j<span class="br0">&#93;</span></p>
<p>&nbsp;</p></div>
</p>
<p>Next, using appropriate filters, we can add echoes and amplify the input signal. So, we first need to read in a wav file. Using my previous script, that should be simple:<br />
<strong>Reading a wav file:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> readWavFile<span class="br0">&#40;</span><span class="kw2">input</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; inFile = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span><span class="kw2">input</span>, <span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sample_rate = inFile.<span class="me1">getframerate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; total_samples = inFile.<span class="me1">getnframes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; vals = inFile.<span class="me1">readframes</span><span class="br0">&#40;</span>total_samples<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; inFile.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">struct</span>.<span class="me1">unpack</span><span class="br0">&#40;</span><span class="st0">&quot;%dh&quot;</span>%<span class="br0">&#40;</span>total_samples<span class="br0">&#41;</span>, vals<span class="br0">&#41;</span><br />
&nbsp;</div>
</p>
<p>This next function adds an echo to the input signal:<br />
<strong>Add an echo:</strong></p>
<p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> add_echo<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Amounts to scaling and shifting the delta function and then adding it to a delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#considering the intensity of the echo to be 60% of that of the original signal and delayed by 1000 samples:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">0</span> <span class="kw1">for</span> x <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">1003</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="co1">#shifted and scaled delta function + delta function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response<span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span> = <span class="nu0">0.6</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span></p>
<p>&nbsp;</p></div>
</p>
<p>The above function considers that an echo occurs a 1000 samples after the current one and with an intensity 6 tenths of the original signal. Since testing this becomes a serious pain, I decided to test my echo function using a different input signal and impulse response (echo is 6/10 of the original intensity and 4 samples away). </p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> add_new_echo<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Amounts to scaling and shifting the delta function and then adding it to a delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#considering the intensity of the echo to be 60% of that of the original signal and delayed by 4 samples:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">0.6</span><span class="br0">&#93;</span> <span class="co1">#shifted and scaled delta function + delta function</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span></p>
<p>input_signal = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#93;</span><br />
<span class="co1">#print input_signal</span><br />
add_new_echo<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> output_signal<br />
&nbsp;</div>
<p>The output of this is:</p>
<pre>
mouse-den% python convolution.py
[1, 2, 3, 4, 0.59999999999999998, 1.2, 1.7999999999999998, 2.3999999999999999]
</pre>
<p>The impulse response for amplifying a signal would be a scaled delta function, so:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> amplify<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Make the impulse function a scaled delta function&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_inside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><br />
&nbsp;</div>
<p>The code to write to a wave file should be pretty straightforward:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> writeWavFile<span class="br0">&#40;</span>out<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream = <span class="kw3">wave</span>.<span class="kw2">open</span><span class="br0">&#40;</span>out, <span class="st0">&quot;wb&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setnchannels</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setsampwidth</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">setframerate</span><span class="br0">&#40;</span><span class="nu0">44100</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data = <span class="st0">&quot;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data += <span class="kw3">struct</span>.<span class="me1">pack</span><span class="br0">&#40;</span><span class="st0">&#8216;h&#8217;</span>, output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">writeframes</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; outStream.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>So, here is the test wave file: <a href='http://shriphani.com/blog/wp-content/uploads/2009/06/test.wav'>test.wav</a></p>
<p>And the amplified wav file: <a href='http://shriphani.com/blog/wp-content/uploads/2009/06/output1.wav'>output1.wav</a></p>
<p>Now, to the part where we try to figure out if a signal contains another signal.</p>
<p>Turns out, to do that, you just need to obtain the cross-correlation of the input signal and the waveform we already have.</p>
<p>So, the code to do this for a signal that goes like [1,2,3,4] is:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">def</span> cross_correlate<span class="br0">&#40;</span>input_file=<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8221;</span><span class="st0">&#8216;Cross correlate, obtain the graph and find the peak&#8217;</span><span class="st0">&#8221;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> input_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">global</span> output_signal<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#input_signal = record() #this procedure reads in the signal we need to find</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; input_signal = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span>,<span class="nu0">11</span>,<span class="nu0">0</span>,<span class="nu0">0</span>,<span class="nu0">1</span>,<span class="nu0">10</span>,<span class="nu0">5</span>,<span class="nu0">2</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response = <span class="br0">&#91;</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span><span class="br0">&#93;</span> <span class="co1">#read in our signal</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; impulse_response.<span class="me1">reverse</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; convolute_outside<span class="br0">&#40;</span>impulse_response<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> output_signal<br />
&nbsp;</div>
<p>This results in a signal that looks like:</p>
<pre>[4, 11, 20, 30, 64, 44, 26, 15, 43, 52, 44, 26, 9, 2]</pre>
<p>So, I had to figure out an algorithm to detect the peak and I found one on stackoverflow.com and it goes like this:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">xrange</span><span class="br0">&#40;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; travel = output_signal<span class="br0">&#91;</span>i<span class="nu0">+1</span><span class="br0">&#93;</span> &#8211; output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rise = output_signal<span class="br0">&#91;</span><span class="kw2">len</span><span class="br0">&#40;</span>output_signal<span class="br0">&#41;</span><span class="nu0">-1</span><span class="br0">&#93;</span> &#8211; output_signal<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>travel/rise<span class="br0">&#41;</span> &gt; <span class="nu0">1</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">#print output_signal[i]</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; peak_options<span class="br0">&#91;</span>output_signal<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#93;</span>=i</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> peak_options<span class="br0">&#91;</span><span class="kw2">max</span><span class="br0">&#40;</span>peak_options.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>&nbsp; &nbsp;<br />
&nbsp;</div>
<p>In other news, I am going to work in Prof. Kihara&#8217;s bio-informatics laboratory this fall and I hope it works out.</p>
]]></content:encoded>
			<wfw:commentRss>http://shriphani.com/blog/2009/06/26/first-dsp-attempts/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://shriphani.com/blog/wp-content/uploads/2009/06/test.wav" length="117292" type="audio/x-wav" />
<enclosure url="http://shriphani.com/blog/wp-content/uploads/2009/06/output1.wav" length="117292" type="audio/x-wav" />
		</item>
	</channel>
</rss>

