{
  "id": 178961,
  "title": "Simple Mechanical Birdcall Isolation Function",
  "url": "/competitions/birdsong-recognition/discussion/178961",
  "author_name": "Louka Ewington-Pitsos",
  "post_date": "2020-09-01T02:32:35.043000",
  "votes": 5,
  "comment_count": 0,
  "views": 0,
  "content": "<p>A simple function for isolating 5 seconds of audio in a  clip that is slightly more likely than random chance to actually contain a bircall.</p>\n<p>For example, the top is the 5 second segment extracted and the bottom is the whole waveform, with the extracted segment zeroed. Empirically this seems to perform ever so slightly than training on just the first 5 seconds of the clip.</p>\n<p>Interestingly, for most clips any 5 second window taken at random seems to have a pretty high probability of containing a birdcall anyway.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1577010%2F8baa9bc7cbe4f868d0d822493c7fd948%2FScreenshot%20from%202020-09-01%2012-27-22.png?generation=1598927267879812&amp;alt=media\" alt=\"\"></p>\n<pre><code>import random\nimport numpy as np\nimport librosa\nimport matplotlib.pyplot as plt\n\ndef label_events(signal, window_size, step_size, label_fn, offset=None):\n    labels = []\n    transformed = []\n    start = 0\n\n    if offset is not None:\n        start = offset\n        transformed = [0] * offset\n\n    while start + window_size &lt; len(signal):\n        window = signal[start:start+window_size]\n        label = label_fn(window)\n        labels.append({\n            \"start\": start,\n            \"end\": start+window_size,\n            \"value\": label\n        })\n        transformed.extend([label]*step_size)\n        start += step_size\n\n    return labels,  transformed\n\ndef extract_call(signal, sr, window_seconds):\n    ws = []\n    labs = []\n    window = sr * window_seconds\n\n    if window &gt; len(signal):\n        return signal, {\"start\": 0, \"end\": len(signal)-1, \"value\": 0}\n\n\n    for i in range(window_seconds * 3):\n        offset = int(i * sr / 3)\n        labels, tfm = label_events(signal, window, window, lambda sig: np.sum(sig ** 2), offset)\n        labs.extend(labels)\n        ws.append(tfm)\n\n    labs = sorted(labs, key=lambda x: x[\"value\"], reverse=True)\n\n    return signal[labs[0][\"start\"]:labs[0][\"end\"]], labs[0]\n\n# CHANGE THE FILENAME TO AN ACTUAL FILE\ns, sr = librosa.load(\"data/hoard/cbirdcall/wav/XC305136.mp3\", sr=33075)\n_, ax = plt.subplots(2, figsize=(20, 10))\n\nq, lab = extract_call(s, sr, 5)\nax[0].plot(q)\ns[lab[\"start\"]:lab[\"end\"]] = 0\nax[1].plot(s)\n</code></pre>",
  "messages": [
    {
      "id": 993545,
      "postDate": "2020-09-01T02:32:35.043Z",
      "content": "<p>A simple function for isolating 5 seconds of audio in a  clip that is slightly more likely than random chance to actually contain a bircall.</p>\n<p>For example, the top is the 5 second segment extracted and the bottom is the whole waveform, with the extracted segment zeroed. Empirically this seems to perform ever so slightly than training on just the first 5 seconds of the clip.</p>\n<p>Interestingly, for most clips any 5 second window taken at random seems to have a pretty high probability of containing a birdcall anyway.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1577010%2F8baa9bc7cbe4f868d0d822493c7fd948%2FScreenshot%20from%202020-09-01%2012-27-22.png?generation=1598927267879812&amp;alt=media\" alt=\"\"></p>\n<pre><code>import random\nimport numpy as np\nimport librosa\nimport matplotlib.pyplot as plt\n\ndef label_events(signal, window_size, step_size, label_fn, offset=None):\n    labels = []\n    transformed = []\n    start = 0\n\n    if offset is not None:\n        start = offset\n        transformed = [0] * offset\n\n    while start + window_size &lt; len(signal):\n        window = signal[start:start+window_size]\n        label = label_fn(window)\n        labels.append({\n            \"start\": start,\n            \"end\": start+window_size,\n            \"value\": label\n        })\n        transformed.extend([label]*step_size)\n        start += step_size\n\n    return labels,  transformed\n\ndef extract_call(signal, sr, window_seconds):\n    ws = []\n    labs = []\n    window = sr * window_seconds\n\n    if window &gt; len(signal):\n        return signal, {\"start\": 0, \"end\": len(signal)-1, \"value\": 0}\n\n\n    for i in range(window_seconds * 3):\n        offset = int(i * sr / 3)\n        labels, tfm = label_events(signal, window, window, lambda sig: np.sum(sig ** 2), offset)\n        labs.extend(labels)\n        ws.append(tfm)\n\n    labs = sorted(labs, key=lambda x: x[\"value\"], reverse=True)\n\n    return signal[labs[0][\"start\"]:labs[0][\"end\"]], labs[0]\n\n# CHANGE THE FILENAME TO AN ACTUAL FILE\ns, sr = librosa.load(\"data/hoard/cbirdcall/wav/XC305136.mp3\", sr=33075)\n_, ax = plt.subplots(2, figsize=(20, 10))\n\nq, lab = extract_call(s, sr, 5)\nax[0].plot(q)\ns[lab[\"start\"]:lab[\"end\"]] = 0\nax[1].plot(s)\n</code></pre>",
      "rawMarkdown": "A simple function for isolating 5 seconds of audio in a  clip that is slightly more likely than random chance to actually contain a bircall.\n\nFor example, the top is the 5 second segment extracted and the bottom is the whole waveform, with the extracted segment zeroed. Empirically this seems to perform ever so slightly than training on just the first 5 seconds of the clip.\n\nInterestingly, for most clips any 5 second window taken at random seems to have a pretty high probability of containing a birdcall anyway.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1577010%2F8baa9bc7cbe4f868d0d822493c7fd948%2FScreenshot%20from%202020-09-01%2012-27-22.png?generation=1598927267879812&alt=media)\n\n\n\n\n```\nimport random\nimport numpy as np\nimport librosa\nimport matplotlib.pyplot as plt\n\ndef label_events(signal, window_size, step_size, label_fn, offset=None):\n    labels = []\n    transformed = []\n    start = 0\n    \n    if offset is not None:\n        start = offset\n        transformed = [0] * offset\n\n    while start + window_size < len(signal):\n        window = signal[start:start+window_size]\n        label = label_fn(window)\n        labels.append({\n            \"start\": start,\n            \"end\": start+window_size,\n            \"value\": label\n        })\n        transformed.extend([label]*step_size)\n        start += step_size\n        \n    return labels,  transformed\n\ndef extract_call(signal, sr, window_seconds):\n    ws = []\n    labs = []\n    window = sr * window_seconds\n    \n    if window > len(signal):\n        return signal, {\"start\": 0, \"end\": len(signal)-1, \"value\": 0}\n    \n    \n    for i in range(window_seconds * 3):\n        offset = int(i * sr / 3)\n        labels, tfm = label_events(signal, window, window, lambda sig: np.sum(sig ** 2), offset)\n        labs.extend(labels)\n        ws.append(tfm)\n    \n    labs = sorted(labs, key=lambda x: x[\"value\"], reverse=True)\n    \n    return signal[labs[0][\"start\"]:labs[0][\"end\"]], labs[0]\n\n# CHANGE THE FILENAME TO AN ACTUAL FILE\ns, sr = librosa.load(\"data/hoard/cbirdcall/wav/XC305136.mp3\", sr=33075)\n_, ax = plt.subplots(2, figsize=(20, 10))\n\nq, lab = extract_call(s, sr, 5)\nax[0].plot(q)\ns[lab[\"start\"]:lab[\"end\"]] = 0\nax[1].plot(s)\n\n```\n",
      "votes": 5
    }
  ],
  "comments": [],
  "raw_markdown_by_id": {
    "993545": "A simple function for isolating 5 seconds of audio in a  clip that is slightly more likely than random chance to actually contain a bircall.\n\nFor example, the top is the 5 second segment extracted and the bottom is the whole waveform, with the extracted segment zeroed. Empirically this seems to perform ever so slightly than training on just the first 5 seconds of the clip.\n\nInterestingly, for most clips any 5 second window taken at random seems to have a pretty high probability of containing a birdcall anyway.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-forum-message-attachments/o/inbox%2F1577010%2F8baa9bc7cbe4f868d0d822493c7fd948%2FScreenshot%20from%202020-09-01%2012-27-22.png?generation=1598927267879812&alt=media)\n\n\n\n\n```\nimport random\nimport numpy as np\nimport librosa\nimport matplotlib.pyplot as plt\n\ndef label_events(signal, window_size, step_size, label_fn, offset=None):\n    labels = []\n    transformed = []\n    start = 0\n    \n    if offset is not None:\n        start = offset\n        transformed = [0] * offset\n\n    while start + window_size < len(signal):\n        window = signal[start:start+window_size]\n        label = label_fn(window)\n        labels.append({\n            \"start\": start,\n            \"end\": start+window_size,\n            \"value\": label\n        })\n        transformed.extend([label]*step_size)\n        start += step_size\n        \n    return labels,  transformed\n\ndef extract_call(signal, sr, window_seconds):\n    ws = []\n    labs = []\n    window = sr * window_seconds\n    \n    if window > len(signal):\n        return signal, {\"start\": 0, \"end\": len(signal)-1, \"value\": 0}\n    \n    \n    for i in range(window_seconds * 3):\n        offset = int(i * sr / 3)\n        labels, tfm = label_events(signal, window, window, lambda sig: np.sum(sig ** 2), offset)\n        labs.extend(labels)\n        ws.append(tfm)\n    \n    labs = sorted(labs, key=lambda x: x[\"value\"], reverse=True)\n    \n    return signal[labs[0][\"start\"]:labs[0][\"end\"]], labs[0]\n\n# CHANGE THE FILENAME TO AN ACTUAL FILE\ns, sr = librosa.load(\"data/hoard/cbirdcall/wav/XC305136.mp3\", sr=33075)\n_, ax = plt.subplots(2, figsize=(20, 10))\n\nq, lab = extract_call(s, sr, 5)\nax[0].plot(q)\ns[lab[\"start\"]:lab[\"end\"]] = 0\nax[1].plot(s)\n\n```\n"
  }
}