본문 바로가기
Azure AI Services Engineering/Speech

[ Azure AI Services #12 ] [ 실습 ]Azure Speech SDK와 Gradio로 음성 AI 앱 만들기: STT, TTS, 번역, 발음 평가까지

by yunalee-dev 2026. 6. 20.

이번 글에서는 Azure Speech SDKGradio를 사용해서 음성 AI 기능을 직접 구현해보겠습니다. 단순히 코드를 실행하는 수준이 아니라, 각각의 기능이 어떤 역할을 하고 왜 필요한지까지 함께 살펴보겠습니다.

이번 실습에서 다룬 기능은 크게 네 가지입니다.

  • STT: 음성을 텍스트로 변환
  • TTS: 텍스트를 음성으로 변환
  • Speech Translation: 한국어 음성을 영어와 일본어로 번역
  • Pronunciation Assessment: 사용자의 발음을 점수로 평가

이 네 가지 기능을 각각 따로 보면 단순한 API 호출처럼 보이지만, 실제 서비스 관점에서 보면 음성 챗봇, 언어 학습 앱, 자동 회의록, 번역 서비스 같은 다양한 기능의 핵심 부품이 됩니다.

https://github.com/yunalee-dev/Azure-AI-Services-Labs

 

GitHub - yunalee-dev/Azure-AI-Services-Labs

Contribute to yunalee-dev/Azure-AI-Services-Labs development by creating an account on GitHub.

github.com

 

[이미지 1 넣기: 전체 실습 흐름도. 추천 이미지: 사용자 음성 입력 → Gradio → Azure Speech SDK → STT/TTS/번역/발음 평가 결과 출력]

1. Azure Speech SDK는 무엇인가

Azure Speech SDK는 Microsoft Azure에서 제공하는 음성 처리용 개발 도구입니다.

예를 들어 우리가 마이크에 대고 말하면 컴퓨터 입장에서는 단순한 소리 파일일 뿐입니다.

이 소리를 사람이 읽을 수 있는 텍스트로 바꾸려면 음성 신호 분석, 언어 모델, 발음 패턴 분석 같은 복잡한 기술이 필요합니다. Azure Speech SDK는 이런 복잡한 부분을 Azure 서비스에 맡기고, 개발자는 입력과 출력 흐름에 집중할 수 있게 해줍니다.

핵심 개념
Azure Speech SDK는 음성 인식, 음성 합성, 음성 번역, 발음 평가 같은 기능을 앱에 쉽게 연결할 수 있게 해주는 도구입니다.

이번 실습에서는 Azure Speech SDK를 사용해서 네 가지 기능을 구현했습니다.

기능 입력 출력 활용 예시
STT 음성 텍스트 회의록 자동 작성, 음성 검색
TTS 텍스트 음성 안내 음성, AI 튜터, 내레이션
Speech Translation 한국어 음성 번역 텍스트 실시간 통역, 여행 회화 앱
Pronunciation Assessment 음성 + 기준 문장 발음 점수 영어 발음 학습 앱

2. Gradio를 함께 사용하는 이유

이번 실습에서는 Azure Speech SDK만 사용한 것이 아니라 Gradio도 함께 사용했습니다.

Gradio는 파이썬 함수에 간단한 웹 화면을 붙여주는 도구입니다.

 

예를 들어 음성 인식 함수만 만들면 개발자는 터미널에서 파일 경로를 직접 넣어 테스트해야 합니다.

하지만 Gradio를 사용하면 마이크 입력창, 텍스트 출력창, 버튼 같은 화면을 빠르게 만들 수 있습니다. 덕분에 사용자는 웹 페이지에서 바로 마이크로 말하고 결과를 확인할 수 있습니다.

Gradio는 모델이나 API를 테스트할 때 특히 유용합니다. 복잡한 프론트엔드를 만들지 않아도 입력창, 버튼, 오디오 플레이어, 표 출력 등을 빠르게 구성할 수 있기 때문입니다.

이번 실습의 기본 구조는 다음과 같습니다.

사용자 입력
   ↓
Gradio 화면
   ↓
Python 함수 실행
   ↓
Azure Speech SDK 호출
   ↓
결과를 Gradio 화면에 출력

3. 실습 준비: 환경 변수와 기본 구조

Azure Speech 서비스를 사용하려면 먼저 Azure에서 발급받은 EndpointKey가 필요합니다.

 

Endpoint는 Azure 서비스에 요청을 보낼 주소이고, Key는 이 서비스를 사용할 권한을 확인하는 비밀번호 같은 값입니다.

 

코드에서는 이 값을 직접 작성하지 않고 .env 파일에서 불러오도록 구성했습니다.

이 방식은 실무에서도 중요합니다. API Key를 코드에 그대로 적어두면 GitHub에 업로드되거나 다른 사람에게 공유될 때 보안 문제가 생길 수 있습니다.

주의
Azure Speech Key는 절대 코드에 직접 작성하지 않는 것이 좋습니다. 실습에서는 .env 파일에 저장하고, 코드에서는 환경 변수로 불러오는 방식을 사용합니다.

예시 .env 파일

AZURE_SPEECH_ENDPOINT=https://your-speech-resource.cognitiveservices.azure.com/
AZURE_SPEECH_KEY=your-azure-speech-key

공통으로 사용한 코드

import gradio as gr
import azure.cognitiveservices.speech as speechsdk
import os
from dotenv import load_dotenv

load_dotenv()

ENDPOINT = os.getenv("AZURE_SPEECH_ENDPOINT")
KEY = os.getenv("AZURE_SPEECH_KEY")

이 코드는 네 가지 실습에서 공통으로 사용됩니다. 먼저 load_dotenv().env 파일을 읽고, os.getenv()를 통해 Endpoint와 Key 값을 가져옵니다. 그다음 이 값을 Azure Speech SDK 설정에 넣어 서비스를 호출합니다.

4. STT: 음성을 텍스트로 바꾸기

먼저 구현한 기능은 STT입니다. STT는 Speech To Text의 약자로, 사용자의 음성을 텍스트로 변환하는 기능입니다.

예를 들어 사용자가 마이크에 대고 “안녕하세요”라고 말하면, Azure Speech SDK가 이 음성을 분석해서 텍스트 안녕하세요.로 반환합니다. 이 기능은 회의록 자동 작성, 상담 내용 기록, 음성 명령 처리 같은 서비스에서 많이 사용됩니다.

STT 코드의 핵심 흐름

speech_config = speechsdk.SpeechConfig(
    subscription=KEY,
    endpoint=ENDPOINT
)

speech_config.speech_recognition_language = "ko-KR"

audio_config = speechsdk.audio.AudioConfig(filename=audio_path)

speech_recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    audio_config=audio_config
)

result = speech_recognizer.recognize_once()

여기서 중요한 부분은 speech_recognition_language입니다. 이 값은 사용자가 어떤 언어로 말하는지 알려주는 설정입니다. 이번 실습에서는 한국어 음성을 인식해야 하므로 ko-KR로 설정했습니다.

또 하나 중요한 부분은 recognize_once()입니다. 이 함수는 짧은 음성을 한 번 인식할 때 사용합니다.

즉, 사용자가 마이크로 말한 뒤 녹음이 끝나면 한 번 분석해서 결과를 반환하는 방식입니다.

코드 요소 역할
SpeechConfig Azure Speech 서비스 연결 설정
speech_recognition_language 인식할 언어 설정
AudioConfig 입력 오디오 파일 지정
SpeechRecognizer 음성을 텍스트로 변환하는 인식기
recognize_once() 짧은 음성을 한 번 인식

Gradio에서는 gr.Audio 컴포넌트를 사용해 마이크 입력을 받았습니다. 마이크 입력이 끝나면 input_mic.change() 이벤트가 실행되고, 음성 파일 경로가 함수로 전달됩니다.

input_mic = gr.Audio(
    label="마이크 입력",
    sources="microphone",
    type="filepath"
)

output_textbox = gr.Textbox(
    label="텍스트",
    placeholder="변환된 텍스트",
    interactive=False
)

input_mic.change(
    fn=change_audio,
    inputs=[input_mic],
    outputs=[output_textbox]
)

5. TTS: 텍스트를 음성으로 바꾸기

두 번째 실습은 TTS입니다. TTS는 Text To Speech의 약자로, 텍스트를 사람이 말하는 것 같은 음성으로 변환하는 기능입니다.

STT가 “음성 → 텍스트”였다면, TTS는 반대로 “텍스트 → 음성”입니다. 예를 들어 사용자가 “안녕하세요. 오늘도 좋은 하루 보내세요.”라고 입력하면, Azure Speech SDK가 이 문장을 음성 파일로 만들어줍니다.

TTS 코드의 핵심 흐름

speech_config = speechsdk.SpeechConfig(
    subscription=KEY,
    endpoint=ENDPOINT
)

speech_config.speech_synthesis_voice_name = "ko-KR-SunHiNeural"

audio_config = speechsdk.audio.AudioConfig(filename="output.wav")

speech_synthesizer = speechsdk.SpeechSynthesizer(
    speech_config=speech_config,
    audio_config=audio_config
)

result = speech_synthesizer.speak_text_async(text).get()

여기서 핵심은 speech_synthesis_voice_name입니다. 이 값은 어떤 목소리로 음성을 만들지 결정합니다. 실습에서는 한국어 여성 음성인 ko-KR-SunHiNeural을 사용했습니다.

결과는 output.wav 파일로 저장됩니다. Gradio의 gr.Audio 컴포넌트는 이 파일 경로를 받아서 웹 화면에서 바로 재생할 수 있게 해줍니다.

TTS는 단순히 글을 읽어주는 기능이 아닙니다. 챗봇 답변을 음성으로 들려주거나, 시각적으로 글을 읽기 어려운 사용자에게 정보를 전달하는 데에도 활용할 수 있습니다.

Gradio 화면 구성

input_textbox = gr.Textbox(
    label="텍스트 입력",
    placeholder="음성으로 바꿀 내용을 입력하세요."
)

submit_button = gr.Button("음성으로 변환하기")

output_audio = gr.Audio(
    label="변환된 음성 결과",
    type="filepath"
)

submit_button.click(
    fn=request_tts_sdk,
    inputs=[input_textbox],
    outputs=[output_audio]
)

이번에는 마이크 입력이 아니라 텍스트 입력창과 버튼을 사용했습니다. 사용자가 문장을 입력하고 버튼을 누르면 TTS 함수가 실행되고, 생성된 음성 파일이 오디오 컴포넌트에 표시됩니다.

6. Speech Translation: 한국어 음성을 영어와 일본어로 번역하기

세 번째 실습은 Speech Translation입니다. 이 기능은 음성을 먼저 인식한 뒤, 그 내용을 다른 언어로 번역합니다.

이번 실습에서는 사용자가 한국어로 말하면 그 내용을 영어와 일본어로 번역하도록 구성했습니다. 즉, 입력은 한국어 음성이고 출력은 영어 텍스트와 일본어 텍스트입니다.

STT와 비슷해 보이지만 중요한 차이가 있습니다. STT는 음성을 같은 언어의 텍스트로 바꾸는 기능이고, Speech Translation은 음성을 인식한 뒤 다른 언어로 바꾸는 기능입니다.

구분 STT Speech Translation
입력 한국어 음성 한국어 음성
처리 음성 인식 음성 인식 + 번역
출력 한국어 텍스트 영어, 일본어 텍스트

번역 코드의 핵심 흐름

translation_config = speechsdk.translation.SpeechTranslationConfig(
    subscription=KEY,
    endpoint=ENDPOINT
)

translation_config.speech_recognition_language = "ko-KR"

translation_config.add_target_language("en")
translation_config.add_target_language("ja")

audio_config = speechsdk.audio.AudioConfig(filename=audio_path)

translation_recognizer = speechsdk.translation.TranslationRecognizer(
    translation_config=translation_config,
    audio_config=audio_config
)

result = translation_recognizer.recognize_once()

이 실습에서 가장 중요한 차이는 SpeechConfig가 아니라 SpeechTranslationConfig를 사용한다는 점입니다. 일반 음성 인식이 아니라 번역까지 포함하는 기능이기 때문에 전용 설정 객체를 사용합니다.

그리고 add_target_language()를 사용해 번역할 목표 언어를 추가합니다. 이번 실습에서는 영어 en과 일본어 ja를 추가했습니다.

english_text = result.translations.get("en", "번역 실패")
japanese_text = result.translations.get("ja", "번역 실패")

return english_text, japanese_text

번역 결과는 result.translations 안에 들어 있습니다. 여기서 en 키로 영어 번역을 가져오고, ja 키로 일본어 번역을 가져옵니다.

7. Pronunciation Assessment: 영어 발음 평가하기

마지막 실습은 Pronunciation Assessment입니다. 이 기능은 사용자가 읽은 음성을 기준 문장과 비교해서 발음 점수를 평가합니다.

예를 들어 기준 문장이 Today is a beautiful day to practice computer programming.이라면, 사용자는 이 문장을 직접 읽습니다. Azure Speech SDK는 사용자의 음성을 분석해서 정확도, 유창성, 완성도 같은 점수를 계산합니다.

이 기능은 영어 학습 앱에서 특히 유용합니다. 단순히 맞았는지 틀렸는지만 알려주는 것이 아니라, 어떤 부분이 부족한지 점수로 확인할 수 있기 때문입니다.

발음 평가 코드의 핵심 흐름

speech_config = speechsdk.SpeechConfig(
    subscription=KEY,
    endpoint=ENDPOINT
)

speech_config.speech_recognition_language = "en-US"

audio_config = speechsdk.audio.AudioConfig(filename=audio_path)

pronunciation_config = speechsdk.PronunciationAssessmentConfig(
    reference_text=reference_text,
    grading_system=speechsdk.PronunciationAssessmentGradingSystem.HundredMark,
    granularity=speechsdk.PronunciationAssessmentGranularity.Phoneme
)

이번 실습에서는 영어 발음을 평가하므로 인식 언어를 en-US로 설정했습니다. 기준 문장은 사용자가 입력한 reference_text를 사용합니다.

또한 평가 방식은 100점 만점으로 설정했고, 세부 평가 단위는 Phoneme으로 설정했습니다. Phoneme은 음소를 의미합니다. 쉽게 말하면 단어보다 더 작은 소리 단위까지 세밀하게 평가하겠다는 뜻입니다.

speech_recognizer = speechsdk.SpeechRecognizer(
    speech_config=speech_config,
    audio_config=audio_config
)

pronunciation_config.apply_to(speech_recognizer)

result = speech_recognizer.recognize_once()

assessment_result = speechsdk.PronunciationAssessmentResult(result)

발음 평가 설정은 apply_to()를 통해 음성 인식기에 적용합니다. 그다음 음성을 인식하면, 결과 객체에서 발음 평가 점수를 추출할 수 있습니다.

평가 결과로 확인한 항목

평가 항목 의미
Pronunciation Score 전체 발음 종합 점수
Accuracy Score 기준 발음과 얼마나 정확하게 일치하는지
Fluency Score 말이 얼마나 자연스럽고 끊김 없이 이어지는지
Completeness Score 기준 문장을 얼마나 빠짐없이 읽었는지

점수 결과는 Pandas DataFrame으로 정리한 뒤 Gradio의 gr.Dataframe에 출력했습니다. 이렇게 하면 단순 텍스트보다 훨씬 보기 좋은 표 형태로 결과를 확인할 수 있습니다.

scores = {
    "평가 항목": [
        "종합 점수 (Pronunciation Score)",
        "정확도 (Accuracy Score)",
        "유창성 (Fluency Score)",
        "완벽도 (Completeness Score)"
    ],
    "점수 (100점 만점)": [
        assessment_result.pronunciation_score,
        assessment_result.accuracy_score,
        assessment_result.fluency_score,
        assessment_result.completeness_score
    ]
}

df_scores = pd.DataFrame(scores)

 

8. 네 가지 기능 비교

이번 실습에서 만든 네 가지 기능은 모두 음성과 관련되어 있지만, 입력과 출력의 방향이 조금씩 다릅니다. 이 차이를 이해하면 Azure Speech SDK를 어떤 상황에서 사용해야 하는지 더 쉽게 판단할 수 있습니다.

기능 입력 처리 과정 출력 적합한 서비스
STT 음성 음성 인식 텍스트 회의록, 음성 검색
TTS 텍스트 음성 합성 음성 파일 AI 안내 음성, 내레이션
Speech Translation 음성 음성 인식 + 번역 번역 텍스트 통역 앱, 여행 회화
Pronunciation Assessment 음성 + 기준 문장 음성 인식 + 발음 평가 점수 영어 학습 앱

정리하면 STT와 TTS는 서로 반대 방향의 기능입니다. STT는 사용자의 말을 텍스트로 바꾸고, TTS는 텍스트를 다시 음성으로 바꿉니다. 여기에 번역 기능을 붙이면 다국어 서비스가 되고, 발음 평가 기능을 붙이면 언어 학습 서비스가 됩니다.

9. 정리

이번 글에서는 Azure Speech SDK와 Gradio를 사용해 네 가지 음성 AI 기능을 구현했습니다. 처음에는 각각의 코드가 비슷해 보일 수 있지만, 실제로는 사용하는 설정 객체와 결과 처리 방식이 조금씩 다릅니다.

STT에서는 SpeechRecognizer를 사용해 음성을 텍스트로 바꾸었습니다. TTS에서는 SpeechSynthesizer를 사용해 텍스트를 음성 파일로 변환했습니다. Speech Translation에서는 SpeechTranslationConfigTranslationRecognizer를 사용해 한국어 음성을 영어와 일본어로 번역했습니다. 마지막으로 Pronunciation Assessment에서는 기준 문장과 사용자의 음성을 비교해 발음 점수를 계산했습니다.

이번 실습의 핵심은 단순히 음성 기능을 하나씩 실행해보는 것이 아니라, 음성 입력과 출력이 실제 서비스에서 어떻게 연결될 수 있는지 이해하는 것입니다.

10. 전체 흐름 한 번에 정리

전체 실습 흐름을 한 번에 정리하면 다음과 같습니다.

1. Azure Speech 리소스 생성
2. Endpoint와 Key 확인
3. .env 파일에 환경 변수 저장
4. Python에서 load_dotenv()로 환경 변수 로드
5. SpeechConfig 또는 SpeechTranslationConfig 생성
6. Gradio로 입력 화면 구성
7. 사용자의 음성 또는 텍스트 입력 받기
8. Azure Speech SDK로 처리
9. 결과를 텍스트, 오디오, 표 형태로 출력

이 구조를 이해하면 이후에는 기능을 하나씩 확장할 수 있습니다. 예를 들어 STT 결과를 LLM에 전달하면 음성 챗봇을 만들 수 있고, TTS를 붙이면 챗봇의 답변을 음성으로 들려줄 수도 있습니다. 또한 번역 기능과 발음 평가 기능을 결합하면 언어 학습용 AI 앱으로 발전시킬 수 있습니다.

11. 핵심 키워드 정리

키워드 의미
Azure Speech SDK Azure의 음성 AI 기능을 Python 코드에서 사용할 수 있게 해주는 도구
Gradio Python 함수에 웹 UI를 빠르게 붙일 수 있는 라이브러리
STT Speech To Text, 음성을 텍스트로 변환하는 기능
TTS Text To Speech, 텍스트를 음성으로 변환하는 기능
Speech Translation 음성을 인식한 뒤 다른 언어로 번역하는 기능
Pronunciation Assessment 사용자의 발음을 기준 문장과 비교해 점수로 평가하는 기능
SpeechConfig 음성 인식이나 음성 합성을 위한 Azure 연결 설정 객체
SpeechTranslationConfig 음성 번역 기능을 사용할 때 필요한 설정 객체
Endpoint Azure Speech 서비스에 요청을 보내는 주소
API Key Azure 서비스를 사용할 권한을 확인하는 인증 값

12. 다음 글 예고

이번 글에서는 Azure Speech SDK를 사용해 음성 인식, 음성 합성, 음성 번역, 발음 평가 기능을 각각 구현해보았습니다. 다음 글에서는 이 기능들을 하나로 연결해 음성 입력을 받아 AI가 답변하고, 그 답변을 다시 음성으로 들려주는 AI 음성 챗봇을 만들어보겠습니다.