Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Synthesizer V Studio Proで中国語/英語ボイスにひらがなをそれっぽく発音してもらうためのスクリプト / Synthesizer V scripts to enable Chinese/English voice to pronounce hiragana (Japanese)

Synthesizer Vの中国語/英語ボイスにひらがなを発音してもらうスクリプト

Synthesizer V Studio Proで中国語や英語ボイスにひらがなをそれっぽく発音してもらうためのスクリプトです。

インストール方法

  1. 下記のファイルをダウンロードして、Synthesizer Vのscriptsフォルダに保存する。※scriptsフォルダの場所はSyntheszer Vの[スクリプト > スクリプトフォルダを開く]で確認できる
    • PronounceHiraganaWithChineseVoice.js
    • PronounceHiraganaWithEnglishVoice.js
  2. 保存時にSynthesizer V Studioを起動していたら、[スクリプト > 再スキャン]で読み込み

使い方

  1. ノートにひらがなだけで歌詞をつける
    • 基本的な日本語の発音(50音と拗音)と、一部カタカナ英語の発音も対応
    • が行の鼻濁音を使用する場合は、そのノートに「が鼻」「ぎ鼻」……と入力していれば変換される
  2. そのノートを選択した状態でスクリプトを実行する

License

Synthesizer V scripts to enable Chinese/English voice to pronounce hiragana (Japanese)

Scripts to make Chinese/English voice pronounce hiragana (Japanese) on Synthesizer V Studio Pro.

Installation

  1. Download following scripts and save it in the scripts folder on Synthesizer V (note: The location of the scripts folder can be found from menu [Scripts > Open Scripts Folder]);
    • PronounceHiraganaWithChineseVoice.js
    • PronounceHiraganaWithEnglishVoice.js
  2. If Synthesizer V Studio was running when saving, load it with [Scripts > Rescan].

Usage

  1. Add lyrics to notes with just hiragana (Japanese).
    • Basic Japanese pronunciation (Japanese syllabary and contracted sound) and some katakana English pronunciation are supported.
    • If you enter "が鼻", "ぎ鼻" ... in the note, it will be pronounced as nasal sonants.
  2. Execute the script with the notes selected.

License

https://www.apache.org/licenses/LICENSE-2.0 Apache-2.0

function getClientInfo() {
return {
"name": SV.T("Pronounce Hiragana with Chinese Voice"),
"author": "SO_C",
"versionNumber": 1.2,
"minEditorVersion": 65537
};
}
function getTranslations(langCode) {
if (langCode == "ja-jp") {
return [
["Pronounce Hiragana with Chinese Voice", "中国語ボイスでひらがなを発音する"],
["Conversion error", "変換エラー"],
[" is not converted.", " を変換できませんでした。"]
];
}
return [];
}
function main() {
var selection = SV.getMainEditor().getSelection();
var selectedNotes = selection.getSelectedNotes();
for (var i = 0; i < selectedNotes.length; i++) {
var note = selectedNotes[i];
var hiragana = note.getLyrics();
note.setPhonemes(hiragana2ChinesePronounce(hiragana));
}
SV.finish();
}
// hiragana: 日本語ひらがな文字列
// returns:
// スペース区切りの中国語音素文字列
//
// references: https://twitter.com/shizumu96/status/1362542581645672453
//
function hiragana2ChinesePronounce(hiragana) {
var hiragana_array = hiragana.split("");
var chinese_pronounce = new Array();
for (var i = 0; i < hiragana_array.length; i++) {
var hiragana = hiragana_array[i];
switch (hiragana) {
// あ行
case "あ":
chinese_pronounce.push("a");
break;
case "い":
chinese_pronounce.push("i");
break;
case "う":
switch (hiragana_array[i + 1]) {
case "ぉ":
chinese_pronounce.push("w o");
i++;
break;
default:
chinese_pronounce.push("i\\");
break;
}
break;
case "え":
chinese_pronounce.push("e");
break;
case "お":
chinese_pronounce.push("uo");
break;
// か行
case "か":
chinese_pronounce.push("kh a");
break;
case "き":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("kh j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("kh j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("kh j uo");
i++;
break;
default:
chinese_pronounce.push("kh i");
break;
}
break;
case "く":
chinese_pronounce.push("kh i\\");
break;
case "け":
chinese_pronounce.push("kh e");
break;
case "こ":
chinese_pronounce.push("kh uo");
break;
// さ行
case "さ":
chinese_pronounce.push("s a");
break;
case "し":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("s` a");
i++;
break;
case "ゅ":
chinese_pronounce.push("s` i\\");
i++;
break;
case "ぇ":
chinese_pronounce.push("s` e");
i++;
break;
case "ょ":
chinese_pronounce.push("s` uo");
i++;
break;
default:
chinese_pronounce.push("s i");
break;
}
break;
case "す":
chinese_pronounce.push("s i\\");
break;
case "せ":
chinese_pronounce.push("s e");
break;
case "そ":
chinese_pronounce.push("s uo");
break;
// た行
case "た":
chinese_pronounce.push("th a");
break;
case "ち":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("ts`h a");
i++;
break;
case "ゅ":
chinese_pronounce.push("ts`h i\\");
i++;
break;
case "ぇ":
chinese_pronounce.push("ts`h e");
i++;
break;
case "ょ":
chinese_pronounce.push("ts`h uo");
i++;
break;
default:
chinese_pronounce.push("ts`h i");
break;
}
break;
case "つ":
chinese_pronounce.push("tsh i\\");
break;
case "て":
switch (hiragana_array[i + 1]) {
case "ぃ":
chinese_pronounce.push("th i");
i++;
break;
default:
chinese_pronounce.push("th e");
break;
}
break;
case "と":
chinese_pronounce.push("th uo");
break;
// な行
case "な":
chinese_pronounce.push("n a");
break;
case "に":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("n j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("n j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("n j uo");
i++;
break;
default:
chinese_pronounce.push("n i");
break;
}
break;
case "ぬ":
chinese_pronounce.push("n i\\");
break;
case "ね":
chinese_pronounce.push("n e");
break;
case "の":
chinese_pronounce.push("n uo");
break;
// は行
case "は":
chinese_pronounce.push("x a");
break;
case "ひ":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("x j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("x j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("x j uo");
i++;
break;
default:
chinese_pronounce.push("x i");
break;
}
break;
case "ふ":
switch (hiragana_array[i + 1]) {
case "ぁ":
chinese_pronounce.push("f a");
i++;
break;
case "ぃ":
chinese_pronounce.push("f i");
i++;
break;
case "ぇ":
chinese_pronounce.push("f e");
i++;
break;
case "ぉ":
chinese_pronounce.push("f o");
i++;
break;
default:
chinese_pronounce.push("x i\\");
break;
}
break;
case "へ":
chinese_pronounce.push("x e");
break;
case "ほ":
chinese_pronounce.push("x uo");
break;
// ま行
case "ま":
chinese_pronounce.push("m a");
break;
case "み":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("m j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("m j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("m j uo");
i++;
break;
default:
chinese_pronounce.push("m i");
break;
}
break;
case "む":
chinese_pronounce.push("m i\\");
break;
case "め":
chinese_pronounce.push("m e");
break;
case "も":
chinese_pronounce.push("m uo");
break;
// や行
case "や":
chinese_pronounce.push("j ia");
break;
case "ゆ":
chinese_pronounce.push("j i\\");
break;
case "よ":
chinese_pronounce.push("j uo");
break;
// ら行
case "ら":
chinese_pronounce.push("l a");
break;
case "り":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("l j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("l j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("l j uo");
i++;
break;
default:
chinese_pronounce.push("l i");
break;
}
break;
case "る":
chinese_pronounce.push("l i\\");
break;
case "れ":
chinese_pronounce.push("l e");
break;
case "ろ":
chinese_pronounce.push("l uo");
break;
// わ行
case "わ":
chinese_pronounce.push("w a");
break;
case "を":
chinese_pronounce.push("o");
break;
case "ん":
chinese_pronounce.push(":n");
break;
// 濁音
// が行
case "が":
switch (hiragana_array[i + 1]) {
case "鼻":
chinese_pronounce.push("N a");
i++;
break;
default:
chinese_pronounce.push("k a");
break;
}
break;
case "ぎ":
switch (hiragana_array[i + 1]) {
case "鼻":
chinese_pronounce.push("N i");
i++;
break;
case "ゃ":
chinese_pronounce.push("k j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("k j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("k j uo");
i++;
break;
default:
chinese_pronounce.push("k i");
break;
}
break;
case "ぐ":
switch (hiragana_array[i + 1]) {
case "鼻":
chinese_pronounce.push("N i\\");
i++;
break;
default:
chinese_pronounce.push("k i\\");
break;
}
break;
case "げ":
switch (hiragana_array[i + 1]) {
case "鼻":
chinese_pronounce.push("N e");
i++;
break;
default:
chinese_pronounce.push("k e");
break;
}
break;
case "ご":
switch (hiragana_array[i + 1]) {
case "鼻":
chinese_pronounce.push("N uo");
i++;
break;
default:
chinese_pronounce.push("k uo");
break;
}
break;
// ざ行
case "ざ":
chinese_pronounce.push("ts a");
break;
case "じ":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("ts\\ a");
i++;
break;
case "ゅ":
chinese_pronounce.push("ts\\ i\\");
i++;
break;
case "ぇ":
chinese_pronounce.push("ts\\ e");
i++;
break;
case "ょ":
chinese_pronounce.push("ts\\ uo");
i++;
break;
default:
chinese_pronounce.push("ts i");
break;
}
break;
case "ず":
chinese_pronounce.push("ts i\\");
break;
case "ぜ":
chinese_pronounce.push("ts e");
break;
case "ぞ":
chinese_pronounce.push("ts uo");
break;
// だ行
case "だ":
chinese_pronounce.push("t a");
break;
case "ぢ": // FIXME:「じ」のコピペ
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("ts\\ a");
i++;
break;
case "ゅ":
chinese_pronounce.push("ts\\ i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("ts\\ uo");
i++;
break;
default:
chinese_pronounce.push("ts i");
break;
}
break;
case "づ": // 「ず」と同じ
chinese_pronounce.push("ts i\\");
break;
case "で":
switch (hiragana_array[i + 1]) {
case "ぃ":
chinese_pronounce.push("t i");
i++;
break;
default:
chinese_pronounce.push("t e");
break;
}
break;
case "ど":
chinese_pronounce.push("t uo");
break;
// ば行
case "ば":
chinese_pronounce.push("p a");
break;
case "び":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("p j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("p j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("p j uo");
i++;
break;
default:
chinese_pronounce.push("p i");
break;
}
break;
case "ぶ":
chinese_pronounce.push("p i\\");
break;
case "べ":
chinese_pronounce.push("p e");
break;
case "ぼ":
chinese_pronounce.push("p uo");
break;
// 半濁音
// ぱ行
case "ぱ":
chinese_pronounce.push("ph a");
break;
case "ぴ":
switch (hiragana_array[i + 1]) {
case "ゃ":
chinese_pronounce.push("ph j a");
i++;
break;
case "ゅ":
chinese_pronounce.push("ph j i\\");
i++;
break;
case "ょ":
chinese_pronounce.push("ph j uo");
i++;
break;
default:
chinese_pronounce.push("ph i");
break;
}
break;
case "ぷ":
chinese_pronounce.push("ph i\\");
break;
case "ぺ":
chinese_pronounce.push("ph e");
break;
case "ぽ":
chinese_pronounce.push("ph uo");
break;
// 促音
case "っ":
chinese_pronounce.push("cl");
break;
default:
SV.showMessageBoxAsync(SV.T("Conversion error"), hiragana + SV.T(" is not converted."));
break;
}
}
return chinese_pronounce.join(" ");
}
function getClientInfo() {
return {
"name": SV.T("Pronounce Hiragana with English Voice"),
"author" : "SO_C",
"versionNumber" : 1.2,
"minEditorVersion" : 65537
};
}
function getTranslations(langCode) {
if(langCode == "ja-jp") {
return [
["Pronounce Hiragana with English Voice", "英語ボイスでひらがなを発音する"],
["Conversion error", "変換エラー"],
[" is not converted.", " を変換できませんでした。"]
];
}
return [];
}
function main() {
var selection = SV.getMainEditor().getSelection();
var selectedNotes = selection.getSelectedNotes();
for(var i = 0; i < selectedNotes.length; i ++) {
var note = selectedNotes[i];
var hiragana = note.getLyrics();
note.setPhonemes(hiragana2englishPronounce(hiragana));
}
SV.finish();
}
// hiragana: 日本語ひらがな文字列
// returns:
// スペース区切りの英語音素文字列
//
// references: https://twitter.com/shizumu96/status/1362542581645672453
//
function hiragana2englishPronounce(hiragana) {
var hiragana_array = hiragana.split("");
var english_pronounce = new Array();
for (var i = 0; i < hiragana_array.length; i++) {
var hiragana = hiragana_array[i];
switch (hiragana) {
// あ行
case "あ":
english_pronounce.push("ah");
break;
case "い":
english_pronounce.push("iy");
break;
case "う":
switch (hiragana_array[i+1]) {
case "ぉ":
english_pronounce.push("w ao r");
i++;
break;
default:
english_pronounce.push("uh");
break;
}
break;
case "え":
english_pronounce.push("eh");
break;
case "お":
english_pronounce.push("ao");
break;
// か行
case "か":
english_pronounce.push("k ah");
break;
case "き":
switch (hiragana_array[i+1]) {
case "ゃ":
english_pronounce.push("k y ah");
i++;
break;
case "ゅ":
english_pronounce.push("k y uh");
i++;
break;
case "ょ":
english_pronounce.push("k y ao");
i++;
break;
default:
english_pronounce.push("k iy");
break;
}
break;
case "く":
english_pronounce.push("k uh");
break;
case "け":
english_pronounce.push("k eh");
break;
case "こ":
english_pronounce.push("k ao");
break;
// さ行
case "さ":
english_pronounce.push("s ah");
break;
case "し":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("sh ah");
i++;
break;
case "ゅ":
english_pronounce.push("sh uh");
i++;
break;
case "ぇ":
english_pronounce.push("sh eh");
i++;
break;
case "ょ":
english_pronounce.push("sh ao");
i++;
break;
default:
english_pronounce.push("sh iy");
break;
}
break;
case "す":
english_pronounce.push("s uh");
break;
case "せ":
english_pronounce.push("s eh");
break;
case "そ":
english_pronounce.push("s ao");
break;
// た行
case "た":
english_pronounce.push("t ah");
break;
case "ち":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("ch ah");
i++;
break;
case "ゅ":
english_pronounce.push("ch uh");
i++;
break;
case "ぇ":
english_pronounce.push("ch eh");
i++;
break;
case "ょ":
english_pronounce.push("ch ao");
i++;
break;
default:
english_pronounce.push("ch iy");
break;
}
break;
case "つ":
english_pronounce.push("t uh");
break;
case "て":
switch (hiragana_array[i + 1]) {
case "ぃ":
english_pronounce.push("t iy");
i++;
break;
default:
english_pronounce.push("t eh");
break;
}
break;
case "と":
english_pronounce.push("t ao");
break;
// な行
case "な":
english_pronounce.push("n ah");
break;
case "に":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("n y ah");
i++;
break;
case "ゅ":
english_pronounce.push("n y uh");
i++;
break;
case "ょ":
english_pronounce.push("n y ao");
i++;
break;
default:
english_pronounce.push("n iy");
break;
}
break;
case "ぬ":
english_pronounce.push("n uh");
break;
case "ね":
english_pronounce.push("n eh");
break;
case "の":
english_pronounce.push("n ao");
break;
// は行
case "は":
english_pronounce.push("hh ah");
break;
case "ひ":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("hh y ah");
i++;
break;
case "ゅ":
english_pronounce.push("hh y uh");
i++;
break;
case "ょ":
english_pronounce.push("hh y ao");
i++;
break;
default:
english_pronounce.push("hh iy");
break;
}
break;
case "ふ":
switch (hiragana_array[i + 1]) {
case "ぁ":
english_pronounce.push("f ah");
i++;
break;
case "ぃ":
english_pronounce.push("f iy");
i++;
break;
case "ぇ":
english_pronounce.push("f eh");
i++;
break;
case "ぉ":
english_pronounce.push("f ao");
i++;
break;
default:
english_pronounce.push("hh uh");
break;
}
break;
case "へ":
english_pronounce.push("hh eh");
break;
case "ほ":
english_pronounce.push("hh ao");
break;
// ま行
case "ま":
english_pronounce.push("m ah");
break;
case "み":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("m y ah");
i++;
break;
case "ゅ":
english_pronounce.push("m y uh");
i++;
break;
case "ょ":
english_pronounce.push("m y ao");
i++;
break;
default:
english_pronounce.push("m iy");
break;
}
break;
case "む":
english_pronounce.push("m uh");
break;
case "め":
english_pronounce.push("m eh");
break;
case "も":
english_pronounce.push("m ao");
break;
// や行
case "や":
english_pronounce.push("y ah");
break;
case "ゆ":
english_pronounce.push("y uh");
break;
case "よ":
english_pronounce.push("y ao");
break;
// ら行
case "ら":
english_pronounce.push("l ah");
break;
case "り":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("r y ah");
i++;
break;
case "ゅ":
english_pronounce.push("r y uh");
i++;
break;
case "ょ":
english_pronounce.push("r y ao");
i++;
break;
default:
english_pronounce.push("l iy");
break;
}
break;
case "る":
english_pronounce.push("l uh");
break;
case "れ":
english_pronounce.push("l eh");
break;
case "ろ":
english_pronounce.push("l ao");
break;
// わ行
case "わ":
english_pronounce.push("w ah");
break;
case "を":
english_pronounce.push("ao");
break;
case "ん":
english_pronounce.push("ng");
break;
// 濁音
// が行
case "が":
switch (hiragana_array[i + 1]) {
case "鼻":
english_pronounce.push("ng ah");
i++;
break;
default:
english_pronounce.push("g ah");
break;
}
break;
case "ぎ":
switch (hiragana_array[i + 1]) {
case "鼻":
english_pronounce.push("ng iy");
i++;
break;
case "ゃ":
english_pronounce.push("g y ah");
i++;
break;
case "ゅ":
english_pronounce.push("g y uh");
i++;
break;
case "ょ":
english_pronounce.push("g y ao");
i++;
break;
default:
english_pronounce.push("g iy");
break;
}
break;
case "ぐ":
switch (hiragana_array[i + 1]) {
case "鼻":
english_pronounce.push("ng uh");
i++;
break;
default:
english_pronounce.push("g uh");
break;
}
break;
case "げ":
switch (hiragana_array[i + 1]) {
case "鼻":
english_pronounce.push("ng eh");
i++;
break;
default:
english_pronounce.push("g eh");
break;
}
break;
case "ご":
switch (hiragana_array[i + 1]) {
case "鼻":
english_pronounce.push("ng ao");
i++;
break;
default:
english_pronounce.push("g ao");
break;
}
break;
// ざ行
case "ざ":
english_pronounce.push("z ah");
break;
case "じ":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("zh ah");
i++;
break;
case "ゅ":
english_pronounce.push("zh uh");
i++;
break;
case "ぇ":
english_pronounce.push("zh eh");
i++;
break;
case "ょ":
english_pronounce.push("zh ao");
i++;
break;
default:
english_pronounce.push("zh iy");
break;
}
break;
case "ず":
english_pronounce.push("z uh");
break;
case "ぜ":
english_pronounce.push("z eh");
break;
case "ぞ":
english_pronounce.push("z ao");
break;
// だ行
case "だ":
english_pronounce.push("d ah");
break;
case "ぢ": // FIXME:「じ」のコピペ
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("zh ah");
i++;
break;
case "ゅ":
english_pronounce.push("zh uh");
i++;
break;
case "ょ":
english_pronounce.push("zh ao");
i++;
break;
default:
english_pronounce.push("zh iy");
break;
}
break;
case "づ": // 「ず」と同じ
english_pronounce.push("z uh");
break;
case "で":
switch (hiragana_array[i + 1]) {
case "ぃ":
english_pronounce.push("d iy");
i++;
break;
default:
english_pronounce.push("d eh");
break;
}
break;
case "ど":
english_pronounce.push("d ao");
break;
// ば行
case "ば":
english_pronounce.push("b ah");
break;
case "び":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("b y ah");
i++;
break;
case "ゅ":
english_pronounce.push("b y uh");
i++;
break;
case "ょ":
english_pronounce.push("b y ao");
i++;
break;
default:
english_pronounce.push("b iy");
break;
}
break;
case "ぶ":
english_pronounce.push("b uh");
break;
case "べ":
english_pronounce.push("b eh");
break;
case "ぼ":
english_pronounce.push("b ao");
break;
// 半濁音
// ぱ行
case "ぱ":
english_pronounce.push("p ah");
break;
case "ぴ":
switch (hiragana_array[i + 1]) {
case "ゃ":
english_pronounce.push("p y ah");
i++;
break;
case "ゅ":
english_pronounce.push("p y uh");
i++;
break;
case "ょ":
english_pronounce.push("p y ao");
i++;
break;
default:
english_pronounce.push("p iy");
break;
}
break;
case "ぷ":
english_pronounce.push("p uh");
break;
case "ぺ":
english_pronounce.push("p eh");
break;
case "ぽ":
english_pronounce.push("p ao");
break;
// 促音
case "っ":
english_pronounce.push("cl");
break;
default:
SV.showMessageBoxAsync(SV.T("Conversion error"), hiragana + SV.T(" is not converted."));
break;
}
}
return english_pronounce.join(" ");
}
@so-c

This comment has been minimized.

Copy link
Owner Author

@so-c so-c commented Feb 24, 2021

Ver 1.1@shizumu96 さんからいただいた拡張を反映

  • きゃ・ぎゃ・にゃ・ひゃ行:発音記号ミスの修正
  • ち:発音の改善
  • ちぇ・しぇ・じぇ・ふぇ・うぉ:追加
  • が行(鼻濁音):が行の直後に「鼻」を入力することで鼻濁音に変化
@so-c

This comment has been minimized.

Copy link
Owner Author

@so-c so-c commented Mar 28, 2021

Ver 1.2: @shizumu96 さんからいただいた、英語ボイス用スクリプト、README (日英) を修正のうえ追加。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment