메인 콘텐츠로 건너뛰기
타입캐스트 API를 위한 공식 PHP 라이브러리입니다. AI 음성을 사용하여 텍스트를 자연스러운 음성으로 변환합니다. Guzzle 7 기반의 안정적인 HTTP 통신. PHP 8.1+ 및 Composer 필요.

Packagist

타입캐스트 PHP SDK

소스 코드

타입캐스트 PHP SDK 소스 코드

설치

Composer로 설치합니다:
composer require neosapience/typecast-php
PHP 8.1 이상 및 Composer가 필요합니다. php -v로 버전을 확인하세요.

빠른 시작

<?php
use Neosapience\Typecast\TypecastClient;
use Neosapience\Typecast\Models\TTSRequest;

// 클라이언트 초기화
$client = new TypecastClient(apiKey: 'YOUR_API_KEY');

// 텍스트를 음성으로 변환
$response = $client->textToSpeech(new TTSRequest(
    voiceId: 'tc_672c5f5ce59fac2a48faeaee',
    text: '안녕하세요! 타입캐스트 PHP SDK입니다.',
    model: 'ssfm-v30',
));

// 오디오 파일 저장
file_put_contents('output.wav', $response->audioData);

echo "재생 시간: {$response->duration}초, 포맷: {$response->format}\n";

기능

  • 다중 음성 모델: ssfm-v30 (최신) 및 ssfm-v21 AI 음성 모델 지원
  • 다국어 지원: 영어, 한국어, 스페인어, 일본어, 중국어 등 37개 언어
  • 감정 제어: 프리셋 감정 (normal, happy, sad, angry, whisper, toneup, tonedown) 또는 스마트 문맥 인식 추론
  • 오디오 커스터마이징: 음량 (LUFS -70 to 0), 피치 (-12 to +12 세미톤), 템포 (0.5x to 2.0x), 포맷 (WAV/MP3) 제어
  • 캐릭터 탐색: V2 Voices API로 모델, 성별, 나이, 용도별 필터링
  • 타임스탬프 TTS: 자막, 가라오케, 립싱크를 위한 단어·문자 단위 정렬 데이터
  • 스트리밍: 저지연 재생을 위한 실시간 청크 오디오 전송 (콜백 기반)
  • Guzzle 7: 업계 표준 HTTP 클라이언트
  • 타입 안전성: 타입 프로퍼티와 네임드 아규먼트 (PHP 8.1+)

설정

환경변수 또는 직접 API 키를 전달할 수 있습니다:
export TYPECAST_API_KEY="your-api-key-here"
자체 프록시를 통해 요청하는 경우 baseUrl을 프록시 엔드포인트로 설정하고 apiKey를 생략할 수 있습니다. API 키가 비어 있거나 없으면 SDK는 X-API-KEY 헤더를 보내지 않습니다. 기본 Typecast 호스트로 요청할 때는 API 키가 계속 필요합니다.
API 키 없는 프록시
$client = new TypecastClient(
    baseUrl: 'https://your-proxy.example.com',
);

고급 사용법

감정 제어 (ssfm-v30)

ssfm-v30은 두 가지 감정 제어 모드를 제공합니다: 프리셋스마트.
AI가 문맥에서 감정을 추론합니다:
use Neosapience\Typecast\Models\{TTSRequest, SmartPrompt};

$response = $client->textToSpeech(new TTSRequest(
    voiceId: 'tc_672c5f5ce59fac2a48faeaee',
    text: '모든 것이 잘 될 거예요.',
    model: 'ssfm-v30',
    prompt: new SmartPrompt(
        previousText: '방금 최고의 소식을 들었어요!',
        nextText: '축하하고 싶어요!',
    ),
));

오디오 커스터마이징

음량, 피치, 템포, 출력 포맷을 제어합니다:
use Neosapience\Typecast\Models\{TTSRequest, Output};

$response = $client->textToSpeech(new TTSRequest(
    voiceId: 'tc_672c5f5ce59fac2a48faeaee',
    text: '커스터마이징된 오디오 출력!',
    model: 'ssfm-v30',
    output: new Output(
        targetLufs: -14.0,
        audioPitch: 2,
        audioTempo: 1.2,
        audioFormat: 'mp3',
    ),
    seed: 42,
));

file_put_contents('output.mp3', $response->audioData);

파일로 바로 생성하기

generateToFile은 음성 합성과 파일 저장을 한 번에 처리합니다. model은 기본값으로 ssfm-v30을 사용하고, .mp3 또는 .wav 확장자로 출력 형식을 결정합니다.
$client->generateToFile(
    'hello.mp3',
    '안녕하세요, 타입캐스트입니다.',
    'tc_672c5f5ce59fac2a48faeaee' // voice_id는 https://typecast.ai/developers/api/voices 에서 확인하세요.
);

캐릭터 탐색 (V2 API)

향상된 메타데이터와 함께 사용 가능한 캐릭터를 조회합니다:
use Neosapience\Typecast\Models\VoicesV2Filter;

// 모든 캐릭터 조회
$voices = $client->getVoicesV2();

// 필터링
$filtered = $client->getVoicesV2(new VoicesV2Filter(
    model: 'ssfm-v30',
    gender: 'female',
    age: 'young_adult',
));

foreach ($voices as $voice) {
    echo "ID: {$voice->voiceId}, 이름: {$voice->voiceName}\n";
}

// 특정 캐릭터 조회
$voice = $client->getVoiceV2('tc_672c5f5ce59fac2a48faeaee');

스트리밍

콜백을 통해 실시간으로 오디오 청크를 스트리밍합니다:
use Neosapience\Typecast\Models\TTSRequestStream;

$first = true;
$client->textToSpeechStream(
    new TTSRequestStream(
        voiceId: 'tc_672c5f5ce59fac2a48faeaee',
        text: '이 텍스트를 실시간으로 오디오로 스트리밍합니다.',
        model: 'ssfm-v30',
    ),
    function (string $chunk) use (&$first): void {
        if ($first) {
            $chunk = substr($chunk, 44); // 44바이트 WAV 헤더 건너뛰기
            $first = false;
        }
        // $chunk는 32000 Hz 16비트 모노 원시 PCM
        // 오디오 출력으로 전달 또는 ffplay로 파이핑
    },
);
WAV 스트리밍 형식: 32000 Hz, 16비트, 모노 PCM. 첫 번째 청크에 44바이트 WAV 헤더(size = 0xFFFFFFFF)가 포함되며, 이후 청크는 원시 PCM 데이터만 포함합니다. MP3 형식: 320 kbps, 44100 Hz, 각 청크는 독립적으로 디코딩 가능합니다.

타임스탬프 TTS

textToSpeechWithTimestamps()POST /v1/text-to-speech/with-timestamps를 래핑하며, 오디오와 함께 단어·문자 단위 정렬 데이터를 반환합니다. 가라오케 하이라이트, 자막 생성, 립싱크 애플리케이션에 활용할 수 있습니다.

기본 사용법

<?php
require 'vendor/autoload.php';

use Typecast\TypecastClient;
use Typecast\Models\TTSRequestWithTimestamps;

$client = new TypecastClient('YOUR_API_KEY');

$result = $client->textToSpeechWithTimestamps(new TTSRequestWithTimestamps([
    'voice_id' => 'tc_60e5426de8b95f1d3000d7b5',
    'text'     => 'Hello. How are you?',
    'model'    => 'ssfm-v30',
]));

file_put_contents('output.wav', $result->audioBytes());
printf("재생 시간: %.3f초\n", $result->audioDuration);

foreach ($result->words as $word) {
    printf("  [%.3fs – %.3fs] %s\n", $word->startTime, $word->endTime, $word->text);
}

정밀도(Granularity) 설정

'granularity' => 'word'(기본값) 또는 'granularity' => 'char'를 설정해 정렬 단위를 제어합니다.
// 문자 단위 정렬 — 일본어·중국어에 필수
$result = $client->textToSpeechWithTimestamps(new TTSRequestWithTimestamps([
    'voice_id'    => 'tc_60e5426de8b95f1d3000d7b5',
    'text'        => 'Hello. How are you?',
    'model'       => 'ssfm-v30',
    'granularity' => 'char',
]));

자막 내보내기

$srt = $result->toSrt();
file_put_contents('output.srt', $srt);

$vtt = $result->toVtt();
file_put_contents('output.vtt', $vtt);
일본어·중국어: 공백 구분자가 없는 언어(jpn, zho)는 단어 단위 세그먼트가 의미를 갖지 않습니다. 해당 언어에는 'granularity' => 'char'를 사용해 문자 단위 정렬 데이터를 얻으세요.

지원 언어

37개 언어를 지원하며 자동 언어 감지 기능을 제공합니다:
코드언어코드언어코드언어
eng영어jpn일본어ukr우크라이나어
kor한국어ell그리스어ind인도네시아어
spa스페인어tam타밀어dan덴마크어
deu독일어tgl타갈로그어swe스웨덴어
fra프랑스어fin핀란드어msa말레이어
ita이탈리아어zho중국어ces체코어
pol폴란드어slk슬로바키아어por포르투갈어
nld네덜란드어ara아랍어bul불가리아어
rus러시아어hrv크로아티아어ron루마니아어
ben벵골어hin힌디어hun헝가리어
nan민난어nor노르웨이어pan펀자브어
tha태국어tur터키어vie베트남어
yue광둥어
언어를 지정하지 않으면 입력 텍스트에서 자동으로 감지됩니다.

에러 처리

SDK는 HTTP 에러별 구체적인 예외를 발생시킵니다:
use Neosapience\Typecast\Exceptions\{
    TypecastException,
    UnauthorizedException,
    PaymentRequiredException,
    RateLimitException,
};

try {
    $response = $client->textToSpeech($request);
} catch (UnauthorizedException $e) {
    echo "유효하지 않은 API 키: {$e->getMessage()}\n";
} catch (PaymentRequiredException $e) {
    echo "크레딧 부족\n";
} catch (RateLimitException $e) {
    echo "요청 한도 초과 - 잠시 후 재시도\n";
} catch (TypecastException $e) {
    echo "에러: {$e->getMessage()}\n";
}
예외상태 코드설명
BadRequestException400잘못된 요청 파라미터
UnauthorizedException401유효하지 않거나 누락된 API 키
PaymentRequiredException402크레딧 부족
NotFoundException404리소스를 찾을 수 없음
UnprocessableEntityException422유효성 검사 오류
RateLimitException429요청 한도 초과
InternalServerException500서버 오류

API 레퍼런스

TypecastClient 메서드

메서드설명
textToSpeech(TTSRequest)텍스트를 음성 오디오로 변환
generateToFile(path, text, voiceId)음성을 생성하고 로컬 파일로 바로 저장
textToSpeechStream(TTSRequestStream, callable)콜백을 통한 오디오 청크 스트리밍
getMySubscription()구독 정보 조회
getVoices(?string $model)사용 가능한 캐릭터 조회 (V1)
getVoicesV2(?VoicesV2Filter)메타데이터와 함께 캐릭터 조회 (V2)
getVoiceV2(string $voiceId)특정 캐릭터 조회