졸업 프로젝트를 시작하게 되면서 그 과정을 짧게나마 회고로 남기고자한다...🥹
창업에 관심을 갖고 활동을 시작한지 벌써 반 년이 지났는데 이때 겪었던 어려움을 살려 프로젝트 기획을 하게 되었다.
최근 운 좋게도 예비창업패키지 최종발표 자리부터 시작해 IR 발표를 해야하는 순간이 많았는데, 그럴 때마다 매 지원사업 공고마다 발표자료를 만들고 준비를 하는데 정말 너무나도 많은 시간을 쏟았었다. 예창패 발표 준비만 해도 진짜 30시간 넘게 쓴거 같다...😭 그만큼 일반 발표보다 VC부터 심사위원들까지 한 자리에 있는 자리이다 보니까 발표 특성이 다르고 그에 따른 부담감 또한 차원이 달랐다.
정부 지원 사업 같은 경우에는 주변에서 따로 발표 피드백을 받을 기회도 없었고, 예상질문 또한 블로그를 뒤지며 한두개 찾아낸게 끝이었다.
이런 힘들었던 경험을 살려 기획한게 바로 이 서비스이다.
이름하여
PitchCoach, 예비·초기 창업자를 위한 멀티모달 AI 기반 IR 피칭 준비 플랫폼
이름이 조금 거창하기는 한데 IR 표준 구조에 맞춰 문서·음성·질의응답을 동시에 진단하고, 시간 재배분·수치 일관성·예상 질문 훈련을 제공하는 통합 플랫폼이다.
서비스 플로우는 아래와 같고 최근 AI workflow 대회에서 n8n으로 만든게 있어서 참고하기 쉽게 같이 첨부했다.
공고 업로드 -> IR Deck 분석 -> 발표 음성 분석 -> AI 리포트 -> Q&A 훈련

이 중에서도 Whisper와 librosa를 사용하여 발표 음성 분석 기능을 중점적으로 소개하고자 한다.
1. Whisper
whisper는 OpenAI가 개발한 범용 음성 인식 모델로, 음성을 자동으로 텍스트로 변환해주고 다국어 지원과 자동 번역 기능 또한 제공한다.
PitchCoach에서는 Whisper를 다음과 같은 기능에 집중하여 사용하고자 한다.
1. 발표 음성을 텍스트로 변환 → 내용·언어·시간 정보까지 함께 추출
2. 슬라이드 텍스트와 발화 내용의 일치도 비교
3. 발표 내용 요약(Whisper + LLM)
Whisper API를 사용하려면 가장 먼저 OpenAI 계정이 필요하다.
- 계정을 생성한 뒤, API Key를 발급받고, OpenAI Python 라이브러리 설치
pip install openai
1. 텍스트 변환 (transcription)
OpenAI 라이브러리를 설치하고 API KEY를 발급받아 환경변수로 설정한다.
이후 아래와 같이 코드를 작성하면 음성 파일을 텍스르로 변환 가능하다.
import os
from openai import OpenAI
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
AUDIO_FILE = "sample.mp3"
def main():
with open(AUDIO_FILE, "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
)
print(transcript.text)
if __name__ == "__main__":
main()
2. 슬라이드 텍스트와 발화 내용의 일치도 비교
이 부분은 아직 IR Deck 분석 기능을 개발 중에 있으므로 추후 연결 뒤에 설명을 보충하도록 하겠다.
3. 발표 내용 요약(+LLM)
텍스트로 변환한 음성 내용을 LLM을 이용하여 요약 및 보고서를 생성하고자 한다.
LLM은 Gemini를 사용하였으며, 발표 상황 분류, 전달력, 발화 속도, 억양·톤, 말버릇 등을 평가하여 최종적으로 1분 요약 분석 또한 제공하고자 한다.

gemini 키를 등록하고, 프롬프트를 적용한 예시 코드는 다음과 같다.
import os
from dotenv import load_dotenv
from openai import OpenAI
import google.generativeai as genai
load_dotenv()
openai_client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
gemini_model = genai.GenerativeModel("gemini-1.5-pro")
AUDIO_FILE = "sample.mp3"
def transcribe_with_whisper(path: str) -> str:
with open(path, "rb") as f:
result = openai_client.audio.transcriptions.create(
model="whisper-1",
file=f,
)
return result.text
# 프롬프트 입력
IR_PROMPT_TEMPLATE = """
당신은 IR 피칭 분석 전문 코치입니다.
[음성 텍스트]
{speech_text}
"""
def transcribe_with_whisper(path: str) -> str:
with open(path, "rb") as f:
result = openai_client.audio.transcriptions.create(
model="whisper-1",
file=f,
)
return result.text
def load_deck_json(path: str) -> dict:
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def load_prompt(path: str) -> str:
with open(path, "r", encoding="utf-8") as f:
return f.read()
def analyze_with_gemini(speech_text: str,
audio_features: dict,
deck_json: dict) -> str:
base_prompt = load_prompt(PROMPT_PATH)
prompt = (
base_prompt
.replace('{{$json["text"]}}', speech_text)
.replace("{{audio_features}}",
json.dumps(audio_features, ensure_ascii=False))
.replace("{{deck_json}}",
json.dumps(deck_json, ensure_ascii=False))
)
response = gemini_model.generate_content(prompt)
return response.text
이렇게 되면 whisper를 사용하여 발표 상황에 맞는 음성 분석 결과를 도출할 수 있게 된다.
2. Librosa
Librosa는 음악 및 오디오 신호 처리를 위한 파이썬 라이브러리이다.
Librosa를 통해 피치 변화, 리듬 등의 정밀한 억양 분석이 가능하며, 시각화 뿐만 아니라 정량 비교가 가능하다는 강점이 있다.
PitchCoach에서는 Librosa를 다음과 같은 기능에 집중하여 사용하고자 한다.
1. 음향 특성 추출 : 속도, 피치, 침묵 구간 등
2. 화법 요약(Librosa + LLM) : 발표 스타일 평가 및 피드백 제공
기본 세팅을 위해 아래 코드로 설치해주면 된다.
pip install librosa
음성 특징 추출 코드
import librosa
import numpy as np
def extract_audio_features(audio_path: str) -> dict:
# 1) 오디오 로딩
y, sr = librosa.load(audio_path, sr=None)
duration = librosa.get_duration(y=y, sr=sr)
# 2) 에너지(강세) 변화: RMS 기준
rms = librosa.feature.rms(y=y)[0]
energy_std = float(rms.std())
# 3) 피치(음높이) 통계
pitches, mags = librosa.piptrack(y=y, sr=sr)
voiced_idx = mags > mags.max() * 0.1 # 일정 이상만 '발성 구간'으로 취급
voiced_pitches = pitches[voiced_idx]
if voiced_pitches.size > 0:
pitch_mean = float(voiced_pitches.mean())
pitch_std = float(voiced_pitches.std())
pitch_range = float(voiced_pitches.max() - voiced_pitches.min())
else:
pitch_mean = pitch_std = pitch_range = 0.0
# 4) 침묵 비율
silence_threshold = 0.01
silence_ratio = float((np.abs(y) < silence_threshold).sum() / len(y))
return {
"duration_sec": duration, //말하기 속도 계산
"energy_std": energy_std, //값이 크면 강조가 많이 되는 스타일
"pitch_mean": pitch_mean, //평균 피치가 높으면 긴장된 느낌, 너무 낮으면 처진 느낌
"pitch_std": pitch_std,
"pitch_range": pitch_range,
"silence_ratio": silence_ratio,
}
whisper로 음성의 텍스트를, librosa로 음성을 분석한 코드를 실행하는 main 함수는 다음과 같다.
def main():
# 1) Whisper로 텍스트 추출
transcript_text = transcribe_with_whisper(AUDIO_FILE)
# 2) Librosa로 음향 특징 추출
audio_features = extract_audio_features(AUDIO_FILE)
# 3) IR 덱 분석 결과(JSON) 로드
deck_json = load_deck_json(DECK_JSON_PATH)
# 4) 세 정보를 합쳐 Gemini에 분석 요청
analysis = analyze_with_gemini(
speech_text=transcript_text,
audio_features=audio_features,
deck_json=deck_json,
)
print("=== Whisper 텍스트 ===")
print(transcript_text)
print("\n=== Gemini 분석 결과(JSON) ===")
print(analysis)
[최종 분석 결과 예시]
{
"발표_상황": "창업경진대회",
"상황_적합성_점수": {
"총점": 75,
"세부_기준": {
"문제_정의": 80,
"솔루션_명확성": 85,
"시장성": 75,
"사업성_BM": 70,
"경쟁력_차별성": 80,
"전달력": 70,
"톤_일관성": 65
}
},
"음성_전달력_분석": {
"말하기_속도_WPM": 109.6,
"억양_강조_안정성": "전반적으로 안정적인 톤을 유지하려 노력하는 모습이 보이나, 피치 변화가 다소 커서 억양이 불안정하게 들리는 구간이 있습니다. 특히 숫자나 핵심 내용을 강조할 때 톤을 일정하게 유지하는 연습이 필요합니다.",
"감정_톤": "자신의 사업에 대한 열정을 드러내려 노력하는 모습이 보입니다. 다만, 창업 경진대회에서는 진정성 있는 감정 표현이 중요하므로, 억지로 톤을 높이기보다는 자연스러운 감정을 전달하는 것이 좋습니다.",
"문장_명료성": "전반적으로 문장 구조는 이해하기 쉬우나, 말하기 속도가 느리고 침묵 구간이 많아 집중도가 떨어질 수 있습니다. 각 문장의 핵심 내용을 간결하게 전달하고, 불필요한 침묵을 줄이는 것이 중요합니다.",
"불필요한_말버릇": "발표 초반에 '좀'과 같은 불필요한 말버릇이 자주 나타납니다. 의식적으로 이러한 표현을 줄이고, 자신감 있는 태도를 유지하는 것이 좋습니다.",
"강점": [
"수면 데이터 규모와 관련된 내용을 설명할 때, 청중의 흥미를 유발하는 표현을 사용하여 몰입도를 높이고 있습니다.",
"어려운 기술 내용을 쉽게 풀어서 설명하려는 노력이 돋보입니다. 비전문가도 이해할 수 있도록 쉬운 단어를 선택하고, 비유를 적절히 활용하고 있습니다.",
"전체 발표에서 비교적 차분하고 안정적인 톤을 유지하려 노력하는 모습이 보입니다."
],
"개선점": [
"문제 정의 슬라이드에서 자영업자 폐업률 증가를 언급할 때, 수치 제시 후 그 심각성에 대한 추가 설명이 부족합니다. 청중이 문제의 심각성을 더 깊이 공감할 수 있도록 구체적인 사례나 추가적인 설명을 덧붙이는 것이 좋습니다.",
"고객사례를 소개할 때, 기업명과 서비스 내용을 나열하는 데 그치지 않고, 각 사례가 에이슬립의 성장에 어떻게 기여했는지 구체적으로 설명하면 사업성을 더욱 효과적으로 전달할 수 있습니다.",
"전체적으로 말의 속도가 느리고, 문장 사이에 불필요한 쉼이 많습니다. 발표 연습을 통해 말의 속도를 높이고, 문장 간 연결을 자연스럽게 만들어 흐름이 끊기지 않도록 하는 것이 중요합니다."
]
},
"1분_요약": "본 발표는 창업경진대회에 적합하도록 문제 정의, 솔루션, 시장성, 사업 모델, 경쟁력 등을 전반적으로 다루고 있으나, 전달력과 톤의 일관성이 다소 아쉽습니다. 발표자는 수면 데이터 규모를 강조하여 흥미를 유발하고 기술 내용을 쉽게 설명하려 노력했지만, 말하기 속도가 느리고 불필요한 말버릇이 있어 개선이 필요합니다. 특히 문제 정의 슬라이드에서 문제의 심각성을 더 강조하고, 고객 사례를 통해 사업성을 구체적으로 제시해야 합니다. 발표 속도를 개선하고 자신감 있는 태도를 보여주는 것이 중요하며, 설득력 있는 스토리텔링으로 청중의 공감을 얻는 발표 스타일은 '스타트업 액셀러레이터 데모데이' 영상을 참고하면 도움이 될 수 있습니다."
}
사실 항상 프론트엔드 개발만 해보다 이렇게 AI를 활용해서 개발은 처음 해보기 때문에 아직 모르는 것도 너무 많고 공부할 부분도 정말 많은 상황이다. 그치만 차근차근 개발 해보면서 글도 꾸준히 업데이트 해보도록 하겠다.
이후 PitchCoach에서 next.js를 써서 프론트엔드 개발도 할 예정이라 이 부분도 공부하면서 정리해보겠다...ㅎ