{ "info": { "author": "Bohumir Zamecnik", "author_email": "bohumir.zamecnik@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Multimedia :: Sound/Audio :: Analysis" ], "description": "tfr - time-frequency reassignment in Python\n===========================================\n\n|PyPI version| |Supported Python versions| |License|\n\nSpectral audio feature extraction using `time-frequency\nreassignment `__.\n\nBesides normal spectrograms it allows to compute reassigned\nspectrograms, transform them (eg. to log-frequency scale) and requantize\nthem (eg. to musical pitch bins). This is useful to obtain good features\nfor audio analysis or machine learning on audio data.\n\nA reassigned spectrogram often provides more precise localization of\nenergy in the time-frequency plane than a plain spectrogram. Roughly\nsaid in the reassignment method we use the phase (which is normally\ndiscarded) and move the samples on the time-frequency plane to a more\nsuitable place computed from derivatives of the phase.\n\nThis library supports reassignment in both frequency and time (both are\noptional). As well it does requantization from the input overlapping\ngrid to an non-overlapping output grid.\n\nIt is a good building block to compute `chromagram\nfeatures `__ (aka pitch\nclass profiles) where pitch is transformed into pitch class by ignoring\nthe octave. See also `harmonic pitch class\nprofiles `__.\n\nInstallation\n------------\n\n::\n\n pip install tfr\n\nOr for development (all code changes will be available):\n\n::\n\n git clone https://github.com/bzamecnik/tfr.git\n pip install -e tfr\n\nUsage\n-----\n\nSplit audio signal to frames\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nYou can read time-domain signal from an audio file (using the\n``soundfile`` library) and split it into frames for spectral processing.\n\n::\n\n import tfr\n signal_frames = tfr.SignalFrames('audio.flac')\n\n``SignalFrames`` instance contains the signal split into frames and some\nmetadata useful for further processing.\n\nThe signal values are normalized to [0.0, 1.0] and the channels are\nconverted to mono.\n\nIt is possible to provide the signal a numpy array as well.\n\n::\n\n import tfr\n x = np.sin(2 * np.pi * 10 * np.linspace(0, 1, 1000))\n signal_frames = tfr.SignalFrames(x)\n\nMinimal example - pitchgram from audio file\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n import tfr\n x_pitchgram = tfr.pitchgram(tfr.SignalFrames('audio.flac'))\n\nFrom audio frames it computes a reassigned pitchgram of shape\n``(frame_count, bin_count)`` with values being log-magnitudes in dBFS\n``[-120.0, 0.0]``. Sensible parameters are used by default, but you can\nchange them if you wish.\n\nReassigned spectrogram\n~~~~~~~~~~~~~~~~~~~~~~\n\nLike normal one but sharper and requantized.\n\n::\n\n import tfr\n x_spectrogram = tfr.reassigned_spectrogram(tfr.SignalFrames('audio.flac'))\n\nSignal frames with specific parameters\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n- ``frame_size`` - affects the FFT size - trade-off between frequency\n and time resolution, good to use powers of two, eg. 4096\n- ``hop_size`` - affects the overlap between frames since a window\n edges fall to zero, eg. half of frame_size (2048)\n\n::\n\n import tfr\n signal_frames = tfr.SignalFrames('audio.flac', frame_size=1024, hop_size=256)\n\nGeneral spectrogram API\n~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``pitchgram`` and ``reassigned_spectrogram`` functions are just\nsyntax sugar for the ``Spectrogram`` class. You can use it directly to\ngain more control.\n\nGeneral usage:\n\n::\n\n x_spectrogram = tfr.Spectrogram(signal_frames).reassigned()\n\nFrom one Spectrogram instance you can efficiently compute reassigned\nspectrograms with various parameters.\n\n::\n\n s = tfr.Spectrogram(signal_frames)\n x_spectrogram_tf = s.reassigned(output_frame_size=4096)\n x_spectrogram_f = s.reassigned(output_frame_size=512)\n\nDifferent window function (by default we use Hann window):\n\n::\n\n import scipy\n x_spectrogram = tfr.Spectrogram(signal_frames, window=scipy.blackman).reassigned()\n\nDifferent output frame size (by default we make it the same as input hop\nsize):\n\n::\n\n x_spectrogram = tfr.Spectrogram(signal_frames).reassigned(output_frame_size=512)\n\nDisable reassignment of time and frequency separately:\n\n::\n\n s = tfr.Spectrogram(signal_frames)\n x_spectrogram = s.reassigned(reassign_time=False, reassign_frequency=False)\n x_spectrogram_t = s.reassigned(reassign_frequency=False)\n x_spectrogram_f = s.reassigned(reassign_time=False)\n x_spectrogram_tf = s.reassigned()\n\nDisable decibel transform of output values:\n\n::\n\n x_spectrogram = tfr.Spectrogram(signal_frames).reassigned(magnitudes='power')\n\nMagnitudes in the spectrogram can be transformed at the end in multiple\nways given by the ``magnitudes`` parameter:\n\n- ``linear`` - energy spectrum\n- ``power`` - power spectrum\n- ``power_db`` - power spectrum in decibels, range: [-120, 0]\n- ``power_db_normalized`` - power spectrum in decibels normalized to\n range: [0, 1]\n\n - this is useful as a feature\n\nUse some specific transformation of the output values.\n``LinearTransform`` (default) is just for normal spectrogram,\n``PitchTransform`` is for pitchgram. Or you can write your own.\n\n::\n\n x_spectrogram = tfr.Spectrogram(signal_frames).reassigned(transform=LinearTransform())\n\n::\n\n x_pitchgram = tfr.Spectrogram(signal_frames).reassigned(transform=PitchTransform())\n\n::\n\n class LogTransform():\n def __init__(self, bin_count=100)\n self.bin_count = bin_count\n\n def transform_freqs(self, X_inst_freqs, sample_rate):\n X_y = np.log10(np.maximum(sample_rate * X_inst_freqs, eps))\n bin_range = (0, np.log10(sample_rate))\n return X_y, self.bin_count, bin_range\n\n x_log_spectrogram = tfr.Spectrogram(signal_frames).reassigned(transform=LogTransform())\n\nPitchgram parameters\n~~~~~~~~~~~~~~~~~~~~\n\nIn pitchgram the frequencies are transformed into pitches in some tuning\nand then quantized to bins. You can specify the tuning range of pitch\nbins and their subdivision.\n\n- ``tuning`` - instance of ``Tuning`` class, transforms between pitch\n and frequency\n- ``bin_range`` is in pitches where 0 = 440 Hz (A4), 12 is A5, -12 is\n A3, etc.\n- ``bin_division`` - bins per each pitch\n\nExtract features via CLI\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n # basic STFT spectrogram\n python -m tfr.spectrogram_features audio.flac spectrogram.npz\n # reassigned STFT spectrogram\n python -m tfr.spectrogram_features audio.flac -t reassigned reassigned_spectrogram.npz\n # reassigned pitchgram\n python -m tfr.spectrogram_features audio.flac -t pitchgram pitchgram.npz\n\nLook for other options:\n\n::\n\n python -m tfr.spectrogram_features --help\n\nscikit-learn transformer\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nIn order to extract pitchgram features within a sklearn pipeline, we can\nuse ``PitchgramTransformer``:\n\n::\n\n import soundfile as sf\n x, fs = sf.read('audio.flac')\n\n from tfr.signal import to_mono\n from tfr.sklearn import PitchgramTransformer\n ct = PitchgramTransformer(sample_rate=fs)\n x_pitchgram = ct.transform(x)\n\n # output:\n # - shape: (frame_count, bin_count)\n # - values in dBFB normalized to [0.0, 1.0]\n\nStatus\n------\n\nCurrently it\u2019s alpha. I\u2019m happy to extract it from some other project\ninto a separate repo and package it. However, the API must be completely\nredone to be more practical and obvious.\n\nAbout\n-----\n\n- Author: Bohum\u00edr Z\u00e1me\u010dn\u00edk ([@bzamecnik](http://twitter.com/bzamecnik))\n- License: MIT\n\nSupport the project\n~~~~~~~~~~~~~~~~~~~\n\nNeed some consulting or coding work regarding audio processing, machine\nlearning or big data? Drop me a message via\n`email `__\nor `LinkedIn `__. Or just\nsay hello :).\n\nLiterature\n----------\n\n- `A Unified Theory of Time-Frequency\n Reassignment `__ - Kelly R. Fitz,\n Sean A. Fulop, Digital Signal Processing 30 September 2005\n- `Algorithms for computing the time-corrected instantaneous frequency\n (reassigned) spectrogram, with\n applications `__\n - Sean A. Fulop, Kelly Fitz, Journal of Acoustical Society of\n America, Jan 2006\n- `Time Frequency Reassignment: A Review and\n Analysis `__\n - Stephen W. Hainsworth, Malcolm D. Macleod, Technical Report,\n Cambridge University Engineering Dept.\n- `Improving the Readability of Time-Frequency and Time-Scale\n Representations by the Reassignment\n Method `__\n - Francois Auger, Patrick Flandrin, IEEE Transactions on Signal\n Processing, vol.\u00a043, no. 5, May 1995\n- `Time\u2013frequency reassignment: from principles to\n algorithms `__\n - P. Flandrin, F. Auger, E. Chassande-Mottin, CRC Press 2003\n- `Time-frequency toolbox for Matlab, user\u2019s guide and reference\n guide `__ -\n F.Auger, P.Flandrin, P.Goncalves, O.Lemoine\n\n.. |PyPI version| image:: https://img.shields.io/pypi/v/tfr.svg\n :target: https://pypi.python.org/pypi/tfr\n.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/tfr.svg\n.. |License| image:: https://img.shields.io/pypi/l/tfr.svg\n\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/bzamecnik/tfr", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "tfr", "package_url": "https://pypi.org/project/tfr/", "platform": "", "project_url": "https://pypi.org/project/tfr/", "project_urls": { "Homepage": "http://github.com/bzamecnik/tfr" }, "release_url": "https://pypi.org/project/tfr/0.2.4/", "requires_dist": [ "numpy", "scikit-learn", "scipy", "soundfile" ], "requires_python": "", "summary": "Time-frequency reassigned spectrograms", "version": "0.2.4" }, "last_serial": 4313287, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "ad243d05456d130a20ecb7becfefe5cb", "sha256": "3045405b5513135941e680212b6fb1bbd1967589a03959741a30314c045d745d" }, "downloads": -1, "filename": "tfr-0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ad243d05456d130a20ecb7becfefe5cb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10420, "upload_time": "2016-10-18T19:45:33", "url": "https://files.pythonhosted.org/packages/c7/95/04b635a79440c5f7cd4b0db350ed69130fc57af2b93dd90dc923b098ca13/tfr-0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f271fc3b2b3acb8a56ad66be742f191d", "sha256": "06cc7e851871eefbf8ee6c873ac223482e9b128a9687aac5d4365ed1b4027991" }, "downloads": -1, "filename": "tfr-0.1.tar.gz", "has_sig": false, "md5_digest": "f271fc3b2b3acb8a56ad66be742f191d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7305, "upload_time": "2016-10-18T19:45:36", "url": "https://files.pythonhosted.org/packages/66/e4/b7b52f0685378c49a2e52b51a560ec9abb040be14920ffc57ae8ff7d3eae/tfr-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "47e12b61091794cb1823b6eed48dc51b", "sha256": "a232f0b089b381d988f74e648a618e53484ee4cc6b2dc4098026fe09c5870eb8" }, "downloads": -1, "filename": "tfr-0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "47e12b61091794cb1823b6eed48dc51b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19162, "upload_time": "2016-10-31T16:18:34", "url": "https://files.pythonhosted.org/packages/8b/e1/bc28097b101e1b3a9e818a7009014b45bcbbc0239f87ba3a347ec0470e47/tfr-0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8054377d53fff97ac13803f5d9484aae", "sha256": "db22636e3b795143bd1ae00083f71ab615ee5e01e57164458a1225cddcbe9baa" }, "downloads": -1, "filename": "tfr-0.2.tar.gz", "has_sig": false, "md5_digest": "8054377d53fff97ac13803f5d9484aae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15779, "upload_time": "2016-10-31T16:18:37", "url": "https://files.pythonhosted.org/packages/5a/5b/fe7dd1388f2aa9eebf65eea53cf5384d06c7addd534e20daa24dedbecc6e/tfr-0.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "bf20839e7c74232dfce37c626a58cc06", "sha256": "f972fb56b01bb6c8bea8456238f6736fdcfc7f75e73c539f970bd45bf7bd3516" }, "downloads": -1, "filename": "tfr-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bf20839e7c74232dfce37c626a58cc06", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19193, "upload_time": "2016-11-02T09:08:17", "url": "https://files.pythonhosted.org/packages/aa/6e/155a31d98c514a17d67984930e2e54aa1693aa46ea8fb699fc6590c88271/tfr-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b9b8e977e4f44c57a4d776ae85cedbd", "sha256": "d6d83d11a872b5b6a01c13e169d0ef4063f9267dd1b90143fb72f56736f418d0" }, "downloads": -1, "filename": "tfr-0.2.1.tar.gz", "has_sig": false, "md5_digest": "9b9b8e977e4f44c57a4d776ae85cedbd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15783, "upload_time": "2016-11-02T09:08:20", "url": "https://files.pythonhosted.org/packages/64/71/bef31e2019fa4b1e989a13d6c471f62c0bead2ce793fe8f5ae86c5768173/tfr-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "7b6710e023892ed7b3fd91f3b69bc990", "sha256": "a7f8fc0574603a5e222b8fa578efac93348ad41c2ecef1d480dc73b79c54322f" }, "downloads": -1, "filename": "tfr-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7b6710e023892ed7b3fd91f3b69bc990", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19229, "upload_time": "2016-11-02T10:17:44", "url": "https://files.pythonhosted.org/packages/e1/5d/285127279e88f0f2b4c9d0ed3c0a6b08001aa553d7cfbe4fad79c0f8acae/tfr-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d9c47edcc47eff683fc1f6a7a69ebc9", "sha256": "e85497fc9a55d466891d67b800f0fb28eb4c572891a3668dec8876fe780b5404" }, "downloads": -1, "filename": "tfr-0.2.2.tar.gz", "has_sig": false, "md5_digest": "8d9c47edcc47eff683fc1f6a7a69ebc9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15810, "upload_time": "2016-11-02T10:17:47", "url": "https://files.pythonhosted.org/packages/33/fd/d91da10292adb477d1aef557b67a22a4eeeb1e63ae12de6c160782e87f09/tfr-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "53cba6dc0423c1f1b5d912ef74c3f371", "sha256": "551ca04baeebcd1b070cfc47610e7150d10f18db388889c1cddafc674f9918d1" }, "downloads": -1, "filename": "tfr-0.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "53cba6dc0423c1f1b5d912ef74c3f371", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19515, "upload_time": "2017-11-19T22:32:23", "url": "https://files.pythonhosted.org/packages/9c/a3/b2820635661df8c39a531a402c61467ea306360c7d013f429e0e340a67d5/tfr-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e4e69051adea9ba50670dc48a65e1f38", "sha256": "140849d5a500c424bc4924a66eae92f0e562d485c9026add8e7db475cb8e3d0e" }, "downloads": -1, "filename": "tfr-0.2.3.tar.gz", "has_sig": false, "md5_digest": "e4e69051adea9ba50670dc48a65e1f38", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16648, "upload_time": "2017-11-19T22:32:25", "url": "https://files.pythonhosted.org/packages/31/3e/d4e630382498af6b86a753131f3c781008de08b945f5c2b65c417b92b363/tfr-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "91b8728bd913a09a1f40c3f7437a5054", "sha256": "3414cc915c45d9989b7daec9b9fd8be5b23b5c5ddfb7b02963e8fe6546ac38e7" }, "downloads": -1, "filename": "tfr-0.2.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91b8728bd913a09a1f40c3f7437a5054", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15177, "upload_time": "2018-09-26T16:41:42", "url": "https://files.pythonhosted.org/packages/30/da/6193a6008ed048359d364a61ffdaee5948f3e66ac0d50e84d40493cbb135/tfr-0.2.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "caf02d024690cdcf944fe5dcb556b8a9", "sha256": "aca862fbaa5a87f75f7f4ebf11fadd50d780522437ccb909e649fd9f57ad7c95" }, "downloads": -1, "filename": "tfr-0.2.4.tar.gz", "has_sig": false, "md5_digest": "caf02d024690cdcf944fe5dcb556b8a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16958, "upload_time": "2018-09-26T16:41:44", "url": "https://files.pythonhosted.org/packages/28/d9/343ab53b6494d65dbd71eb44d31725ea282c003e30988dea18f3ded38954/tfr-0.2.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "91b8728bd913a09a1f40c3f7437a5054", "sha256": "3414cc915c45d9989b7daec9b9fd8be5b23b5c5ddfb7b02963e8fe6546ac38e7" }, "downloads": -1, "filename": "tfr-0.2.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "91b8728bd913a09a1f40c3f7437a5054", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15177, "upload_time": "2018-09-26T16:41:42", "url": "https://files.pythonhosted.org/packages/30/da/6193a6008ed048359d364a61ffdaee5948f3e66ac0d50e84d40493cbb135/tfr-0.2.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "caf02d024690cdcf944fe5dcb556b8a9", "sha256": "aca862fbaa5a87f75f7f4ebf11fadd50d780522437ccb909e649fd9f57ad7c95" }, "downloads": -1, "filename": "tfr-0.2.4.tar.gz", "has_sig": false, "md5_digest": "caf02d024690cdcf944fe5dcb556b8a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16958, "upload_time": "2018-09-26T16:41:44", "url": "https://files.pythonhosted.org/packages/28/d9/343ab53b6494d65dbd71eb44d31725ea282c003e30988dea18f3ded38954/tfr-0.2.4.tar.gz" } ] }