音声のテキスト化(ほぼ完成) | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

Pythonで日本語音声をテキスト化する

 

ただ 50MB以上 の大きな音声ファイルだと エラー になってしまいます

そこで 音声ファイルを小さく 約20MB程度 に細かく分割し

テキストファイル に追記することにしました

 

①これを マイクを使った形に変更すれば

ブログに掲載する記事を

ほぼ 音声 だけでアップする準備ができてしまうことになります

 

※これは訂正します。 発話とブログの メリハリ(区切り、♪、<>, 絵文字、 声の大小、 声の高低、テンポやリズム、声色、声の表情、アクセントやイントネーションなど)や間 は違うハズです

 

NLP オーディオコンテンツのテキスト化 も出来るはずです

(もちろん私個人用として)

 

青空文庫

かえるの王様 より

 

コード

import wave
import struct
import math
import os
from scipy import fromstring, int16

# 一応既に同じ名前のディレクトリがないか確認。
file = os.path.exists("output")
print(file)

if file == False:
    #保存先のディレクトリの作成
    os.mkdir("output")

def cut_wav(filename,time):  # WAVファイルを刈り奪る 形をしてるだろ? 
    # timeの単位は[sec]

    # ファイルを読み出し
    wavf = filename + '.wav'
    wr = wave.open(wavf, 'r')

    # waveファイルが持つ性質を取得
    ch = wr.getnchannels()
    width = wr.getsampwidth()
    fr = wr.getframerate()
    fn = wr.getnframes()
    total_time = 1.0 * fn / fr
    integer = math.floor(total_time) # 小数点以下切り捨て
    t = int(time)  # 秒数[sec]
    frames = int(ch * fr * t)
    num_cut = int(integer//t)

    # 確認用
    print("Channel: ", ch)
    print("Sample width: ", width)
    print("Frame Rate: ", fr)
    print("Frame num: ", fn)
    print("Params: ", wr.getparams())
    print("Total time: ", total_time)
    print("Total time(integer)",integer)
    print("Time: ", t) 
    print("Frames: ", frames) 
    print("Number of cut: ",num_cut)

    # waveの実データを取得し、数値化
    data = wr.readframes(wr.getnframes())
    wr.close()
    X = fromstring(data, dtype=int16)
    print(X)


    for i in range(num_cut):
        print(i)
        # 出力データを生成
        outf = 'output/' +str("{0:05d}".format(i)) + '.wav' 
        start_cut = i*frames
        end_cut = i*frames + frames
        print(start_cut)
        print(end_cut)
        Y = X[start_cut:end_cut]
        outd = struct.pack("h" * len(Y), *Y)

        # 書き出し
        ww = wave.open(outf, 'w')
        ww.setnchannels(ch)
        ww.setsampwidth(width)
        ww.setframerate(fr)
        ww.writeframes(outd)
        ww.close()

print("input filename = ")
f_name = input()
#print("cut time = ")
#cut_time = input()
cut_wav(f_name,150)

 

import speech_recognition as sr
from datetime import datetime
from pathlib import Path
import glob

txt = "test1.txt"
files = sorted(glob.glob('./output/' + '*.wav'))
r = sr.Recognizer()

cnt1 = 0
for file in files: 
    with sr.AudioFile(file) as source:
        audio = r.record(source)
 
    text = r.recognize_google(audio, language='ja-JP')
    with open(txt,'a') as f: #ファイルの末尾に追記していく
            f.write("
" + text)
    cnt1 += 1

 

 

結果(全文OK)

昔々 誰のどんな望みでも 思うようにかなった時のことでございます 


あるところに 一人の王様がありました 
その王様には 美しいお姫様がたくさんありました 


その中でも一番のお姫様は それはそれは美しい形で 

世の中のことは何でも見て知っていらっしゃる 
おひさまでさえ 毎日照らしてみて そのたんびに ビックリ なさるほどでした

 
さて この王様のお城の近くに こんもり 深く茂った森があって 

その森の中に 一本ある古い菩提樹の木の下に 

綺麗な身(泉か?)がこんこんと 吹き出していました

 
暑い夏の日 盛りにお姫様は よくその森へ出かけて行って いずみのそばに 腰を下ろして休みました 
そして 対するとキンのマリオでって それを高く投げては手で受け取ったりして

それを何より面白い遊びにしていました 


ある日 お姫様はこの森に来て 

いつものように 来 なあまり投げをして遊んでいるうちに 
マリが手からそれて落ちて 泉の中で ころころころ家こんでしまいました 


お姫様は びっくりして そのまりの行方を眺めていましたが 
まりは水の中に沈んだまま 分からなくなってしまいました 

和泉はとても深くて・・・・・・・・・・