<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Hi,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Thanks one more time, again that was very helpful. I manage to retrieve ROI meta form video frames.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">I have one more question
</span>GstAudioLevelMeta<span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> and
</span>voice_activity Boolean.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">I have simple code with this pipeline<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">pipeline</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = Gst.parse_launch(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"directsoundsrc
 !  </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">\</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">                             level audio-level-meta=true post-messages=false message=false name=elLev !
</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">\</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">                             webrtcdsp name=dsp echo-cancel=false gain-control=false high-pass-filter=false limiter=false noise-suppression=false
 voice-detection=true  voice-detection-likelihood=high  voice-detection-frame-size-ms=10 !
</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">\</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">                             appsink name=sink emit-signals=true"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">appsink</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> =
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">pipeline</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.get_by_name(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"sink"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">appsink</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.connect(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"new-sample"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">,
</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">on_buffer</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">,
</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">None</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">and <o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">def</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">
</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">on_buffer</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">sink</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">:
 GstApp.AppSink, </span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">data</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">:
</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">typ</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">Any</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)
 -> Gst.FlowReturn:<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">   
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">sample</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> =
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">sink</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.emit(</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"pull-sample"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)
  </span><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># Gst.Sample</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">   
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">buffer</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> =
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">sample</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.get_buffer()  </span><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955"># Gst.Buffer</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">   
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">ll</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = GstAudio.buffer_get_audio_level_meta(</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">buffer</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">   
</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">text_file</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">write</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">str</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">ll</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.voice_activity)
 + </span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">'</span><span style="font-size:10.5pt;font-family:Consolas;color:#D7BA7D">\n</span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">'</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">)<o:p></o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"><o:p> </o:p></span></p>
<p class="MsoNormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">   
</span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">return</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> Gst.FlowReturn.OK<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If I use bus message from dsp element to check for voice activity I get correct results more or less. When Im speaking
<b>stream-has-voice </b>is on true and when I stop its  changes to false.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">But if I use audio_level_meta I never get 2 consecutive buffers with
<b>voice_activity </b>set to True.<o:p></o:p></p>
<p class="MsoNormal">If I start speaking I get one buffer with <b>voice_activity </b>
set to True and next one is False and it stays False until I stop speaking and start speaking again then again I get one buffer with True and next one is again False.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Do I miss something here? Or this is expected behavior.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Br,<o:p></o:p></p>
<p class="MsoNormal">Dejan<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Nicolas Dufresne <nicolas@ndufresne.ca>
<br>
<b>Sent:</b> Friday, April 15, 2022 7:54 PM<br>
<b>To:</b> Dejan Cotra <Dejan.Cotra@nttdata.com><br>
<b>Cc:</b> Discussion of the development of and with GStreamer <gstreamer-devel@lists.freedesktop.org><br>
<b>Subject:</b> Re: webrtcdsp voice detection<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Le ven. 15 avr. 2022 08 h 47, Dejan Cotra <<a href="mailto:Dejan.Cotra@nttdata.com">Dejan.Cotra@nttdata.com</a>> a écrit :<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal">Hi Nicolas,<br>
<br>
Thank you that was very helpful. <br>
<br>
I have one similar question. I also play around with facedetect element. I know that I can retrieve information about face from bus message emitted by facedetect element.<br>
<br>
Is there a way to retrieve informations about face from video frame metainfo? Something similar to voice_activity in GstAudioLevelMeta?<o:p></o:p></p>
</blockquote>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I'm currently away from a real computer to check the code, though the "in-band" way is GstVideoRegionOfInterest. ROI are rectangles with a type (a simple string). So facedetect should be adding ROI meta to the frames. <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">A typical use case is to detect these with a pad probe and set a qp-delta (not sure of the name) so that capable encoders can be told to work harder on the details of that rectangle.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">This could also be used for other purposes. Note that ONNX (ML plugins we have) tend to prefer having more shapes then just rectangles, so they have their own meta.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal"><br>
Br,<br>
Dejan<br>
<br>
-----Original Message-----<br>
From: Nicolas Dufresne <<a href="mailto:nicolas@ndufresne.ca" target="_blank">nicolas@ndufresne.ca</a>>
<br>
Sent: Friday, April 8, 2022 3:31 PM<br>
To: Discussion of the development of and with GStreamer <<a href="mailto:gstreamer-devel@lists.freedesktop.org" target="_blank">gstreamer-devel@lists.freedesktop.org</a>><br>
Cc: Dejan Cotra <<a href="mailto:Dejan.Cotra@nttdata.com" target="_blank">Dejan.Cotra@nttdata.com</a>><br>
Subject: Re: webrtcdsp voice detection<br>
<br>
Le vendredi 08 avril 2022 à 11:10 +0000, Dejan Cotra via gstreamer-devel a écrit :<br>
<br>
[...]<br>
>  <br>
> I know that I can retrieve informations from webrtcdsp voice detection <br>
> via bus messages. I receive GST_MESSAGE_ELEMENT message from webrtcdsp <br>
> element with payload like this:<br>
>  <br>
> voice-activity, stream-time=(guint64)2640000000, stream-has- <br>
> voice=(boolean)false;<br>
>  <br>
> Question is can I retrieve informations about voice detection in some <br>
> other way. Like metainfo of each sample that I pull from appsink <br>
> element? Or something similar?<br>
<br>
It also sets the voice_activity boolean in GstAudioLevelMeta (along with the audio amplitude). This is per buffers, not per samples. So you get feedback every 10ms more or less.<br>
<br>
Nicolas<o:p></o:p></p>
</blockquote>
</div>
</div>
</div>
</div>
</body>
</html>