๋ฏธ๋ถ„๋ฅ˜

๐Ÿ’ก ๊ตฌ๊ธ€ speech-to-text ์ฑŒ๋ฆฐ์ง€ ๋žฉ ์ „์ฒด ์ง„ํ–‰ ๊ฐ€์ด๋“œ

0
Please log in or register to do it.

์ด ์ฑŒ๋ฆฐ์ง€ ๋žฉ์˜ ๋ชฉํ‘œ๋Š” Google Cloud์˜ Speech-to-Text, Text-to-Speech, Translation API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ง„ํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํƒœ์Šคํฌ 1. API ํ‚ค ์ƒ์„ฑ

์ด ๋žฉ์˜ ๋ชจ๋“  API ํ˜ธ์ถœ์—๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € API ํ‚ค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Google Cloud Console์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

์™ผ์ชฝ ํƒ์ƒ‰ ๋ฉ”๋‰ด์—์„œ API ๋ฐ ์„œ๋น„์Šค(APIs & Services) > **์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด(Credentials)**๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋‹จ์— ์žˆ๋Š” **+ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋งŒ๋“ค๊ธฐ(+ CREATE CREDENTIALS)**๋ฅผ ํด๋ฆญํ•˜๊ณ , ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ **API ํ‚ค(API key)**๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด API ํ‚ค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด, ํ‚ค ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ๋ฉ”๋ชจํ•ด ๋‘ก๋‹ˆ๋‹ค. ์ด ํ‚ค๋Š” ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API ์ œํ•œ(API restrictions) ํƒญ์—์„œ ํ•„์š”ํ•œ API(์˜ˆ: Cloud Translation API)๋ฅผ ์„ ํƒํ•˜์—ฌ ํ‚ค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์ƒ ์ข‹์ง€๋งŒ, ์ด ๋žฉ์—์„œ๋Š” ํ•„์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

๐Ÿ—ฃ๏ธ ํƒœ์Šคํฌ 2. Text-to-Speech API๋กœ ์Œ์„ฑ ํ•ฉ์„ฑ

์ด ํƒœ์Šคํฌ์—์„œ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์Œ์„ฑ ํŒŒ์ผ(.mp3)๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

SSH๋ฅผ ํ†ตํ•ด lab-vm ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค: 

source venv/bin/activate
nano synthesize-text.json 

๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์Œ JSON ๋‚ด์šฉ์„ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

JSON

{
    “input”:{
        “text”:”Cloud Text-to-Speech API allows developers to include
          natural-sounding, synthetic human speech as playable audio in
          their applications. The Text-to-Speech API converts text or
          Speech Synthesis Markup Language (SSML) input into audio data
          like MP3 or LINEAR16 (the encoding used in WAV files).”
    },
    “voice”:{
        “languageCode”:”en-gb”,
        “name”:”en-GB-Standard-A”,
        “ssmlGender”:”FEMALE”
    },
    “audioConfig”:{
        “audioEncoding”:”MP3″
    }
}

Text-to-Speech API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ synthesize-text.txt ํŒŒ์ผ์— ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Bash

gcloud ml tts synthesize-text –request-file=synthesize-text.json > synthesize-text.txt

nano tts_decode.py ๋ช…๋ น์–ด๋กœ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ œ๊ณต๋œ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ .txt ํŒŒ์ผ์„ .mp3 ํŒŒ์ผ๋กœ ๋””์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

Bash

python tts_decode.py –input “synthesize-text.txt” –output “synthesize-text-audio.mp3”

synthesize-text-audio.mp3 ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋ฉด, VM์˜ SSH ์„ธ์…˜์—์„œ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์Œ์„ฑ ํŒŒ์ผ์„ ๋“ค์–ด๋ด…๋‹ˆ๋‹ค.

๐ŸŽ™๏ธ ํƒœ์Šคํฌ 3. Speech-to-Text API๋กœ ์Œ์„ฑ ํ…์ŠคํŠธ ๋ณ€ํ™˜

์ด ํƒœ์Šคํฌ์—์„œ๋Š” .flac ์˜ค๋””์˜ค ํŒŒ์ผ์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋ฐœ์ƒํ–ˆ๋˜ ์˜ค๋ฅ˜๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •ํ™•ํ•œ ๋ช…๋ น์–ด๋ฅผ ์•ˆ๋‚ดํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

speech_request_fr.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ด ํƒœ์Šคํฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. gcloud ๋ช…๋ น์–ด๋Š” ํŒŒ์ผ์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ”Œ๋ž˜๊ทธ(flag) ํ˜•ํƒœ๋กœ ์ธ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

gs://cloud-samples-data/speech/corbeau_renard.flac ํŒŒ์ผ์€ ํ”„๋ž‘์Šค์–ด๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ—ค๋” ์ •๋ณด์— ๋”ฐ๋ฅด๋ฉด **๋‹จ์ผ ์ฑ„๋„(mono)**์ž…๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” API ํ˜ธ์ถœ ์‹œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Speech-to-Text API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ speech_response.json ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” gcloud๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ •ํ™•ํ•œ ํ˜•์‹์ž…๋‹ˆ๋‹ค.

Bash

gcloud ml speech recognize-long-running gs://cloud-samples-data/speech/corbeau_renard.flac –language-code=fr-FR –encoding=FLAC –sample-rate=44100 > speech_response.json

recognize-long-running: 60์ดˆ ์ด์ƒ์˜ ๊ธด ์˜ค๋””์˜ค ํŒŒ์ผ์— ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

–language-code: fr-FR๋กœ ์ง€์ •ํ•˜์—ฌ ํ”„๋ž‘์Šค์–ด๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

–encoding๊ณผ –sample-rate: ์˜ค๋””์˜ค ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ ๋ฐ ์ƒ˜ํ”Œ๋ง ์†๋„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

> speech_response.json: ๋ช…๋ น ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ speech_response.json ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๐ŸŒ ํƒœ์Šคํฌ 4. Translation API๋กœ ํ…์ŠคํŠธ ๋ฒˆ์—ญ

์ด ํƒœ์Šคํฌ์—์„œ๋Š” ์ผ๋ณธ์–ด ๋ฌธ์žฅ์„ ์˜์–ด๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Translation API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ translated_response.txt ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Bash

curl -s -X POST -H “Content-Type: application/json” \
-H “Authorization: Bearer $(gcloud auth print-access-token)” \
“https://translation.googleapis.com/language/translate/v2” \
-d ‘{
  “q”: “ใ“ใ‚Œใฏๆ—ฅๆœฌ่ชžใงใ™ใ€‚”,
  “target”: “en”
}’ > translated_response.txt

“q”: ๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

“target”: ๋ฒˆ์—ญํ•  ๋ชฉํ‘œ ์–ธ์–ด ์ฝ”๋“œ(en์€ ์˜์–ด)์ž…๋‹ˆ๋‹ค.

โ“ ํƒœ์Šคํฌ 5. Translation API๋กœ ์–ธ์–ด ๊ฐ์ง€

์ด ํƒœ์Šคํฌ์—์„œ๋Š” ์ฃผ์–ด์ง„ ๋ฌธ์žฅ์ด ์–ด๋–ค ์–ธ์–ด์ธ์ง€ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Translation API์˜ ์–ธ์–ด ๊ฐ์ง€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ detection_response.txt ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

Bash

curl -s -X POST -H “Content-Type: application/json” \

-H “Authorization: Bearer $(gcloud auth print-access-token)” \

“https://translation.googleapis.com/language/translate/v2/detect” \

-d ‘{

  “q”: “Este รฉ japonรชs.”

}’ > detection_response.txt

“q”: ์–ธ์–ด๋ฅผ ๊ฐ์ง€ํ•  ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์žฅ์€ ํฌ๋ฅดํˆฌ๊ฐˆ์–ด๋กœ “์ด๊ฒƒ์€ ์ผ๋ณธ์–ด์ž…๋‹ˆ๋‹ค.”๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ๊ฐ€ ์ฑŒ๋ฆฐ์ง€ ๋žฉ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค! ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ ํ•˜์‹œ๊ณ , ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ์˜คํƒ€๊ฐ€ ์—†๋Š”์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•˜์„ธ์š”.

๊ตฌ๊ธ€ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ ๊ณต์œ ์„ค์ • ๋ฐ ํ˜‘์—… ๊ฐ€์ด๋“œ
์Šคํ”„๋ ˆ๋“œ์‹œํŠธ & ์ „์ž์„œ๋ช… ํ†ตํ•ฉ ์†”๋ฃจ์…˜ ๋งŒ๋“ค๊ธฐ.

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค