본문 바로가기

Autohotkey강좌

Autohotkey #34, Text To Speech SaveToFile, TTS음성파일 저장하기

반응형

https://youtu.be/Ppq1r8CVu8o

기존에 Text To Speech 기능을 이용하여 Text 내용을 읽어 주는 프로그램을 올려 드렸던 적이 있습니다. 해당 내용에 대해서 생각보다 많은 분들이 관심을 가지져서, 이번에는 해당 음성을 파일로 저장하는 부분을 연습해 보겠습니다. 

 

먼저 GUI 구성을 간단하게 해 보겠습니다.

 

이쁘지는 않지만 최소 기능만 넣도록 하겠습니다. 

우선 어떤 파일을 읽어서 어디에 저장할지만 정하는 것입니다.

읽을 파일은 Select File단추를 눌러서 선택하도록 해 주고, 저장할 파일이름도 역시 Select File 단추를 누른 후 원하는 폴더 아래에 원하는 이름으로 주면 해당 이름으로 파일이 저장됩니다. 저장가능한 확장자는 mp3, wav, aif, m4a, mid, mpa, wma 등입니다. 만약 지원하지 않는 확장자를 입력할 경우 오류가 발생할 것입니다. 해당 오류에 대한 처리 부분은 구현하지 않았으므로 참고하시고, 필요할 경우 직접 구현해 보시기 바랍니다.  마지막으로 Convert and Save 단추를 누르면 읽을 파일에서 내용을 읽어서 저장할 파일이름으로 저장해 주도록 구현하면 됩니다.

우선 Gui부분은 아래와 같습니다.

 

Gui, Add, Text, x30 y35 w70 h20, 읽을 파일 ;
Gui, Add, Edit, x110 y30 w400 h30 vTextFile, 읽을 파일을 선택하세요 ;
Gui, Add, Button, x550 y30 w100 h20 gReadFile, Select File ;

Gui, Add, Text, x30 y65 w70 h20, 저장할 파일 ;
Gui, Add, Edit, x110 y60 w400 h30 vOutFile, 저장할 파일을 선택하세요  ;
Gui, Add, Button, x550 y60 w100 h20 gWriteFile, Select File ;
Gui, Add, Text, x30 y95 w400 h20, 저장 가능한 파일 확장자 .mp3 , .wav , .aif , .m4a , .mid , .mpa , .wma  ;

Gui, Add, Button, x150 y120 w150 h20 gConvert, Convert and Save ;
Gui, Show , w670 h170, Simple Text To Speech Save File ver 1.0

 

다음은 입력과 출력을 처리하는 ReadFile, WriteFile과 Convert and Save 단추에 대해서 기능 구현을 하면 됩니다..

먼저 ReadFile의 경우는 FileSelectFile을 호출하여 파일이름을 받아오고 해당 이름을 업데이트 하도록 합니다.

goto label이름으로 ReadFile이라고 지정했기 때문에 아래처럼 구현해 줍니다.

 

ReadFile:
{
FileSelectFile, Filename
GuiControl,, TextFile, %Filename%
}
return

 

마찬가지로 WriteFile역시 동일하게 FileSelectFile을 호출하지만 option에 S만 추가로 넣어주면 됩니다.

WriteFile:
{
FileSelectFile, Filename, S
GuiControl,, OutFile, %Filename%
}
return

다음은 Convert and Save 기능에 대한 goto label이름은 Convert로 줬기 때문에 아래처럼 구현해 줍니다.

먼저 각각의 읽을 파일과 저장할 파일이름을 가져와야 하므로 변수값을 읽어 줍니다. 그리고 저장할 파일이름이 비어 있거나 원래 보여주는 문구 그대로일 경우 정상적으로 파일이름을 입력한게 아니므로 오류 메시지를 띄워 줍니다.

정상적으로 저장할 파일이름을 입력했을 경우에는 SpStream 변수를 생성해 주고 해당 생성한 SpStream.Open을 호출하여 해당 파일과 연결해 줍니다. 프로그램 시작시에 지정한 Sound Api의 AudioOutputStream을 방금 생성한 SpStream으로 지정해 줍니다. 그리고 본격적으로 읽을 파일로부터 내용을 읽어서 text로 가져오고 해당 text를 speak함수를 사용하여 읽어 주면 정상적으로 해당 파일로 저장이 되므로 이후에 Close()를 이용하여 파일을 닫아 줍니다.

스크립트는 다음과 같습니다.

 

Convert:
{
  Gui, Submit, nohide
  if ( OutFile = "" || "저장할 파일을 선택하세요" = OutFile )
  { 
    Msgbox, Please input your text to speech
  } else {
    SpStream := ComObjCreate("SAPI.SpFileStream")
    SpStream.Open(OutFile, 3)
    SAPI.AudioOutputStream := SpStream
    FileRead, text, %TextFile% 
    SAPI.speak(text,0x0) ; 0 : synchronous, 1 : asynchronous
    SpStream.Close()
  }
}
return

추가로 현재 본 스크립트는 본인이 사용하는 시스템에 설정된 음성이 사용되므로 해당 음성을 변경하고자 하는 분들은 조금 더 공부해 보시기 바랍니다. 참고할만한 링크는 가지고 있습니다.

 

전체 파일의 내용은 다음과 같습니다.

TtsSave.ahk
0.00MB

실행 파일만 필요할 경우는 아래 파일을 사용하세요.

TtsSave.exe
1.04MB

반응형