LoginSignup
2
2

More than 3 years have passed since last update.

【おしゃべる】ファイルに記載のかなを音声に変換する♬

Posted at

まだまだ初歩的だが、ファイルに記載された’かな’を音声で発生できるようになりました。
原理は、あいうえおかきくけこさしすせそ。。。わをん。。。が。。。という感じで録音して一音ずつ分離したwavファイルを保管しておきます。
そして、一音ずつ連続再生すると文章を読むような感じになります。
女性声を目指して若干ウワンより高めの声で読みます。

やったこと

・最初の一歩
・日本語を読ませて発声する
・ファイルを読ませて発声する

最初の一歩

# -*- coding:utf-8 -*-
import pyaudio
import numpy as np
import wave

RATE=44100
CHUNK = 22050
p=pyaudio.PyAudio()

f_list=['a','i','si','te','ru','u','wa','n','sa','n']

stream=p.open(format = pyaudio.paInt16,
        channels = 1,
        rate = int(RATE*1.15),
        frames_per_buffer = CHUNK,
        input = True,
        output = True) # inputとoutputを同時にTrueにする
w = wave.Wave_write("./fft_sound/Success_a-n_05/a-n-iine/aiueo/ohayo005_sin.wav")
p = (1, 2, RATE, CHUNK, 'NONE', 'not compressed')
w.setparams(p)

for i in f_list:
    wavfile = './fft_sound/Success_a-n_05/a-n-iine/aiueo/'+i+'.wav'
    print(wavfile)
    wr = wave.open(wavfile, "rb")
    input = wr.readframes(wr.getnframes())
    output = stream.write(input)
    w.writeframes(input)

こんなに簡単なコードでf_list=['a','i','si','te','ru','u','wa','n','sa','n']と発声してくれました。
しかも音声は少しアップrate = int(RATE*1.15)しています。
そして、その音声はohayo005_sin.wavに録音されます。

・日本語を読ませて発声する

これも上記とほとんど同じですが、以下の関数等を追加します。

。。。
f_list=['あ','い','し','て','る','う','わ','ん','さ','ん','ま','る']
def kana2a(i):
    j='n'
    if i=='あ':
        j='a'
    elif i=='い':
        j='i'
    elif i=='し':
        j='si'
    elif i=='て':
        j='te'
    elif i=='る':
        j='ru'
    elif i=='う':
        j='u'
    elif i=='わ':
        j='wa'        
    elif i=='ん':
        j='n'        
    elif i=='さ':
        j='sa'  
    elif i=='ま':
        j='ma'          
    return j

for i in f_list:
    i=kana2a(i)
。。。

これで、見事にf_list=['あ','い','し','て','る','う','わ','ん','さ','ん','ま','る']という日本語を読んでくれました。

・ファイルを読ませて発声する

今夜の最後は以下が記述されているテキストファイルを読んで、発声することです。

sentence.txt
あ い し て る う わ ん さ ん

コードは以下のとおりです。

# -*- coding:utf-8 -*-

import pyaudio
import numpy as np
import wave
import struct

RATE=44100
CHUNK = 22050
p=pyaudio.PyAudio()

file1 = open("sentence2.txt","r",encoding="utf-8") 
sentence=file1.read()
print(sentence)
f_list=sentence.split(" ")
stream=p.open(format = pyaudio.paInt16,
        channels = 1,
        rate = int(RATE*1.15),
        frames_per_buffer = CHUNK,
        input = True,
        output = True) # inputとoutputを同時にTrueにする

w = wave.Wave_write("./fft_sound/Success_a-n_05/a-n-iine/aiueo/ohayo005_sin.wav")
p = (1, 2, RATE, CHUNK, 'NONE', 'not compressed')
w.setparams(p)

def kana2a(i):
    j='n'
    if i=='あ':
        j='a'
    elif i=='い':
        j='i'
    elif i=='し':
        j='si'
    elif i=='て':
        j='te'
    elif i=='る':
        j='ru'
    elif i=='う':
        j='u'
    elif i=='わ':
        j='wa'        
    elif i=='ん':
        j='n'        
    elif i=='さ':
        j='sa'  
    elif i=='ま':
        j='ma'          
    return j

for i in f_list:
    i=kana2a(i)
    wavfile = './fft_sound/Success_a-n_05/a-n-iine/aiueo/'+i+'.wav'
    print(wavfile)
    wr = wave.open(wavfile, "rb")
    input = wr.readframes(wr.getnframes())
    output = stream.write(input)
    w.writeframes(input)

以下の三行で日本語テキストが読み込み、sentenceに代入し、f_list=['あ', 'い', 'し', 'て', 'る', 'う', 'わ', 'ん', 'さ', 'ん']を作成してくれます。
※ここで「,encoding="utf-8"」を記載することが日本語入力のミソです
参考では、「,encoding="utf-8_sig"」でできたとのことですが、ウワンは通常のものでできました
【参考】
WindowsでCP932(Shift-JIS)エンコード以外のファイルを開くのに苦労した話

file1 = open("sentence2.txt","r",encoding="utf-8") 
sentence=file1.read()
f_list=sentence.split(" ")

ということで、ほとんどの文章は「かな」レベルで発声できるようになりました。

まとめ

・音声をフレーズとして発声させてみた
・音の高低を変換して出力できる
・テキストファイルを読み込んで発声させることができた

・すべての音に対応させる予定である

おまけ

以下にコードを置くと共に、発声した音声を置いた
AudioAutoencoder/make_sentence.py
AudioAutoencoder/data/ohayo005_sin.wav

2
2
0

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
2
2