Macでテキストを音声データ(MP3)に一括変換

  • Updated: 2023.06.12
  • Published: 2023.04.06
  • 912views
  • Mac
  • MP3
  • Node.js

概要

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


おわりに

テキストを一括で変換できるようになりましたが、この音声が商用利用できるかは調べていません。

関連記事

人気の投稿

最新の投稿

タグ

月別アーカイブ

Contact

WEB制作の依頼など気軽にお問い合わせください。

お問い合わせ