{
  "id": 161686,
  "title": "How to convert melspectorgram to 3D array (Image) ",
  "url": "/competitions/birdsong-recognition/discussion/161686",
  "author_name": "Neo",
  "post_date": "2020-06-25T18:37:52.057000",
  "votes": 0,
  "comment_count": 4,
  "views": 0,
  "content": "<p>This is my first audio classification competition and  I am trying to convert librosa melspectrogram to image array (3D) </p>\n\n<pre><code>def extract_features(file_name, sample_rate = 44100, as_mono = True , preemphasis = 0.95):\n\n    sig, rate = librosa.load(file_name, sr = sample_rate, res_type='kaiser_fast') \n\n    SHAPE = (128, 256) #(heigt, width) in pixels\n\n    #Mel-spectrogram\n    SAMPLE_RATE = rate\n    N_FFT = SHAPE[0] * 8 # window length         \n    N_MELS = SHAPE[0]\n    HOP_LEN = len(sig) // (SHAPE[1] - 1)\n    #print(f'hop len = {HOP_LEN}')\n    FMIN = 500\n    FMAX = 15000\n    # Preemphasis as in python_speech_features by James Lyons\n    if preemphasis:\n        sig = np.append(sig[0], sig[1:] - preemphasis * sig[:-1])\n    #Librosa mel-spectrum\n    melspec = librosa.feature.melspectrogram(y=sig, sr=SAMPLE_RATE, \n                                   hop_length = HOP_LEN,\n                                  n_mels = N_MELS,\n                                  fmax = FMAX, fmin = FMIN,\n                                  power = 1.0\n                                  )\n\n    #Convert power spec to db Scale\n    melspec = librosa.amplitude_to_db(melspec, ref=np.max , top_db = 80)\n\n\n    #Trim to desired shape \n    melspec = melspec[:SHAPE[0], :SHAPE[1]]\n\n\n    return melspec.astype('float32')`  \n</code></pre>\n\n<p>the above function returns shape(128 , 256),  when I try convert to 3D image array using:\n<code>from PIL import Image <br>\n    mel = extract_features('../input/birdsong-recognition/train_audio/aldfly/XC134874.mp3')\n    mel = Image.fromarray(mel)</code></p>\n\n<p>It returns blank image:</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fdec7edaf1ada541139d57c35e7d0672c%2Fkaggle.png?generation=1593110024594644&amp;alt=media\" alt=\"\"></p>\n\n<p>Edit: Got it working.  Read this kaggle <a href=\"https://www.kaggle.com/daisukelab/cnn-2d-basic-solution-powered-by-fast-ai\">Notebook</a>: \n```\ndef mono_to_color(X, mean=None, std=None, norm_max=None, norm_min=None, eps=1e-6):\n    # Stack X as [X,X,X]\n    X = np.stack([X, X, X], axis=-1)</p>\n\n<pre><code># Standardize\nmean = mean or X.mean()\nstd = std or X.std()\nXstd = (X - mean) / (std + eps)\n_min, _max = Xstd.min(), Xstd.max()\nnorm_max = norm_max or _max\nnorm_min = norm_min or _min\nif (_max - _min) &gt; eps:\n    # Scale to [0, 255]\n    V = Xstd\n    V[V &lt; norm_min] = norm_min\n    V[V &gt; norm_max] = norm_max\n    V = 255 * (V - norm_min) / (norm_max - norm_min)\n    V = V.astype(np.uint8)\nelse:\n    # Just zero\n    V = np.zeros_like(Xstd, dtype=np.uint8)\nreturn V\n</code></pre>\n\n<p>```\nResult:\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fbd474e5261ff59e21f063fd548b8ae23%2FAnnotation%202020-07-02%20142202.png?generation=1593680019098131&amp;alt=media\" alt=\"\"></p>",
  "messages": [
    {
      "id": 904627,
      "postDate": "2020-06-27T19:17:25.367Z",
      "content": "<p>Do this : \nmel_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=n_mels, hop_length=hop_length, fmin=fmin, fmax=fmax)</p>\n\n<p>mel_db = librosa.<strong>power_to_db</strong>(mel_spec)</p>",
      "rawMarkdown": "Do this : \nmel\\_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n\\_mels=n\\_mels, hop\\_length=hop\\_length, fmin=fmin, fmax=fmax)\n\nmel\\_db = librosa.**power\\_to\\_db**(mel\\_spec)",
      "replies": [
        {
          "id": 912126,
          "postDate": "2020-07-02T08:44:51.653Z",
          "content": "<p>Thanks for replying, but got the same result.</p>",
          "rawMarkdown": "Thanks for replying, but got the same result."
        }
      ]
    },
    {
      "id": 901852,
      "postDate": "2020-06-25T18:37:52.057Z",
      "content": "<p>This is my first audio classification competition and  I am trying to convert librosa melspectrogram to image array (3D) </p>\n\n<pre><code>def extract_features(file_name, sample_rate = 44100, as_mono = True , preemphasis = 0.95):\n\n    sig, rate = librosa.load(file_name, sr = sample_rate, res_type='kaiser_fast') \n\n    SHAPE = (128, 256) #(heigt, width) in pixels\n\n    #Mel-spectrogram\n    SAMPLE_RATE = rate\n    N_FFT = SHAPE[0] * 8 # window length         \n    N_MELS = SHAPE[0]\n    HOP_LEN = len(sig) // (SHAPE[1] - 1)\n    #print(f'hop len = {HOP_LEN}')\n    FMIN = 500\n    FMAX = 15000\n    # Preemphasis as in python_speech_features by James Lyons\n    if preemphasis:\n        sig = np.append(sig[0], sig[1:] - preemphasis * sig[:-1])\n    #Librosa mel-spectrum\n    melspec = librosa.feature.melspectrogram(y=sig, sr=SAMPLE_RATE, \n                                   hop_length = HOP_LEN,\n                                  n_mels = N_MELS,\n                                  fmax = FMAX, fmin = FMIN,\n                                  power = 1.0\n                                  )\n\n    #Convert power spec to db Scale\n    melspec = librosa.amplitude_to_db(melspec, ref=np.max , top_db = 80)\n\n\n    #Trim to desired shape \n    melspec = melspec[:SHAPE[0], :SHAPE[1]]\n\n\n    return melspec.astype('float32')`  \n</code></pre>\n\n<p>the above function returns shape(128 , 256),  when I try convert to 3D image array using:\n<code>from PIL import Image <br>\n    mel = extract_features('../input/birdsong-recognition/train_audio/aldfly/XC134874.mp3')\n    mel = Image.fromarray(mel)</code></p>\n\n<p>It returns blank image:</p>\n\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fdec7edaf1ada541139d57c35e7d0672c%2Fkaggle.png?generation=1593110024594644&amp;alt=media\" alt=\"\"></p>\n\n<p>Edit: Got it working.  Read this kaggle <a href=\"https://www.kaggle.com/daisukelab/cnn-2d-basic-solution-powered-by-fast-ai\">Notebook</a>: \n```\ndef mono_to_color(X, mean=None, std=None, norm_max=None, norm_min=None, eps=1e-6):\n    # Stack X as [X,X,X]\n    X = np.stack([X, X, X], axis=-1)</p>\n\n<pre><code># Standardize\nmean = mean or X.mean()\nstd = std or X.std()\nXstd = (X - mean) / (std + eps)\n_min, _max = Xstd.min(), Xstd.max()\nnorm_max = norm_max or _max\nnorm_min = norm_min or _min\nif (_max - _min) &gt; eps:\n    # Scale to [0, 255]\n    V = Xstd\n    V[V &lt; norm_min] = norm_min\n    V[V &gt; norm_max] = norm_max\n    V = 255 * (V - norm_min) / (norm_max - norm_min)\n    V = V.astype(np.uint8)\nelse:\n    # Just zero\n    V = np.zeros_like(Xstd, dtype=np.uint8)\nreturn V\n</code></pre>\n\n<p>```\nResult:\n<img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fbd474e5261ff59e21f063fd548b8ae23%2FAnnotation%202020-07-02%20142202.png?generation=1593680019098131&amp;alt=media\" alt=\"\"></p>",
      "rawMarkdown": "This is my first audio classification competition and  I am trying to convert librosa melspectrogram to image array (3D) \n    \n    def extract_features(file_name, sample_rate = 44100, as_mono = True , preemphasis = 0.95):\n        \n        sig, rate = librosa.load(file_name, sr = sample_rate, res_type='kaiser_fast') \n        \n        SHAPE = (128, 256) #(heigt, width) in pixels\n\n        #Mel-spectrogram\n        SAMPLE_RATE = rate\n        N_FFT = SHAPE[0] * 8 # window length         \n        N_MELS = SHAPE[0]\n        HOP_LEN = len(sig) // (SHAPE[1] - 1)\n        #print(f'hop len = {HOP_LEN}')\n        FMIN = 500\n        FMAX = 15000\n        # Preemphasis as in python_speech_features by James Lyons\n        if preemphasis:\n            sig = np.append(sig[0], sig[1:] - preemphasis * sig[:-1])\n        #Librosa mel-spectrum\n        melspec = librosa.feature.melspectrogram(y=sig, sr=SAMPLE_RATE, \n                                       hop_length = HOP_LEN,\n                                      n_mels = N_MELS,\n                                      fmax = FMAX, fmin = FMIN,\n                                      power = 1.0\n                                      )\n        \n        #Convert power spec to db Scale\n        melspec = librosa.amplitude_to_db(melspec, ref=np.max , top_db = 80)\n        \n               \n        #Trim to desired shape \n        melspec = melspec[:SHAPE[0], :SHAPE[1]]\n        \n          \n        return melspec.astype('float32')`  \n\nthe above function returns shape(128 , 256),  when I try convert to 3D image array using:\n` from PIL import Image                                                                                                                      \n    mel = extract_features('../input/birdsong-recognition/train_audio/aldfly/XC134874.mp3')\n    mel = Image.fromarray(mel)`\n\nIt returns blank image:\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fdec7edaf1ada541139d57c35e7d0672c%2Fkaggle.png?generation=1593110024594644&amp;alt=media)\n \n\n\nEdit: Got it working.  Read this kaggle [Notebook](https://www.kaggle.com/daisukelab/cnn-2d-basic-solution-powered-by-fast-ai): \n```\ndef mono_to_color(X, mean=None, std=None, norm_max=None, norm_min=None, eps=1e-6):\n    # Stack X as [X,X,X]\n    X = np.stack([X, X, X], axis=-1)\n\n    # Standardize\n    mean = mean or X.mean()\n    std = std or X.std()\n    Xstd = (X - mean) / (std + eps)\n    _min, _max = Xstd.min(), Xstd.max()\n    norm_max = norm_max or _max\n    norm_min = norm_min or _min\n    if (_max - _min) &gt; eps:\n        # Scale to [0, 255]\n        V = Xstd\n        V[V &lt; norm_min] = norm_min\n        V[V &gt; norm_max] = norm_max\n        V = 255 * (V - norm_min) / (norm_max - norm_min)\n        V = V.astype(np.uint8)\n    else:\n        # Just zero\n        V = np.zeros_like(Xstd, dtype=np.uint8)\n    return V\n```\nResult:\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fbd474e5261ff59e21f063fd548b8ae23%2FAnnotation%202020-07-02%20142202.png?generation=1593680019098131&amp;alt=media)\n"
    },
    {
      "id": 904212,
      "postDate": "2020-06-27T12:48:54.620Z",
      "content": "<p>Maybe all values in mel are 0?\nTry a quick diagnostic:\nplt.plot(mel.flatten()))\nYou should see the actual values as a line plot</p>",
      "rawMarkdown": "Maybe all values in mel are 0?\nTry a quick diagnostic:\nplt.plot(mel.flatten()))\nYou should see the actual values as a line plot",
      "isDeleted": true,
      "replies": [
        {
          "id": 912127,
          "postDate": "2020-07-02T08:44:55.943Z",
          "content": "<p>Yes, all mel values are below 0. </p>",
          "rawMarkdown": "Yes, all mel values are below 0. "
        }
      ]
    }
  ],
  "comments": [
    {
      "id": 904627,
      "author_name": "CVxTz",
      "author_url": "",
      "post_date": "2020-06-27T19:17:25.367000",
      "content": "<p>Do this : \nmel_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n_mels=n_mels, hop_length=hop_length, fmin=fmin, fmax=fmax)</p>\n\n<p>mel_db = librosa.<strong>power_to_db</strong>(mel_spec)</p>",
      "votes": 0,
      "replies": [
        {
          "id": 912126,
          "author_name": "Neo",
          "author_url": "",
          "post_date": "2020-07-02T08:44:51.653000",
          "content": "<p>Thanks for replying, but got the same result.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 904212,
      "author_name": "",
      "author_url": "",
      "post_date": "2020-06-27T12:48:54.620000",
      "content": "<p>Maybe all values in mel are 0?\nTry a quick diagnostic:\nplt.plot(mel.flatten()))\nYou should see the actual values as a line plot</p>",
      "votes": 0,
      "replies": [
        {
          "id": 912127,
          "author_name": "Neo",
          "author_url": "",
          "post_date": "2020-07-02T08:44:55.943000",
          "content": "<p>Yes, all mel values are below 0. </p>",
          "votes": 0,
          "replies": []
        }
      ]
    }
  ],
  "raw_markdown_by_id": {
    "904627": "Do this : \nmel\\_spec = librosa.feature.melspectrogram(y=audio, sr=sr, n\\_mels=n\\_mels, hop\\_length=hop\\_length, fmin=fmin, fmax=fmax)\n\nmel\\_db = librosa.**power\\_to\\_db**(mel\\_spec)",
    "901852": "This is my first audio classification competition and  I am trying to convert librosa melspectrogram to image array (3D) \n    \n    def extract_features(file_name, sample_rate = 44100, as_mono = True , preemphasis = 0.95):\n        \n        sig, rate = librosa.load(file_name, sr = sample_rate, res_type='kaiser_fast') \n        \n        SHAPE = (128, 256) #(heigt, width) in pixels\n\n        #Mel-spectrogram\n        SAMPLE_RATE = rate\n        N_FFT = SHAPE[0] * 8 # window length         \n        N_MELS = SHAPE[0]\n        HOP_LEN = len(sig) // (SHAPE[1] - 1)\n        #print(f'hop len = {HOP_LEN}')\n        FMIN = 500\n        FMAX = 15000\n        # Preemphasis as in python_speech_features by James Lyons\n        if preemphasis:\n            sig = np.append(sig[0], sig[1:] - preemphasis * sig[:-1])\n        #Librosa mel-spectrum\n        melspec = librosa.feature.melspectrogram(y=sig, sr=SAMPLE_RATE, \n                                       hop_length = HOP_LEN,\n                                      n_mels = N_MELS,\n                                      fmax = FMAX, fmin = FMIN,\n                                      power = 1.0\n                                      )\n        \n        #Convert power spec to db Scale\n        melspec = librosa.amplitude_to_db(melspec, ref=np.max , top_db = 80)\n        \n               \n        #Trim to desired shape \n        melspec = melspec[:SHAPE[0], :SHAPE[1]]\n        \n          \n        return melspec.astype('float32')`  \n\nthe above function returns shape(128 , 256),  when I try convert to 3D image array using:\n` from PIL import Image                                                                                                                      \n    mel = extract_features('../input/birdsong-recognition/train_audio/aldfly/XC134874.mp3')\n    mel = Image.fromarray(mel)`\n\nIt returns blank image:\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fdec7edaf1ada541139d57c35e7d0672c%2Fkaggle.png?generation=1593110024594644&amp;alt=media)\n \n\n\nEdit: Got it working.  Read this kaggle [Notebook](https://www.kaggle.com/daisukelab/cnn-2d-basic-solution-powered-by-fast-ai): \n```\ndef mono_to_color(X, mean=None, std=None, norm_max=None, norm_min=None, eps=1e-6):\n    # Stack X as [X,X,X]\n    X = np.stack([X, X, X], axis=-1)\n\n    # Standardize\n    mean = mean or X.mean()\n    std = std or X.std()\n    Xstd = (X - mean) / (std + eps)\n    _min, _max = Xstd.min(), Xstd.max()\n    norm_max = norm_max or _max\n    norm_min = norm_min or _min\n    if (_max - _min) &gt; eps:\n        # Scale to [0, 255]\n        V = Xstd\n        V[V &lt; norm_min] = norm_min\n        V[V &gt; norm_max] = norm_max\n        V = 255 * (V - norm_min) / (norm_max - norm_min)\n        V = V.astype(np.uint8)\n    else:\n        # Just zero\n        V = np.zeros_like(Xstd, dtype=np.uint8)\n    return V\n```\nResult:\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F1565256%2Fbd474e5261ff59e21f063fd548b8ae23%2FAnnotation%202020-07-02%20142202.png?generation=1593680019098131&amp;alt=media)\n",
    "904212": "Maybe all values in mel are 0?\nTry a quick diagnostic:\nplt.plot(mel.flatten()))\nYou should see the actual values as a line plot"
  }
}