Voice AI-based Automated Analysis of Earnings Calls and Corporate Conferences: Building a Pipeline to Capture Market Sentiment and Investment Opportunities

Earnings calls and corporate conferences are key information sources for capturing hidden market signals and investment opportunities. Moving beyond the inefficiency of manually analyzing vast amounts of voice data, we propose a strategy for building a powerful pipeline that automates this process and analyzes market sentiment in real-time using the latest voice AI technology. This will be a game-changer, resolving information asymmetry and enabling data-driven decision-making.

1. The Challenge / Context

Globally, countless companies hold earnings calls and investor conferences daily, where critical information such as future corporate strategies, financial performance, and market outlook is released. However, manually listening to and analyzing this vast amount of voice data requires immense time and labor, and it's easy to miss specific keywords or subtle nuances. In particular, non-linguistic elements such as the tone, emotion, and repeated use of specific words by corporate executives cannot be overlooked for their impact on market sentiment and future stock prices. In an era of information overload, quickly capturing key signals and reflecting them in investment strategies is a competitive advantage. The fundamental problem is that existing methods struggle to keep up with this speed and accuracy.

2. Deep Dive: Key Technology Components and Pipeline Design

A voice AI-based analysis pipeline largely consists of three core technological components: Speech-to-Text (STT), Natural Language Processing (NLP), and Sentiment Analysis.

  • Speech-to-Text (STT): This is the initial stage of converting earnings call audio files into text scripts. Beyond simply recognizing words, it's crucial to distinguish who said what through Speaker Diarization. In conferences, various speakers such as CEOs, CFOs, and analysts appear, so analyzing statements by speaker is essential for extracting key information. Cloud-based services like Google Cloud Speech-to-Text, AWS Transcribe, and Azure Speech Service offer high accuracy and speaker diarization capabilities.
  • Natural Language Processing (NLP): This stage involves extracting and structuring meaningful information from the converted text.
    • Named Entity Recognition (NER): Identifies key entities such as company names, product names, people, dates, and metrics.
    • Keyword Extraction & Topic Modeling: Automatically identifies major discussion topics such as industry trends, core corporate strategies, and risk factors. Models based on LDA (Latent Dirichlet Allocation) or BERT can be utilized.
    • Summarization: Helps rapid information comprehension by summarizing only the core content from long scripts. Abstractive Summarization or Extractive Summarization techniques are used.
  • Sentiment Analysis: Quantifies market sentiment by analyzing the positive/negative/neutral emotions embedded in the text. It is especially important to capture the subtle tone and expressions in management's statements regarding the company's future outlook, guidance, and risks. Beyond simple word-based sentiment analysis, understanding context and utilizing a Financial Sentiment Lexicon specialized for the financial domain enhances accuracy. For example, while "challenging" is negative in a general context, if "challenging market conditions" is followed by "but we are optimistic," the overall sentiment of the sentence can be neutral or positive. This can be advanced by fine-tuning pre-trained language models like FinBERT or RoBERTa.

By combining these technological components, an automated data pipeline is built where an earnings call audio file, when input into the system, automatically undergoes text conversion, key information extraction, and sentiment analysis, ultimately deriving market sentiment indicators and key investment insights.

3. Step-by-Step Guide: Practical Pipeline Construction

Now, let's look at the step-by-step process of building an actual pipeline. Here, we present an example using Python and cloud services.

Step 1: Audio Data Collection and STT Conversion

Earnings call audio files can typically be obtained from company investor relations (IR) pages or financial data provider platforms. In this example, we use Google Cloud Speech-to-Text to convert MP3 files to text.


# 필요한 라이브러리 설치
# pip install google-cloud-speech pydub

from google.cloud import speech_v1p1beta1 as speech
from google.cloud.speech_v1p1beta1 import enums
import io
from pydub import AudioSegment

def convert_mp3_to_wav(mp3_file_path, wav_file_path):
    audio = AudioSegment.from_mp3(mp3_file_path)
    audio.export(wav_file_path, format="wav")

def transcribe_audio_with_diarization(audio_file_path, language_code="en-US"):
    client = speech.SpeechClient()

    # MP3 파일인 경우 WAV로 변환 (Google Cloud Speech는 WAV에 최적화)
    if audio_file_path.endswith(".mp3"):
        wav_file_path = audio_file_path.replace(".mp3", ".wav")
        convert_mp3_to_wav(audio_file_path, wav_file_path)
        audio_file_path = wav_file_path

    with io.open(audio_file_path, "rb") as audio_file:
        content = audio_file.read()

    audio = speech.RecognitionAudio(content=content)
    config = speech.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, # WAV 파일의 일반적인 인코딩
        sample_rate_hertz=16000, # 오디오 파일의 샘플링 레이트에 맞춰 조정
        language_code=language_code,
        enable_speaker_diarization=True, # 화자 분리 활성화
        diarization_speaker_count=2 # 예상 화자 수 (CEO, CFO, 애널리스트 등)
    )

    print(f"Starting analysis of audio file {audio_file_path}...")
    response = client.long_running_recognize(config=config, audio=audio).result(timeout=300)

    full_transcript = []
    # 화자 분리 결과 처리
    current_speaker = None
    current_text = ""

    for result in response.results:
        # 결과에 화자 정보가 있는 경우
        if result.speaker_diarization_prediction:
            speaker_label = result.speaker_diarization_prediction.speaker_tag
            for word_info in result.alternatives[0].words:
                if current_speaker != speaker_label:
                    if current_text:
                        full_transcript.append(f"Speaker {current_speaker}: {current_text.strip()}")
                    current_speaker = speaker_label
                    current_text = ""
                current_text += word_info.word + " "
        else: # 화자 정보가 없는 경우 (전체 텍스트)
            full_transcript.append(result.alternatives[0].transcript)

    if current_text: # 마지막 화자의 텍스트 추가
        full_transcript.append(f"Speaker {current_speaker}: {current_text.strip()}")

    return "\n".join(full_transcript)

# Usage example
# transcript = transcribe_audio_with_diarization("path/to/your/earnings_call.mp3", language_code="en-US")
# print(transcript)

Note: Google Cloud API usage requires project setup and authentication. sample_rate_hertz should be adjusted to match the input audio file.

Step 2: NLP-based Information Extraction and Summarization

Extract key entities, keywords, and summarize the entire content from the converted text. Here, we utilize Hugging Face's Transformers library. Especially for Korean, pre-trained models like KLUE-RoBERTa or KoBERT show good performance.


# pip install transformers sentencepiece torch

from transformers import AutoTokenizer, pipeline
import torch

# Named Entity Recognition (NER)
def extract_named_entities(text, model_name="Babelscape/wikineural-multilingual-ner"):
    # Create NER pipeline (model selection is crucial)
    # Korean NER model example: A model fine-tuned for NER, such as 'skt/kogpt2-base-v2', is required.
    # Here, a general multilingual NER model is used, or fine-tuning is required.
    # For the example, the pipeline function is used, but in practice, a more accurate Korean NER model should be found.
    ner_pipeline = pipeline("ner", model=model_name, aggregation_strategy="simple")
    
    entities = ner_pipeline(text)
    return entities

# Text Summarization (Korean Model Example)
def summarize_text(text, model_name="ainize/kogpt2-base-v2-summarization"):
    # Load summarization model
    summarizer = pipeline("summarization", model=model_name, tokenizer=model_name)
    
    # Very long texts may hit token limits, so consider a strategy of splitting, summarizing, and then combining.
    # Here, the entire text is simply input (chunking is needed for actual use).
    summary = summarizer(text, max_length=200, min_length=50, do_sample=False)
    return summary[0]['summary_text']

# Usage example
# transcribed_text = "Speaker 0: Hello everyone, and welcome to our Q3 earnings call. Speaker 1: Thank you, Mr. CEO. Our revenue grew 15%..."
# entities = extract_named_entities(transcribed_text)
# print("Named Entities:", entities)
# summary = summarize_text(transcribed_text, model_name="ainize/kogpt2-base-v2-summarization") # Even if English is input, the Korean model attempts to summarize without translating.
# print("Summary:", summary)

# Korean text example (actual Korean earnings call text)
# korean_text = "Speaker 0: Hello. Thank you for joining our Q3 earnings announcement today. Speaker 1: Yes, thank you, Mr. CEO. Our revenue grew 15% last quarter. We saw significant achievements, especially in the AI sector."
# korean_summary = summarize_text(korean_text, model_name="ainize/kogpt2-base-v2-summarization")
# print("Korean Summary:", korean_summary)

Named Entity Recognition Model Selection: While "Babelscape/wikineural-multilingual-ner" in the example above is a multilingual model, finding or fine-tuning a Korean NER model specialized for the financial domain will ensure the highest accuracy. Summarization Model Optimization: When summarizing long documents, it is necessary to consider token limits and employ a strategy of splitting the document into multiple chunks, summarizing each, and then combining them.

Step 3: Financial Domain-Specific Sentiment Analysis

General sentiment analysis models may not accurately capture the specific terminology or context of the financial market. It is important to use financial sentiment analysis models based on FinBERT or KoBERT, or to fine-tune them directly with financial-related datasets.


# pip install transformers torch

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

# Load financial domain sentiment analysis model (e.g., FinBERT)
#