Skip to content

Conversation

@rover0811
Copy link
Member

개요

Python의 WhisperLive 클라이언트를 Swift로 완전히 포팅하는 작업을 완료했습니다. 초기 PR에서 오디오 데이터 변환 문제를 해결한 후, 추가적인 문제점들을 발견하고 해결하여 완전한 기능을 구현했습니다.
초기 PR 이후 발견된 추가 문제점

초기화 과정 누락

WebSocket 연결 후 on_open 이벤트에서 필요한 초기화 메시지가 제대로 전송되지 않음
서버가 클라이언트 식별 및 설정을 인식하지 못하는 문제 발생

오디오 리샘플링 미구현

Python 코드의 utils.resample() 함수에 해당하는 기능이 Swift에서 구현되지 않아 파일 재생 시 문제 발생
16kHz 샘플레이트로의 변환이 필요한 오디오 파일 처리 불가

WebSocket URL 형식 오류

WebSocket URL 생성 시 포트 번호가 포함되지 않는 문제
"wss://host" 형식이 아닌 "wss://host:port" 형식이 필요함

메시지 처리 로직 개선 필요

서버에서 받은 응답에 대한 처리가 불완전하여 트랜스크립션 결과가 제대로 표시되지 않음
상태 메시지, 언어 감지, 세그먼트 처리 등의 로직 미비

Utils 클래스 구현 부재

Python의 utils.py에 있는 기능들이 Swift에서 구현되지 않아 SRT 파일 생성 등의 기능 사용 불가

수정 내용

WebSocket 초기화 과정 개선

func on_open() {
    print("[INFO]: Opened connection")
    let initialMessage: [String: Any] = [
        "uid": self.uid,
        "language": self.language as Any,
        "task": self.task,
        "model": self.model,
        "use_vad": self.use_vad,
        "max_clients": self.max_clients,
        "max_connection_time": self.max_connection_time,
        "send_last_n_segments": self.send_last_n_segments,
        "no_speech_thresh": self.no_speech_thresh,
        "clip_audio": self.clip_audio,
        "same_output_threshold": self.same_output_threshold
    ]
    
    // JSON 메시지 전송 로직
    // ...
}

오디오 리샘플링 기능 구현:

static func resample(file: String, sampleRate: Int = 16000) -> String {
    // AVAudioFile, AVAudioConverter를 사용한 리샘플링 구현
    // 16kHz, 모노 채널, 16비트 PCM 형식으로 변환
    // ...
}

WebSocket URL 형식 수정

let socket_url = "\(socket_protocol)://\(host):\(port)"

메시지 처리 로직 개선:

func handle_message(_ message: [String: Any]) {
    // 메시지 타입별 처리 로직 구현
    // - 상태 메시지 (WAIT, ERROR, WARNING)
    // - 서버 준비 메시지 (SERVER_READY)
    // - 언어 감지 메시지
    // - 트랜스크립션 세그먼트
    // ...
}

Utils 클래스 전체 구현:

class Utils {
    // clearScreen, printTranscript, formatTime, 
    // createSrtFile, resample 등 구현
    // ...
}

AVAudioEngine 설정 최적화:

private func setupAudioEngine() {
    // 오디오 세션 카테고리, 모드 설정
    // 버퍼 사이즈, 포맷 설정
    // 인터럽트 핸들러 추가
    // ...
}

종료 처리 개선:

func sendEndOfAudio() {
    if let endMessage = Client.END_OF_AUDIO.data(using: .utf8) {
        send_packet_to_server(endMessage)
    }
}

@rover0811 rover0811 requested a review from ParkMazorika May 15, 2025 07:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants