{"id":19093065,"url":"https://github.com/ryanlintott/oevoice","last_synced_at":"2025-08-11T05:11:20.928Z","repository":{"id":37993937,"uuid":"390819461","full_name":"ryanlintott/OEVoice","owner":"ryanlintott","description":"Old English text-to-speech using AVSpeechSynthesis and IPA pronunciations.","archived":false,"fork":false,"pushed_at":"2025-05-24T05:10:37.000Z","size":306,"stargazers_count":24,"open_issues_count":1,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-07-25T06:30:10.027Z","etag":null,"topics":["avfoundation","avspeechsynthesizer","international-phonetic-alphabet","ipa","swift","text-to-speech"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryanlintott.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-07-29T18:41:41.000Z","updated_at":"2025-05-24T05:09:35.000Z","dependencies_parsed_at":"2025-04-30T12:56:30.516Z","dependency_job_id":"a3d5c04d-1ac4-49f3-a7ff-aa10b005b175","html_url":"https://github.com/ryanlintott/OEVoice","commit_stats":{"total_commits":38,"total_committers":2,"mean_commits":19.0,"dds":0.2894736842105263,"last_synced_commit":"cf037d05c5fab3a3893140169ec663a1bdeb3186"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/ryanlintott/OEVoice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanlintott%2FOEVoice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanlintott%2FOEVoice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanlintott%2FOEVoice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanlintott%2FOEVoice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryanlintott","download_url":"https://codeload.github.com/ryanlintott/OEVoice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryanlintott%2FOEVoice/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269832909,"owners_count":24482334,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-11T02:00:10.019Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avfoundation","avspeechsynthesizer","international-phonetic-alphabet","ipa","swift","text-to-speech"],"created_at":"2024-11-09T03:23:13.051Z","updated_at":"2025-08-11T05:11:20.919Z","avatar_url":"https://github.com/ryanlintott.png","language":"Swift","funding_links":["https://ko-fi.com/X7X04PU6T"],"categories":[],"sub_categories":[],"readme":"\u003cimg width=\"456\" alt=\"OEVoice Logo\" src=\"https://user-images.githubusercontent.com/2143656/150425538-49cbe98a-75de-4f23-8969-90d5b0784fb2.png\"\u003e\n\n[![Swift Compatibility](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fryanlintott%2FOEVoice%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/ryanlintott/OEVoice)\n[![Platform Compatibility](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fryanlintott%2FOEVoice%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/ryanlintott/OEVoice)\n![License - MIT](https://img.shields.io/github/license/ryanlintott/OEVoice)\n![Version](https://img.shields.io/github/v/tag/ryanlintott/OEVoice?label=version)\n![GitHub last commit](https://img.shields.io/github/last-commit/ryanlintott/OEVoice)\n[![Mastodon](https://img.shields.io/badge/mastodon-@ryanlintott-5c4ee4.svg?style=flat)](http://mastodon.social/@ryanlintott)\n[![Twitter](https://img.shields.io/badge/twitter-@ryanlintott-blue.svg?style=flat)](http://twitter.com/ryanlintott)\n\n# Overview\nAVSpeechSynthesis for Old English with IPA pronunciations.\n\n# Demo App\nThe `Example` folder has an app that demonstrates the features of this package.\n\n# Installation and Usage\nThis package is compatible with iOS 14+.\n\n1. In Xcode go to `File -\u003e Add Packages`\n2. Paste in the repo's url: `https://github.com/ryanlintott/OEVoice` and select by version.\n3. Import the package using `import OEVoice`\n\n# Platforms\nThis package is compatible with iOS 14 or later.\n\n# Is this Production-Ready?\nReally it's up to you. I currently use this package in my own [Old English Wordhord app](https://oldenglishwordhord.com/app).\n\nAdditionally, if you find a bug or want a new feature add an issue and I will get back to you about it.\n\n# Support\nOEVoice is open source and free but if you like using it, please consider supporting my work.\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/X7X04PU6T)\n\n- - -\n# Details\nUse\n`AVSpeechSynthesizerIPA`\ninstead of\n`AVSpeechSynthesizer`\nto access\n`speakIPA(_ ipaString: String, voice: AVSpeechSynthesisVoice, willSpeak: ((String) -\u003e Void)? = nil)`\n\nThere are 3 options for initializing `AVSpeechSynthesizerIPA`\n1. `AVSpeechSynthesizerIPA.oeSupported` - Use this to ensure an OEVoice supported language is set.\n2. `AVSpeechSynthesizerIPA.init(language: String)` - Force a language of your choice.\n3. `AVSpeechSynthesizerIPA.init?(languages: [String])` - Provide a list of language options.\n\n## Why must a language be provided?\nSomewhere in the internals of `AVspeechSynthesizer`'s `speak()` function, a language value is set the first time it's run. Instead of using the language supplied by `AVSpeechSynthesisVoice` used in `AVSpeechUtterance`, it accesses the user's preferred languages (probably via the UserDefaults key `AppleLanguages`. If the preferred language does not match the voice language, speech using IPA will not be at all accurate. Sounds will be mispronounced, some chatacters will be read as their character name instead of their sound, and some characters will be ignored.\n\nI have reported this as a bug (FB9688443). Ideally `speak()` would only use the language of the supplied voice each time it's run and would not need to reference the user's preferred langauges.\n\nThe init for `AVspeechSynthesizerIPA` ensures the pronunciations are accurate even on devices with incompatible primary languages. If the user's first preferred language is incompatible, their preferred languages in UserDefaults will temporarily be changed to the desired language, `speak()` is run on an empty string, and the languages are changed back again.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanlintott%2Foevoice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryanlintott%2Foevoice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryanlintott%2Foevoice/lists"}