Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@MuAuan

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

More than 1 year has passed since last update.

まだまだ初歩的だが、ファイルに記載された’かな’を音声で発生できるようになりました。
原理は、あいうえおかきくけこさしすせそ。。。わをん。。。が。。。という感じで録音して一音ずつ分離した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
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
MuAuan
2021年為になる記事にする 記事420いいね2000フォロワー200 2020年;いい記事を書く 記事359/350いいね1590/1500フォロワ ー144/150 2019年 記事275/300いいね1035/1000フォロワー97/100 2018年 記事140/200いいね423/500フォロワー48/50 7/8/2018 記事90いいね227フォロワー25

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?