{ "info": { "author": "Tim Mahrt", "author_email": "timmahrt@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "-----------------------\r\nProMo (Prosody Morph)\r\n-----------------------\r\n\r\n.. image:: https://travis-ci.org/timmahrt/ProMo.svg?branch=master\r\n :target: https://travis-ci.org/timmahrt/ProMo\r\n\r\n.. image:: https://coveralls.io/repos/github/timmahrt/ProMo/badge.svg?branch=master\r\n :target: https://coveralls.io/github/timmahrt/ProMo?branch=master\r\n\r\n.. image:: https://img.shields.io/badge/license-MIT-blue.svg?\r\n :target: http://opensource.org/licenses/MIT\r\n\r\nA library for manipulating pitch and duration in an algorithmic way, for\r\nresynthesizing speech.\r\n\r\nThis library can be used to resynthesize pitch in natural speech using pitch\r\ncontours taken from other speech samples, generated pitch contours,\r\nor through algorithmic manipulations of the source pitch contour.\r\n\r\n.. sectnum::\r\n.. contents::\r\n\r\nCommon Use Cases\r\n================\r\n\r\nWhat can you do with this library?\r\n\r\nApply the pitch or duration from one speech sample to another.\r\n\r\n- alignment happens both in time and in hertz\r\n\r\n - after the morph process, the source pitch points will be at the same\r\n absolute pitch and relative time as they are in the target file \r\n\r\n - time is relative to the start and stop time of the interval being\r\n considered (e.g. the pitch value at 80% of the duration of the interval).\r\n Relative time is used so that the source and target files don't have to\r\n be the same length.\r\n\r\n - temporal morphing is a minor effect if the sampling frequency is high\r\n but it can be significant when, for example, using a stylized pitch\r\n contour with few pitch samples.\r\n\r\n- modifications can be done between entire wav files or between\r\n corresponding intervals as specified in a textgrid or other annotation\r\n (indicating the boundaries of words, stressed vowels, etc.)\r\n\r\n - the larger the file, the less useful the results are likely to be\r\n without using a transcript of some sort\r\n\r\n - the transcripts do not have to match in lexical content, only in the\r\n number of intervals (same number of words or phones, etc.)\r\n\r\n- modifications can be scaled (it is possible to generate a wav file with\r\n a pitch contour that is 30% or 60% between the source and target contours).\r\n\r\n- can also morph the pitch range and average pitch independently.\r\n\r\n- resynthesis is performed by Praat.\r\n\r\n- pitch can be obtained from praat (such as by using praatio)\r\n or from other sources (e.g. ESPS getF0)\r\n\r\n- plots of the resynthesis (such as the ones below) can be generated\r\n\r\n\r\nIllustrative example\r\n======================\r\n\r\nConsider the phrase \"Mary rolled the barrel\". In the first recording\r\n(examples/mary1.wav), \"Mary rolled the barrel\" was said in response\r\nto a question such as \"Did John roll the barrel?\". On the other hand,\r\nin the second recording (examples/mary2.wav) the utterance was said \r\nin response to a question such as \"What happened yesterday\".\r\n\r\n\"Mary\" in \"mary1.wav\" is produced with more emphasis than in \"mary2.wav\".\r\nIt is longer and carries a more drammatic pitch excursion. Using \r\nProMo, we can make mary1.wav spoken similar to mary2.wav, even\r\nthough they were spoken in a different way and by different speakers.\r\n\r\nDuration and pitch carry meaning. Change these, and you can change the\r\nmeaning being conveyed.\r\n\r\n``Note that modifying pitch and duration too much can introduce artifacts. \r\nSuch artifacts can be heard even in pitch morphing mary1.wav to mary2.wav.``\r\n\r\nPitch morphing (examples/pitch_morph_example.py):\r\n\r\n The following image shows morphing of pitch from mary1.wav to mary2.wav\r\n on a word-by-word level\r\n in increments of 33% (33%, 66%, 100%). Note that the morph adjusts the\r\n temporal dimension of the target signal to fit the duration of the source\r\n signal (the source and generated contours are equally shorter \r\n than the target contour). This occurs at the level of the file unless\r\n the user specifies an equal number of segments to align in time\r\n (e.g. using word-level transcriptions, as done here, or phone-level\r\n transcriptions, etc.)\r\n\r\n.. image:: examples/files/mary1_mary2_f0_morph.png\r\n :width: 500px\r\n\r\nWith the ability to morph pitch range and average pitch, it becomes easier\r\nto morph contours produced by different speakers:\r\n\r\n The following image shows four different pitch manipulations. On the \r\n **upper left** is the raw morph. Notice that final output (black line) is\r\n very close to the target. Differences stem from duration differences.\r\n\r\n However, the average pitch and pitch range are qualities of speech that\r\n can signify differences in gender in addition to other aspects of\r\n speaker identity. By resetting the average pitch and pitch range to\r\n that of the source, it is possible to morph the contour while maintaining\r\n aspects of the source speaker's identity.\r\n\r\n The image in the **upper right** contains a morph\r\n followed by a reset of the average pitch to the source speaker's average\r\n pitch. In the **bottom right** a morph followed by a reset of the speaker's\r\n pitch range. In the **bottom right** pitch range was reset and then the\r\n speaker's average pitch was reset.\r\n\r\n The longer the speech sample, the more representative the pitch range and\r\n mean pitch will be of the speaker. In this example both are skewed higher\r\n by the pitch accent on the first word.\r\n\r\n Here the average pitch of the source (a female speaker) is much higher\r\n than the target (a male speaker) and the resulting morph sounds like it\r\n comes from a different speaker than the source or target speakers.\r\n The three recordings that involve resetting pitch range and/or average\r\n pitch sound much more natural.\r\n\r\n.. image:: examples/files/mary1_mary2_f0_morph_compare.png\r\n :width: 500px\r\n\r\nDuration morphing (examples/duration_manipulation_example.py):\r\n\r\n The following image shows morphing of duration from mary1.wav to mary2.wav\r\n on a word-by-word basis in increments of 33% (33%, 66%, 100%).\r\n This process can operate over an entire file or, similar to pitch morphing,\r\n with annotated segments, as done in this example.\r\n\r\n.. image:: examples/files/mary1_mary2_dur_morph.png\r\n :width: 500px\r\n\r\n\r\nTutorials\r\n================\r\n\r\nTutorials for learning about prosody manipulation and how to use ProMo are available.\r\n\r\n`Tutorial 1.1: Intro to ProMo `_\r\n\r\n`Tutorial 1.2: Pitch manipulation tutorial `_\r\n\r\n\r\nMajor revisions\r\n================\r\n\r\nVer 1.3 (May 29, 2017)\r\n\r\n- added tutorials\r\n\r\n- f0Morph() can now exclude certain regions from the morph process if desired\r\n\r\nVer 1.2 (January 27, 2017)\r\n\r\n- added code for reshaping pitch accents (shift alignment, add plateau, or change height)\r\n\r\nVer 1.1 (February 22, 2016)\r\n\r\n- f0 morph code for modifying speaker pitch range and average pitch\r\n\r\n- (October 20, 2016) Added integration tests with travis CI and coveralls support.\r\n\r\nVer 1.0 (January 19, 2016)\r\n\r\n- first public release.\r\n\r\nBeta (July 1, 2013)\r\n\r\n- first version which was utilized in my dissertation work\r\n\r\n\r\nRequirements\r\n==============\r\n\r\n``Python 2.7.*`` or above\r\n\r\n``Python 3.3.*`` or above (or below, probably)\r\n\r\nMy praatIO library is used extensively and can be downloaded \r\n`here `_\r\n\r\nMatplotlib is needed if you want to plot graphs.\r\n`Matplotlib website `_\r\n\r\nScipy is needed if you want to use interpolation--typically if you have stylized\r\npitch contours (in praat PitchTier format, for example) that you want to use in\r\nyour morphing).\r\n`Matplotlib website `_\r\n\r\nMatplotlib and SciPy are non-trivial to install, as they depends on several large\r\npackages. You can\r\nvisit their websites for more information. **I recommend the following instructions to\r\ninstall matplotlib** which uses *python wheels*. These will install all required\r\nlibraries in one fell swoop.\r\n\r\nOn Mac, open a terminal and type:\r\n\r\n sudo python -m pip install matplotlib\r\n\r\n sudo python -m pip install scipy\r\n\r\nOn Windows, open a cmd or powershell window and type:\r\n\r\n <> -m install matplotlib\r\n\r\n <> -m install scipy\r\n\r\n e.g. C:\\\\python27\\\\python.exe -m install matplotlib\r\n\r\n\r\nUsage\r\n=========\r\n\r\nSee /examples for example usages\r\n\r\n\r\nInstallation\r\n================\r\n\r\nIf you on Windows, you can use the installer found here (check that it is up to date though)\r\n`Windows installer `_\r\n\r\nPraatIO is on pypi and can be installed or upgraded from the command-line shell with pip like so::\r\n\r\n pip install praatio --upgrade\r\n\r\nOtherwise, to manually install, after downloading the source from github, from a command-line shell, navigate to the directory containing setup.py and type::\r\n\r\n python setup.py install\r\n\r\nIf python is not in your path, you'll need to enter the full path e.g.::\r\n\r\n C:\\Python27\\python.exe setup.py install\r\n\r\n\r\nCiting ProMo\r\n===============\r\n\r\nIf you use ProMo in your research, please cite it like so:\r\n\r\nTim Mahrt. ProMo: The Prosody-Morphing Library.\r\nhttps://github.com/timmahrt/ProMo, 2016.\r\n\r\n\r\nAcknowledgements\r\n================\r\n\r\nDevelopment of ProMo was possible thanks to NSF grant **BCS 12-51343** to\r\nJennifer Cole, Jos\u00e9 I. Hualde, and Caroline Smith and to the A*MIDEX project\r\n(n\u00b0 **ANR-11-IDEX-0001-02**) to James Sneed German funded by the\r\nInvestissements d'Avenir French Government program,\r\nmanaged by the French National Research Agency (ANR).\r\n\r\n\r\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/timmahrt/ProMo", "keywords": "", "license": "LICENSE", "maintainer": "", "maintainer_email": "", "name": "promo", "package_url": "https://pypi.org/project/promo/", "platform": "", "project_url": "https://pypi.org/project/promo/", "project_urls": { "Homepage": "https://github.com/timmahrt/ProMo" }, "release_url": "https://pypi.org/project/promo/1.3.0/", "requires_dist": null, "requires_python": "", "summary": "Library for manipulating pitch and duration in an algorithmic way, for resynthesizing speech", "version": "1.3.0" }, "last_serial": 5208757, "releases": { "1.1.0": [ { "comment_text": "", "digests": { "md5": "1a13cbc1092f0b83d337e9762822a77b", "sha256": "63163e77e93f6206c1de44824790e1921bca2e142948128bdf1dab830106f4fb" }, "downloads": -1, "filename": "promo-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1a13cbc1092f0b83d337e9762822a77b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 21423, "upload_time": "2016-10-20T20:17:33", "url": "https://files.pythonhosted.org/packages/90/c7/6a943ea970533de0fe85992b2cc5657c61008b58a40ac58d59c3dfd53b72/promo-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8dad713c754eef7d913d2e692ba0164", "sha256": "b900b19ba1f989130ae32ea912577acdc30178c6a6d380a22fa23134662c67da" }, "downloads": -1, "filename": "promo-1.1.0.zip", "has_sig": false, "md5_digest": "f8dad713c754eef7d913d2e692ba0164", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25260, "upload_time": "2016-10-20T20:17:28", "url": "https://files.pythonhosted.org/packages/0f/27/1c929a2927baa0f532f2587e8cd696a188d0f7c857dc865c8d4dc7de8470/promo-1.1.0.zip" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "26fbddd64798d436433587c03ab2628d", "sha256": "f4413591216ba8bc7cfe23b18308f53fa040d3f2c22e0b4eeab669a0a283cb68" }, "downloads": -1, "filename": "promo-1.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "26fbddd64798d436433587c03ab2628d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21428, "upload_time": "2017-01-15T15:11:15", "url": "https://files.pythonhosted.org/packages/2f/14/80b806c0fa822bee502270f996cf016fa78ba77a06da4c99144e1034ad82/promo-1.1.1-py2.py3-none-any.whl" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "5ce4d17deb83ca7d6a59de0b2feeecea", "sha256": "537f2c2e5dc8a4dc37c7bd14f21dc0b43fa172a96409b81d00beedb832f484bb" }, "downloads": -1, "filename": "promo-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5ce4d17deb83ca7d6a59de0b2feeecea", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23286, "upload_time": "2017-01-27T14:54:26", "url": "https://files.pythonhosted.org/packages/f4/1b/d7329a42a5d0f2bb3b23d1bf567833f696623c301e81741e27f8eaac98d0/promo-1.2.0-py2.py3-none-any.whl" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "9155da97ccbd7e9363603605237e4584", "sha256": "ea3d48241b45995f116f87cde78ebf21bffd2fe2dc2898fb9bd2afce1a412c2e" }, "downloads": -1, "filename": "promo-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9155da97ccbd7e9363603605237e4584", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23346, "upload_time": "2017-01-30T17:19:20", "url": "https://files.pythonhosted.org/packages/9a/b0/8c983418f237e9e90987094b7640f24219b1f92be986f1dca1ff481e104d/promo-1.2.1-py2.py3-none-any.whl" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "730f92ce424b632d5ff7e27500269ced", "sha256": "afa458620bb188f08e2e184baa54eb571067d7cebadb7b7e736fd7904202c537" }, "downloads": -1, "filename": "promo-1.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "730f92ce424b632d5ff7e27500269ced", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23450, "upload_time": "2017-03-17T17:00:04", "url": "https://files.pythonhosted.org/packages/88/91/1542398881397dc5d8c0bf6043eee7abc27fdc74ea1f4f3dc2729bf6dfc6/promo-1.2.2-py2.py3-none-any.whl" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "fc370496b2b55ad9ecf2622a1bd4bc50", "sha256": "d8dc22335380aef2c53cdd6937b58d5d965f7ed1a1b15e59fa5b018f7649167d" }, "downloads": -1, "filename": "promo-1.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fc370496b2b55ad9ecf2622a1bd4bc50", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23432, "upload_time": "2017-05-09T13:02:06", "url": "https://files.pythonhosted.org/packages/10/5e/8eb4506fceccafd8949632244e08263c5a49b1dcc6fb62ad21acec579ee2/promo-1.2.3-py2.py3-none-any.whl" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "07abfb10c86f502ba775f305f7c971e3", "sha256": "7c2bb48ac0f4f32753269eef1915dfbf43513e83786b4616f5e38adc8f84822a" }, "downloads": -1, "filename": "promo-1.2.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "07abfb10c86f502ba775f305f7c971e3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23430, "upload_time": "2017-05-09T20:52:40", "url": "https://files.pythonhosted.org/packages/53/ae/99d838399df159ec55e7e0cf6ba87e9418337eb7ce3aaf822ba07e1e1265/promo-1.2.5-py2.py3-none-any.whl" } ], "1.2.6": [ { "comment_text": "", "digests": { "md5": "4c04f3fd0807370f688aa21886c28768", "sha256": "755c177195306934ceed1f977d4656ca03fb92f8b5d7b5d0235aeb2d8326ad44" }, "downloads": -1, "filename": "promo-1.2.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4c04f3fd0807370f688aa21886c28768", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23548, "upload_time": "2017-05-17T14:50:12", "url": "https://files.pythonhosted.org/packages/e3/46/2c4f7cf9522fa208516ab36739a7f0cdc944e5a930a84f0689e5f4badcd1/promo-1.2.6-py2.py3-none-any.whl" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "89e663bf255c58de3d0cb91e355ad040", "sha256": "c4ac6731e8e5b158c646684f9a405edcdf71e3d16f651e065d57afe6561f331d" }, "downloads": -1, "filename": "promo-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89e663bf255c58de3d0cb91e355ad040", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 24355, "upload_time": "2017-05-29T07:39:20", "url": "https://files.pythonhosted.org/packages/b7/17/0844b52a29759750e72a5ee8608765b9ca1a5451f8a32e7cf3b1d9fbc7a0/promo-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49ae85ecf60433651746c655558bcf80", "sha256": "68f92bbb7a8c9014c14854658dd650a2b6ca014b8d93d723185c619125f2f7c6" }, "downloads": -1, "filename": "promo-1.3.0.tar.gz", "has_sig": false, "md5_digest": "49ae85ecf60433651746c655558bcf80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21119, "upload_time": "2019-04-30T15:44:10", "url": "https://files.pythonhosted.org/packages/45/32/04170c674e3fe7c0106ff788b2a3f235125f0cbd841fff9dc7c13770139b/promo-1.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "89e663bf255c58de3d0cb91e355ad040", "sha256": "c4ac6731e8e5b158c646684f9a405edcdf71e3d16f651e065d57afe6561f331d" }, "downloads": -1, "filename": "promo-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "89e663bf255c58de3d0cb91e355ad040", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 24355, "upload_time": "2017-05-29T07:39:20", "url": "https://files.pythonhosted.org/packages/b7/17/0844b52a29759750e72a5ee8608765b9ca1a5451f8a32e7cf3b1d9fbc7a0/promo-1.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49ae85ecf60433651746c655558bcf80", "sha256": "68f92bbb7a8c9014c14854658dd650a2b6ca014b8d93d723185c619125f2f7c6" }, "downloads": -1, "filename": "promo-1.3.0.tar.gz", "has_sig": false, "md5_digest": "49ae85ecf60433651746c655558bcf80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21119, "upload_time": "2019-04-30T15:44:10", "url": "https://files.pythonhosted.org/packages/45/32/04170c674e3fe7c0106ff788b2a3f235125f0cbd841fff9dc7c13770139b/promo-1.3.0.tar.gz" } ] }