概要
Macでテキストを一括で音声データに変換する方法です。
テキストを音声データに変換(aiff)
Macではテキストを右クリックで音声データに変換することができます。
1、テキストを選択して > 右クリック > スポークントラックとして”ミュージック”に追加
2、システムの声選択とファイル名指定
システムの声は「Kyoko」「Otoya」など日本語に対応した音声を選択します。
3、ミュージックにaiff形式で保存される
ミュージックアプリに音声が追加されます。
ターミナルからシステムの声を鳴らすことが可能
ターミナルで下記コマンドを実行すると音声で「あいうえお」を再生されます。
say あいうえお
-v オプションでシステムの声を指定できます。
下記では「Otoya」という男性の声で再生されます。
say -v Otoya あいうえお
-v ‘?’ で使用できる音声を確認できます。
say -v '?'
Jester en_US # Please stop tickling me!
Ioana ro_RO # Bună, mă cheamă Ioana. Sunt o voce românească.
Jacques fr_FR # Bonjour, je m’appelle Jacques.
Joana pt_PT # Olá, chamo-me Joana e dou voz ao português falado em Portugal.
Junior en_US # My favorite food is pizza.
Kanya th_TH # สวัสดีค่ะ ดิฉันชื่อกันยา
Karen en_AU # Hello, my name is Karen. I am an Australian-English voice.
Kathy en_US # Isn't it nice to have a computer that will talk to you?
Kyoko ja_JP # こんにちは、私の名前はきょうこです。日本語の音声をお届けします。
Kyoko (Enhanced) ja_JP # こんにちは、私の名前はきょうこです。日本語の音声をお届けします。
Lana hr_HR # Bog! Moje je ime Lana. Ja sam hrvatski glas.
Laura sk_SK # Ahoj. Volám sa Laura. Som hlas v slovenskom jazyku.
Lekha hi_IN # नमस्कार, मेरा नाम लेखा है! मैं हिन्दी में बोलने वाली आवाज़ हूँ!
Lesya uk_UA # Привіт, мене звуть Леся. Я — український голос.
Linh vi_VN # Xin chào, tên tôi là Linh. Tôi là giọng nói Tiếng Việt.
Luciana pt_BR # Olá, o meu nome é Luciana e a minha voz corresponde ao português que é falado no Brasil
Majed ar_001 # مرحبًا، اسمي ماجد. أنا صوتٌ عربي.
Tünde hu_HU # Üdvözlöm! Tünde vagyok. Én vagyok a magyar hang.
Meijia zh_TW # 你好,我叫美佳。我說國語。
Melina el_GR # ονομάζομαι Μελίνα. Μιλάω ελληνικά.
Milena ru_RU # Здравствуйте, меня зовут Милена. Я — русский голос системы.
Moira en_IE # Hello, my name is Moira. I am an Irish-English voice.
Mónica es_ES # Hola, me llamo Mónica y soy una voz española.
Montse ca_ES # Hola, em dic Montse i soc una veu catalana.
Nora nb_NO # Hei, jeg heter Nora. Jeg er en norsk stemme.
Organ en_US # We must rejoice in this morbid voice.
Otoya ja_JP # こんにちは、私の名前はOtoyaです。日本語の音声をお届けします。
Otoya (Enhanced) ja_JP # こんにちは、私の名前はOtoyaです。日本語の音声をお届けします。
Paulina es_MX # Hola, me llamo Paulina y soy una voz mexicana.
Superstar en_US # When I grow up I'm going to be a scientist.
Ralph en_US # The sum of the squares of the legs of a right triangle is equal to the square of the hypotenuse.
ファイルに出力することもできます。
「test.mp4」というファイルに出力されます。
say -v Otoya あいうえお -o test.mp4
出力できるフォーマットは下記コマンドで確認できます。
say --file-format '?'
3gp2 3GPP-2 Audio (.3g2,.3gp2) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp]
3gpp 3GP Audio (.3gp,.3gpp) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp]
AIFC AIFC (.aifc,.aiff,.aif) [lpcm,ulaw,alaw,ima4,Qclp]
AIFF AIFF (.aiff,.aif) [lpcm]
BW64 WAVE (BW64 for length over 4 GB) (.wav) [lpcm,ulaw,alaw]
NeXT NeXT/Sun (.snd,.au) [lpcm,ulaw,alaw]
RF64 WAVE (RF64 for length over 4 GB) (.wav) [lpcm,ulaw,alaw]
Sd2f Sound Designer II (.sd2) [lpcm]
W64f Wave64 (.w64) [lpcm,ulaw,alaw]
WAVE WAVE (.wav) [lpcm,ulaw,alaw]
adts AAC ADTS (.aac,.adts) [aac,aach,aacp]
caff CAF (.caf,.caff) [Qclp,aac,aace,aacf,aacg,aach,aacl,aacp,alac,alaw,flac,ilbc,ima4,lpcm,opus,ulaw]
flac FLAC (.flac) [flac]
loas LATM/LOAS (.loas,.latm,.xhe) [aac,aace,aacf,aacg,aach,aacl,aacp]
m4af Apple MPEG-4 Audio (.m4a,.m4r) [aac,aace,aacf,aacg,aach,aacl,aacp,alac,flac,lpcm]
m4bf Apple MPEG-4 AudioBooks (.m4b) [aac,aace,aacf,aacg,aach,aacl,aacp]
mp4f MPEG-4 Audio (.mp4,.mpg4) [aac,aace,aacf,aacg,aach,aacl,aacp,alac,flac,lpcm]
じつはMP3に変換できない
私が携わっていた案件はMP3が必要だったので「say」コマンドでaiffフォーマットに変換「ffmpeg」でaiffからMP3に変換することにします。
一括変換の環境構築
一括変換用のCSVを用意して、Node.jsで読み込んで変換していきます。
text,name
あいうえお,a
かきくけこ,ka
さしすせそ,sa
たちつてと,ta
なにぬねの,na
CSVの「text」が音声に変換したいテキスト、「name」がファイル名になります。
{
"name": "text2mp3",
"version": "1.0.0",
"description": "test",
"main": "index.js",
"scripts": {
"test1": "say こんにちは",
"test2": "say -v Otoya こんにちは",
"build": "node text2mp3.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"child_process": "^1.0.2",
"csv-parser": "^3.0.0",
"fs": "^0.0.1-security"
}
}
使用モジュール
child_process ・・・シェルコマンド実行
csv-parser ・・・CSVをオブジェクトに変換
fs ・・・ファイル操作
const { exec } = require("child_process");
const fs = require("fs");
const csv = require("csv-parser");
const list = [];
let count = 0;
let loadfile = "data.csv";
let aiff = "./aiff";
let mp3 = "./mp3";
const makeAiff = () => {
if (!fs.existsSync(aiff)) {
fs.mkdir(aiff, (err) => {
if (err) {
console.log(err.toString());
return;
}
makeMp3();
});
} else {
fs.rmdir(aiff, { recursive: true, force: true }, (err) => {
if (err) throw err;
fs.mkdir(aiff, (err) => {
if (err) {
console.log(err.toString());
return;
}
makeMp3();
});
});
}
};
const makeMp3 = () => {
if (!fs.existsSync(mp3)) {
fs.mkdir(mp3, (err) => {
if (err) {
console.log(err.toString());
return;
}
loadCsv();
});
} else {
fs.rmdir(mp3, { recursive: true, force: true }, (err) => {
if (err) throw err;
fs.mkdir(mp3, (err) => {
if (err) {
console.log(err.toString());
return;
}
loadCsv();
});
});
}
};
const loadCsv = () => {
fs.createReadStream(loadfile)
.pipe(csv())
.on("data", function (data) {
list.push(data);
})
.on("end", function () {
textConvert();
});
};
const textConvert = () => {
let item = list[count];
let s = `say ${item.text} -v kyoko -o ./aiff/${item.name}`;
let o = `ffmpeg -i ./aiff/${item.name}.aiff ./mp3/${item.name}.mp3`;
if (fs.existsSync(`./mp3/${item.name}.mp3`)) {
console.log(`pass: ${item.name}.mp3`);
next();
} else {
exec(s, (err, stdout, stderr) => {
if (err) {
console.log(`stderr: ${stderr}`);
return;
}
exec(o, (err, stdout, stderr) => {
if (err) {
console.log(`stderr: ${stderr}`);
return;
}
console.log(`text:${item.text} => mp3: ${item.name}.mp3`);
next();
});
});
}
};
const next = () => {
count++;
if (count < list.length) {
setTimeout(() => {
textConvert();
}, 10);
} else {
fs.rmdir(aiff, { recursive: true }, (err) => {
if (err) throw err;
console.log("COMLETE!");
});
}
};
makeAiff();
1、フォルダ作成
2、CSV読み込み
3、テキストを音声ファイルaiffに変換
4、ffmpegでaiffからMP3に変換
実行
npm run build
ソース
https://github.com/hiron712/mac-text2mp3
おわりに
テキストを一括で変換できるようになりましたが、この音声が商用利用できるかは調べていません。
商用利用は不可になります。
https://support.apple.com/ja-jp/guide/mac-help/mchldfd72333/mac