Skip to content

Instantly share code, notes, and snippets.

@so-c
Last active June 8, 2023 14:04
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save so-c/3f92609556d7d5aa443bbb1e3b3c66d1 to your computer and use it in GitHub Desktop.
Save so-c/3f92609556d7d5aa443bbb1e3b3c66d1 to your computer and use it in GitHub Desktop.
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
Copy link
Author

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