LoginSignup
0
0

More than 1 year has passed since last update.

ゲームボーイで「あ・い・う・え・お」の母音を喋らせる

Posted at

概要

Hiyameshi氏の動画をご覧ください。

Hiyameshi 8BIT MUSIC

 なんと、ゲームボーイが歌っています! 動画の概要欄を確認しますと、この演奏にはゲームボーイの波形メモリを使用していることが明記されています。

 筆者も大変興味を抱きました。そこで、筆者が実験したことを通じ、ゲームボーイの波形メモリを使用して、母音を発声させる方法を説明します。

方法

ゲームボーイエミュレータのインストール

 筆者はゲームボーイを持ってはいますが、Hiyameshi氏のような空のカセットを持っていません。そこで、ゲームボーイのエミュレータを使用することにしました。

Visual Boy Advance - Game Boy Advance (GBA) Emulator

 こちらの、Visual Boy Advanceを採用しました。

 筆者の環境はMacですので、brewでインストールしました。

brew install --cask visualboyadvance-m

LSDjのダウンロード

 Hiyameshi氏の動画で使用されているのは、LSDjというソフトウェアです。Web上で公開されています。

Little Sound Dj

 こちらからダウンロードできます。LSDjをゲームボーイエミュレータ上で起動します。

音声合成の方法

 母音は、特定の周波数と振幅の正弦波を重ね合わせることで、合成することができます。この波形を、ゲームボーイの波形メモリに書き込むことで、ゲームボーイから母音を発声させることができます。

以下が、「あ・い・う・え・お」を合成するための正弦波の振幅と周波数です。

数値は、下記の動画を参考にしました。

声(母音)は三角関数(sin)の足し算で簡単に作れます

「あ」の振幅と周波数

A f
0.07 260
0.09 520
0.08 780
0.19 1040
0.08 1300

「い」の振幅と周波数

A f
0.19 260
0.03 520
0.02 2860
0.01 3120
0.02 3380

「う」の振幅と周波数

A f
0.32 260
0.11 520
0.02 1040
0.02 1300
0.13 1560

「え」の振幅と周波数

A f
0.18 260
0.14 520
0.13 780
0.03 1040
0.03 2860

「お」の振幅と周波数

A f
0.18 260
0.14 520
0.13 780
0.03 1040
0.03 2860

Pythonにて制作した、コマンドラインツール

 音声合成するだけであれば、先に述べたように正弦波を合成するだけで済みます。しかし、今回はLSDjの波形メモリに入力する必要があるため、合成した波形をプロットするツールを制作しました。

以下が、コードです。GitHub上にも公開しています。

GitHub - RitsuMurakami/Wavs2LSDj

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
import argparse
from PIL import Image

# args
parser = argparse.ArgumentParser(description="Hz to LSDj wave")
parser.add_argument("-f", help="name of csv file")
args = parser.parse_args()

if args.f == None:
    raise ValueError

# read csv file
df = pd.read_csv(args.f)
A = df['A'].values
f = df['f'].values

g = np.zeros((33, 33))

# Synthesise sin waves.
def wave(A, f, rad):
    x = 0
    for i, k in zip(A, f):
        x += i  * np.sin(k * rad)
    return x

# Drop sin waves into the LSDj wave grid.
def Cul(DIVIDER):
    for i in range(33):
        rad = 2 * np.pi * i / DIVIDER
        m = wave(A, f, rad)
        m = round(16 * m) + 16
        #m = math.ceil(16 * m) + 16
        if m > DIVIDER: m = DIVIDER
        g[m][i] = 1

def OutPut(DIVIDER):
    # y
    print(f'----DIVIDER: {DIVIDER} ----')
    for i in range(0, 33):
        p = str(i - 16).zfill(3)
        p += ' '
        # x
        for k in range(0, 32):
            if g[32 - i][k]:
                p += ''
            else:
                p += ''
        print(p)

# Output with several values
for i in range(5, 8):
    g = np.zeros((33, 33))
    Cul(2 ** i)
    OutPut(2 ** i)

使用方法です。

pyton3 Voice.py -f "ファイル名.csv"

結果

「あ」の波形

----DIVIDER: 128 ----
-16                                 
-15                                 
-14                                 
-13                                 
-12                                 
-11                                 
-10                                 
-09                                 
-08                                 
-07                                 
-06                                 
-05                                 
-04                                 
-03                                 
-02                                 
-01                                 
000                                 
001                                 
002                                 
003                                 
004                                 
005                                 
006                                 
007                                 
008                                 
009                                 
010                                 
011                                 
012                                 
013                                 
014                                 
015                                 
016                                

「い」の波形

----DIVIDER: 128 ----
-16                                 
-15                                 
-14                                 
-13                                 
-12                                 
-11                                 
-10                                 
-09                                 
-08                                 
-07                                 
-06                                 
-05                                 
-04                                 
-03                                 
-02                                 
-01                                 
000                                 
001                                 
002                                 
003                                 
004                                 
005                                 
006                                 
007                                 
008                                 
009                                 
010                                 
011                                 
012                                 
013                                 
014                                 
015                                 
016                                

「う」の波形

----DIVIDER: 128 ----
-16                                 
-15                                 
-14                                 
-13                                 
-12                                 
-11                                 
-10                                 
-09                                 
-08                                 
-07                                 
-06                                 
-05                                 
-04                                 
-03                                 
-02                                 
-01                                 
000                                 
001                                 
002                                 
003                                 
004                                 
005                                 
006                                 
007                                 
008                                 
009                                 
010                                 
011                                 
012                                 
013                                 
014                                 
015                                 
016                                

「え」の波形

----DIVIDER: 128 ----
-16                                 
-15                                 
-14                                 
-13                                 
-12                                 
-11                                 
-10                                 
-09                                 
-08                                 
-07                                 
-06                                 
-05                                 
-04                                 
-03                                 
-02                                 
-01                                 
000                                 
001                                 
002                                 
003                                 
004                                 
005                                 
006                                 
007                                 
008                                 
009                                 
010                                 
011                                 
012                                 
013                                 
014                                 
015                                 
016                                

「お」の波形

----DIVIDER: 128 ----
-16                                 
-15                                 
-14                                 
-13                                 
-12                                 
-11                                 
-10                                 
-09                                 
-08                                 
-07                                 
-06                                 
-05                                 
-04                                 
-03                                 
-02                                 
-01                                 
000                                 
001                                 
002                                 
003                                 
004                                 
005                                 
006                                 
007                                 
008                                 
009                                 
010                                 
011                                 
012                                 
013                                 
014                                 
015                                 
016                                

 これらの波形を元に、微調整しながらLSDjに打ち込みました。鳴らすと、確かに「あ・い・う・え・お」に聞こえました。

参考

ソースフィルタモデルで母音を音声合成 - ねっちゅう音響処理工房

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0