Help:Extension:Phonos
The Phonos extension makes it easy to embed text-to-speech audio snippets in wiki pages.
Usage
Phonos adds a parser tag that will render a speaker icon and the IPA text. Clicking on these will play the appropriate audio.
The parser tag has the following structure; all parameters are optional but at least one other than lang
must be provided:
<phonos ipa="[IPA notation]" text="[plain text]" lang="[language]" wikibase="[id]" file="[filename]">[label]</phonos>
ipa
— The IPA notation to render. Some engines may perform better with or without brackets around the string. If you can't get the engine to render the IPA you want, you can specifyipa="-"
and then usetext
(see below) to provide the plain text of what you want to render.text
— The plain text representation of the string, used as a fallback by some engines when they are not able to render the IPA[1], and also will be used as the button label if nolabel
content is provided.lang
— The language code, used to help the engine have better pronunciation and/or to choose the correct information from Wikidata. This defaults to the content language of the page the parser tag is used on.- If used in combination with
wikibase
this must equal the Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P305) value of the Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P407) qualifier for Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P898) and/or Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P443).
- If used in combination with
wikibase
— ID of the Wikidata item or lexeme from which to fetch Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P898) (ifipa
is not used) and/or Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P443) (iffile
is not used). When providing a lexeme, thetext
parameter must also be provided and exactly match the lexeme representation.file
— The filename of an audio file from Commons to use instead of any engine-generated or Wikidata-retrieved audio. This should be the base filename not includingFile:
, for examplefile="Example.ogg"
.label
(optional, NOT an attribute, usually empty) — The label that will be displayed, overriding anyipa
. This can contain wikitext.
Usage notes
Some voice models used by text-to-speech engines do not support every available phoneme — if an unrecognised phoneme is passed in the ipa
, engines which support reading the text
parameter will do so instead.
To ensure only the IPA is rendered, do not pass the text
parameter.
Inline audio player mode
Phonos can be placed into PhonosInlineAudioPlayerMode
on a per-wiki basis. In this mode, only supplied audio files will play – either specified with the file=
parameter, or a file referenced by an item specified by the wikibase=
parameter.
IPA rendering is not available in inline audio player mode.
Examples
Wikitext | Output when PhonosInlineAudioPlayerMode is enabled | Output when PhonosInlineAudioPlayerMode is disabled |
---|---|---|
<phonos file="Voiceover-mathml-example-1.wav">Listen</phonos>
|
<phonos file="Voiceover-mathml-example-1.wav">Listen</phonos> | <phonos file="Voiceover-mathml-example-1.wav">Listen</phonos> |
<phonos ipa="kæt" />
|
<phonos ipa="kæt"/> | File:OOjs UI icon volumeUp-ltr.svg kæt |
<phonos wikibase="Q37" lang="lb" />
|
<phonos wikibase="Q37" lang="lb" /> | <phonos wikibase="Q37" lang="lb" /> |
Deployment
Established wikis may already have a template that is used to render IPA. In such cases, it may be desirable to have it use Phonos so that all existing usage of IPA will automatically use Phonos. A list of most of these templates at Wikimedia can be found in the sitelinks at Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (Q5751017). Here will cover some basic examples on how to change these templates to use Phonos.
Precautionary notes
Check how many transclusions the template has.[2] If there are a lot (several hundred or more), you may wish to do some testing before editing a live template, such as using TemplateSandbox. If the template has hundreds of thousands or millions of transclusions, extreme caution should be used, with thorough testing before editing the live template. Alternatively, a safer route might be to introduce a new template and have the community slowly start using that, ensuring Phonos acts as it should along the way. Later, the main template can be updated, and the newer one simply redirect to it.
In addition, some wikis have multiple IPA templates that may call each other. Template editors should be cautious to edit these templates in the right order so that calls to Phonos aren't duplicated.
Lastly, if your wiki wishes to customize the tracking categories used by Phonos, do so before updating any templates that would cause a large-scale deployment. The following tracking categories are used by Phonos:
Category name | Interface page |
---|---|
⧼phonos-tracking-category⧽ | MediaWiki:Phonos-tracking-category |
⧼phonos-error-category⧽ | MediaWiki:Phonos-error-category |
Simple example
Let's consider a typical IPA template, which only applies styling:
<span style="font-family:DejaVu Sans, sans-serif; text-decoration:underline dotted;">{{{1|<noinclude>hə'ləʊ</noinclude>}}}</span>
In this case, we replace the entire template with the Phonos syntax, something like:
{{#tag:phonos|{{{1|<noinclude>hə'ləʊ</noinclude>}}}|ipa={{{1|<noinclude>hə'ləʊ</noinclude>}}}}|lang={{{lang|{{PAGELANGUAGE}}}}}}}
Note we need to use the {{#tag}} parser function since this is in a template, but it will render the same as:
<phonos ipa="hə'ləʊ" lang="{{{lang|{{PAGELANGUAGE}}}}}">hə'ləʊ</phonos>
We also added the |lang=
attribute, since that is required for Phonos. We also made it a parameter to the template in case the IPA is something different than the page language.
Taking it a step further, we can expand the template to include any of the other features Phonos provides, such as a custom label, and pulling audio from a file or Wikidata.
{{#tag:phonos|{{{1|{{{label|<noinclude>Hello</noinclude>}}}}}}|ipa={{{1|<noinclude>hə'ləʊ</noinclude>}}}}|lang={{{lang|{{PAGELANGUAGE}}}}}|text={{{text|<noinclude>hello</noinclude>}}}|wikibase={{{wikidata|}}}|file={{{file|}}}}}
The template now has the additional parameters |label=
(which is the same as the unnamed |1=
parameter), |text=
, |wikidata=
, and |file=
. It's OK if current transclusions don't make use of these options, but now they are there so your community can take advantage of these features Phonos offers.
Complex example
English Wikipedia has several more language-specific versions of IPA templates, such as {{IPAc-en}} along with other language variants. These are implemented through a Lua module at Module:IPAc-en. Instructions on how to implement this in Lua is outside the scope of this documentation, but we will still explain what needs to be done on a high-level, as if it were implemented in wikitext like normal templates.
Each argument passed to {{IPAc-en}} is an individual diaphoneme. Phonos does not support this natively, so the Lua module must concatenate the diaphonemes into a single string like hə'ləʊ
and call the parser tag from the Lua module. Additionally, this template links to a IPA help page. It may not be necessary to have this link anymore since Phonos produces actual audio, so you don't need to link to a guide on how to read IPA. However, let's assume we want to keep the link. In such a case we can't utilize the label of the <phonos>
tag, since that is always a link to play the audio. Instead, you'll want to put the link adjacent to the Phonos tag. The resulting wikitext (with all other available Phonos features) would look something like:
{{#tag:phonos||ipa={{{1|<noinclude>hə'ləʊ</noinclude>}}}}|lang={{{lang|{{PAGELANGUAGE}}}}}|text={{{text|<noinclude>hello</noinclude>}}}|wikibase={{{wikidata|}}}|file={{{file|}}}}} [[Help:IPA|{{{1|{{{label|<noinclude>Hello</noinclude>}}}}}}]]
Notice the double pipes ||
at the beginning, which is where the label for the <phonos>
tag normally goes. Here we leave it blank, and put the link to the IPA help page adjacent to the Phonos tag, so you have a playable File:OOjs UI icon volumeUp-ltr.svg icon followed by the link.
Inline audio templates
As explained in the last example, it's possible to make Phonos render only a File:OOjs UI icon volumeUp-ltr.svg icon that plays the audio when clicked. You don't have to use IPA either, instead you can link to an existing file or Wikidata item (assuming the item has the Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (P898) property). This is useful if you already have human-recorded audio for the word, and there's no need to render it through the Phonos engine.
On English Wikipedia, such a template exists as Template:Audio (see cross-wiki usage at Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (Q5622389)). However without Phonos, when you click on the play icon the user is brought to a separate page to listen to the audio. Phonos allows you to play the file without leaving the page.
A basic implementation for this would be similar to the following:
{{#tag:phonos||wikibase={{{wikidata|}}}|file={{{1|}}}}}
Similarly there is Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (Q6190820), which is the same except it is meant to display IPA as well. On English Wikipedia, this ends up using both Template:Audio and Template:IPA. Assuming Template:IPA now supports the |file=
parameter as we implemented in the simple example above, you could simply change the entire Audio-IPA template to use Template:IPA, something like:
{{IPA|{{{2}}}|file={{{1}}}}}
Some wikis have yet another similar template, Lua error in Module:Wikidata_label at line 271: attempt to index field 'wikibase' (a nil value). (Q8140322). The implementation there would be similar to the one just above where you call the newly changed Template:IPA that accepts a filename.
Styling
Phonos provides its own styling in an effort to keep IPA rendering consistent across all wikis, but you can still override the styling in your template using TemplateStyles if you wish.
Getting help
If you need help deploying Phonos to your wiki's templates, please feel free to reach out to us at meta:Talk:Community Wishlist Survey 2022/Generate Audio for IPA.
JavaScript integration
Phonos provides a front-end hook to mutate the Audio object created by Phonos.
Hook | Type | Description |
---|---|---|
ext.Phonos.audio
|
HTMLAudioElement
|
The Audio object for the file used by Phonos |
This can for example be used to control playblack speed with a gadget or user script, such as with the following:
mw.hook( 'ext.Phonos.audio' ).add( function ( audio ) {
audio.playbackRate = 0.5;
} );
Notes
- ↑ See usage notes
- ↑ This can be done use toolforge:linkcount