Interfejs API synchronizacji ruchu warg dla filmów z dubbingiem

Dopasuj ruch ust do przetłumaczonego głosu w ponad 135 językach i wariantach regionalnych. Przetłumacz wideo przez API, włącz synchronizację ust i pobierz materiał, na którym osoba w filmie wypowiada nowe słowa. Najpierw przeprowadzane jest sprawdzenie twarzy. Usługa synchronizacji ust jest rozliczana osobno od tłumaczenia dla każdego wygenerowanego pełnego wideo, w tym ponownych generacji po edycji.
Darmowa minuta podglądu
Wiele twarzy na ekranie
REST + Python SDK
check, preview, sync
OAuth 2.0
# 1. on a dubbed project: confirm the video has a face (runs once, usually automatically)
curl https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN"
#  "check_face_task_status": "done", "video_has_face": true

# 2. preview one free minute of lip-sync
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": true}'

# 3. lip-sync the full video - billed separately from dubbing
curl -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": false}'
GET /v2/projects/{project_id}/lipsync
polling, 15s
# Poll until lipsync_task_status is done, then download lipsync_result_path
while :; do
  curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
    | jq '{lipsync_task_status, lipsync_task_progress, tasks_in_lipsync_queue}'
  sleep 15
done
Używane przez zespoły na całym świecie
Możliwości

Wszystko, co potrafi API synchronizacji ust

Dodaj synchronizację ust do przetłumaczonych filmów. Sprawdź obecność widocznej twarzy, skorzystaj z darmowej minuty w swoim koncie, jeśli jest dostępna, i śledź postępy przez API. Pełna synchronizacja ust wideo jest rozliczana osobno za każdym razem, gdy ją generujesz.

Synchronizacja ust w przetłumaczonym wideo

Dopasuj ruch ust do przetłumaczonego głosu w filmie przygotowanym w Twoim projekcie, spośród ponad 135 obsługiwanych języków i wariantów regionalnych.

Automatyczne sprawdzanie twarzy

Przed synchronizacją ust funkcja sprawdzania twarzy potwierdza, że w filmie występuje co najmniej jedna twarz. Działa to raz na projekt, zazwyczaj samodzielnie, dzięki czemu widzisz wynik przed zużyciem swoich minut.

Kilka twarzy na ekranie

Ustaw is_multiple_speakers na wartość true w przypadku wywiadów, paneli i rozmów z wieloma osobami. Gdy na ekranie widoczna jest tylko jedna twarz, ustaw wartość na false, aby przyspieszyć przetwarzanie.

Jedna darmowa minuta podglądu

każde konto otrzymuje darmową minutę synchronizacji ust. Uruchom ją z parametrem is_free_lipsync na własnym materiale i sprawdź efekt przed zsynchronizowaniem całego wideo.

Osobne rozliczenie dla każdej generacji

Każde wygenerowanie pełnej synchronizacji ust wideo jest rozliczane osobno od tłumaczenia. Po edycji tekstu lub głosu przetłumacz projekt ponownie i wygeneruj nową zsynchronizowaną wersję, co wiąże się z osobną opłatą.

Pozycja w kolejce i postęp

Punkt końcowy informacji o synchronizacji ust zwraca liczbę zadań oczekujących przed Twoim oraz postęp od 0 do 100, dzięki czemu Twoi użytkownicy widzą rzeczywisty stan prac.

Głosy dopasowane do twarzy

Synchronizacja ust działa z głosem, którego projekt używa dla danej osoby: jej sklonowanym głosem lub gotowym głosem AI.

Edytuj, przetłumacz ponownie, zsynchronizuj ponownie

Zmień tekst, czas lub głosy, przetłumacz projekt ponownie, a następnie uruchom synchronizację ust dla nowej wersji. Sprawdzanie twarzy nie musi być wykonywane ponownie.

Skaluj bez ograniczeń

Brak limitów zapytań, brak limitów równoczesności, brak ograniczeń klucza. Wysyłaj zadania synchronizacji ust dla całego swojego katalogu, a pozycja w kolejce wskaże status każdego z nich.
Zobacz jak to działa

Od zdubbingowanej mowy do dopasowanego ruchu warg

Ten sam klip z dubbingiem w języku francuskim, niemieckim, portugalskim i hiszpańskim. W takich projektach funkcja synchronizacji warg dopasowuje ruch ust do nowej mowy.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
Przepływ pracy

Trzy kroki od zdubbingowanego wideo do wideo z synchronizacją warg

Synchronizacja warg działa w projekcie, który ma już stworzony dubbing. Użyj punktu końcowego /generate, aby ponownie wygenerować dubbing po edycji, a następnie ponownie zsynchronizuj usta.
1

Dodaj dubbing do wideo

Prześlij film lub podaj publiczny adres URL, utwórz projekt w wybranym języku docelowym i poczekaj na zakończenie scalania. Do synchronizacji warg potrzebny jest przetłumaczony film z tego projektu.

POST /v2/projects
2

Sprawdź twarz

To zadanie potwierdza obecność co najmniej jednej twarzy na nagraniu. Zazwyczaj uruchamia się automatycznie. Jeśli tak się nie stało, uruchom je samodzielnie dla danego projektu.

PUT /v2/projects/{id}/check_face
3

Uruchom synchronizację i pobierz plik

Uruchom zadanie synchronizacji warg, śledź jego postęp od 0 do 100, a następnie pobierz film ze ścieżki wynikowej.

PUT /v2/projects/{id}/lipsync
Czas przetwarzania zależy od długości filmu i kolejki zadań. Informacyjny punkt końcowy pokazuje, ile zadań znajduje się przed Twoim.
Stworzone z myślą o Tobie

Potrzebujesz synchronizacji ruchu warg w szczególnym przypadku? Skontaktuj się z naszym zespołem

Większa wydajność, priorytet przetwarzania i własna metoda dostarczania: jeśli integracja wymaga czegoś spoza standardowej oferty, nasz zespół przeanalizuje Twoje wymagania i dostępne opcje.

Języki i głosy

Potrzebujesz języka lub głosu spoza publicznego katalogu? Porozmawiaj z naszym zespołem o swoich wymaganiach i dostępnych opcjach.

Dostarczanie i integracja

Webhooki, przesyłanie do własnej kolejki, dostarczanie bezpośrednio do S3, niestandardowe endpointy. Powiedz nam, jak Twój system oczekuje danych.

Wolumen i przepustowość

Rozmiary partii, liczba języków docelowych na akcję i priorytet przetwarzania to warunki umowy, a nie sztywne limity produktu.

Bezpieczeństwo i hosting

Kwestie związane z przechowywaniem danych, logowaniem SSO i SAML, zasadami ich zachowania oraz wsparciem przy audycie bezpieczeństwa są omawiane podczas wdrażania planu dla firm.
Przykłady zastosowań

Kto korzysta z API do synchronizacji warg

Platformy zawierające materiały wideo

Platformy edukacyjne, platformy wideo dla twórców, narzędzia do webinarów i wydarzeń wirtualnych, hosting wideo, cyfrowe platformy adopcyjne oraz transmisje na żywo. Dodaj synchronizację warg do filmów, które Twoi użytkownicy już publikują, aby przetłumaczeni prezenterzy wyglądali naturalnie na ekranie, a funkcja ta stała się wyróżnikiem Twojego produktu.

Agencje lokalizacji i produkcyjne

Zaoferuj synchronizację warg jako osobną usługę uzupełniającą dubbing. Skorzystaj z darmowych minut testowych na swoim koncie, jeśli są dostępne, aby ocenić wynik. Uwzględnij pełną synchronizację warg oraz ewentualne poprawki w wycenach dla klientów.

Wewnętrzna, ciągła produkcja wideo

Międzynarodowy handel detaliczny, globalne franczyzy, wydawcy mediów i uniwersytety korporacyjne. W przypadku materiałów marketingowych i szkoleniowych, na których widać twarz mówiącego, synchronizacja sprawia, że mowa idealnie pasuje do osoby na ekranie na każdym rynku.
Historie klientów

Prawdziwe zespoły, wymierne wyniki

Jak firmy lokalizują wideo z Rask, wyrażone w liczbach.
strzałka
strzałka
Kod

Przykłady kodu API do synchronizacji warg

Kompletny przykład w każdym języku dla projektu z gotowym dubbingiem: sprawdź twarz, uruchom synchronizację, śledź postęp i pobierz wynik.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

PROJECT_ID = "..."   # a project with status merging_done

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)

    info = await client.get_lipsync_info(project_id=PROJECT_ID)
    if info.check_face_task_status is not enums.LipsyncStatus.DONE:
        await client.run_check_face_task(project_id=PROJECT_ID)
        while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).check_face_task_status is not enums.LipsyncStatus.DONE:
            await asyncio.sleep(10)
    if not info.video_has_face:
        raise SystemExit("No face found - lip-sync is not available for this video")

    await client.run_lipsync_task(project_id=PROJECT_ID,
        data=schemas.LipsyncTaskData(is_multiple_speakers=True, is_free_lipsync=False))

    while (info := await client.get_lipsync_info(project_id=PROJECT_ID)).lipsync_task_status is not enums.LipsyncStatus.DONE:
        print(info.lipsync_task_progress, info.tasks_in_lipsync_queue)
        await asyncio.sleep(15)

    print(info.lipsync_result_path)

asyncio.run(main())
github.com/braskai/rask-sdk
async, typed models
import time, requests

AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
URL  = f"https://api.rask.ai/v2/projects/{PROJECT_ID}"   # a dubbed project

token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
                      data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}

info = requests.get(f"{URL}/lipsync", headers=h).json()
if info["check_face_task_status"] != "done":
    requests.put(f"{URL}/check_face", headers=h)
    while (info := requests.get(f"{URL}/lipsync", headers=h).json())["check_face_task_status"] != "done":
        time.sleep(10)
assert info["video_has_face"], "No face found"

requests.put(f"{URL}/lipsync", headers=h,
             json={"is_multiple_speakers": True, "is_free_lipsync": False})

while (info := requests.get(f"{URL}/lipsync", headers=h).json())["lipsync_task_status"] not in ("done", "failed"):
    time.sleep(15)

print(info["lipsync_task_status"], info["lipsync_result_path"])
requests + polling
no SDK required
// no dependencies, Node 18+ global fetch - PROJECT_ID is a dubbed project
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
  method: 'POST',
  headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
  body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const url = `https://api.rask.ai/v2/projects/${PROJECT_ID}`;
const info = () => fetch(`${url}/lipsync`, { headers: h }).then((r) => r.json());

let i = await info();
if (i.check_face_task_status !== 'done') {
  await fetch(`${url}/check_face`, { method: 'PUT', headers: h });
  while ((i = await info()).check_face_task_status !== 'done') await sleep(10000);
}
if (!i.video_has_face) throw new Error('No face found');

await fetch(`${url}/lipsync`, {
  method: 'PUT', headers: h,
  body: JSON.stringify({ is_multiple_speakers: true, is_free_lipsync: false }),
});

while (!['done', 'failed'].includes((i = await info()).lipsync_task_status)) {
  console.log(i.lipsync_task_progress, i.tasks_in_lipsync_queue);
  await sleep(15000);
}
console.log(i.lipsync_result_path);
fetch, Node 18+
plain HTTP
# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)

# 2. face check on the dubbed project - start it only if it has not run yet
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
  | jq '{check_face_task_status, video_has_face}'
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/check_face -H "Authorization: Bearer $TOKEN"

# 3. run lip-sync (set is_free_lipsync to true for the free preview minute)
curl -s -X PUT https://api.rask.ai/v2/projects/$ID/lipsync \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"is_multiple_speakers": true, "is_free_lipsync": false}'

# 4. follow progress, then download the result
curl -s https://api.rask.ai/v2/projects/$ID/lipsync -H "Authorization: Bearer $TOKEN" \
  | jq '{lipsync_task_status, lipsync_task_progress, lipsync_result_path}'
PUT /v2/projects/{id}/lipsync
OAuth 2.0 client credentials
<?php
use GuzzleHttp\Client;

$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
    ['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];
$info = fn() => $json($http->get("/v2/projects/$projectId/lipsync", ['headers' => $h]));

$i = $info();
if ($i['check_face_task_status'] !== 'done') {
    $http->put("/v2/projects/$projectId/check_face", ['headers' => $h]);
    while (($i = $info())['check_face_task_status'] !== 'done') sleep(10);
}
if (!$i['video_has_face']) exit('No face found');

$http->put("/v2/projects/$projectId/lipsync", ['headers' => $h,
    'json' => ['is_multiple_speakers' => true, 'is_free_lipsync' => false]]);

while (!in_array(($i = $info())['lipsync_task_status'], ['done', 'failed'])) sleep(15);
echo $i['lipsync_result_path'];
Guzzle 7
plain HTTP
Python to oficjalny pakiet SDK. Zakładki Node, PHP i cURL przedstawiają proste przykłady żądań HTTP dla tych samych punktów końcowych.
Postęp

Jak zgłaszany jest postęp zadania synchronizacji warg

Punkt informacyjny zgłasza wykrycie twarzy, status zadania, pozycję w kolejce oraz postęp od 0 do 100. Musisz zareagować tylko na trzy grupy.

Sukces, zatrzymaj się tutaj

lipsync_task_status: done
lipsync_task_progress: 100
Synchronizacja warg została ukończona. Link do pobrania znajduje się we właściwej ścieżce wynikowej.

W toku, sprawdzaj dalej

check_face_task_status: started
lipsync_task_status: started
lipsync_task_progress: 0-99
tasks_in_lipsync_queue
Gdy postęp ma wartość null, zadanie znajduje się w kolejce: tasks_in_lipsync_queue pokazuje, ile zadań ma priorytet.

Błąd, zatrzymanie i raport

lipsync_task_status: failed
check_face_task_status: failed
video_has_face: false
Nie można zsynchronizować warg na filmie, na którym nie widać twarzy. W przypadku niepowodzenia zadania skontaktuj się z wsparciem, podając project_id.
Lip-sync task, as GET /lipsync reports it
GET /v2/projects/{project_id}/lipsync
check face     check_face_task_status  done     video_has_face  true
queued         lipsync_task_status     started  tasks_in_lipsync_queue  2
processing     lipsync_task_progress   0 → 50 → 100
complete       lipsync_task_status     done
               lipsync_result_path     https://...

Lub całkowicie pomiń sprawdzanie

Wskaż nam punkt końcowy webhooka, a każda zmiana stanu pojawi się jako żądanie POST, dzięki czemu Twoja kolejka zareaguje na każdą zmianę w momencie jej wystąpienia. Dostarczanie przez webhook jest częścią wdrożenia dla klientów korporacyjnych.
Przeczytaj dokumentację
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
Wynik

Wideo z synchronizacją ust, dubbingiem i napisami

Pobierz wygenerowane wideo ze ścieżki wynikowej. Projekt zachowuje zdubbingowane wideo bez synchronizacji ust oraz przetłumaczone napisy w formacie SRT i VTT, a w wybranych planach także przetłumaczony głos jako osobne ścieżki dźwiękowe.
Pole
Format
Co to jest
lipsync_result_path
MP4
Wideo z zsynchronizowanymi ustami, gotowe do publikacji
voiceover
WAV
Tylko przetłumaczona mowa do własnego miksu
translated_audio
WAV
Przetłumaczona mowa zmiksowana z oryginalnym dźwiękiem w tle
translation_srt_path
.srt
Napisy w języku docelowym
translation_vtt_path
.vtt
Te same napisy w formacie WebVTT, do odtwarzaczy webowych
translated_video
MP4
Zdubbingowane wideo bez synchronizacji ust – do porównania
Kontrola

Edytuj dubbing, a następnie wygeneruj zaktualizowaną wersję z synchronizacją ust

Po zmianie tekstu, czasu trwania lub głosów zrób ponowny dubbing zmienionych fragmentów i wygeneruj synchronizację ust dla zaktualizowanego wideo. Ponowny dubbing oraz każde nowe generowanie synchronizacji ust dla całego wideo są rozliczane osobno.

Edycja na poziomie segmentów

Edycja na poziomie segmentów
Edytuj poszczególne fragmenty transkrypcji i zdubbuj zmienione linie. Aby zaktualizować ruch ust, wygeneruj nową synchronizację ust dla całego wideo; jest to rozliczane osobno.
Pobierz transkrypcję i jej segmenty
Zmień tekst źródłowy, a my przetłumaczymy go ponownie
Edytuj przetłumaczony tekst bezpośrednio, aby zachować własne słownictwo
Dopasowuj znaczniki czasu, dodawaj segmenty i usuwaj je
Zmień głos przypisany do dowolnego mówcy

Słowniczki terminologii

Słowniczki terminologii
Dodaj słowniczek, aby nazwy marek i pojęcia techniczne brzmiały tak samo w każdym dubbingu, a synchronizacja ust uwzględniała te same słowa.

Jeden słowniczek obejmuje jedną parę językową i działa we wszystkich odmianach regionalnych tego języka docelowego, więc jeden hiszpański słowniczek obsłuży es-mx oraz es-es podobnie. Projekt rejestruje wersja_słownika, dzięki czemu późniejsze poprawki nigdy nie zmieniają ukończonej pracy w tle.
Dane wejściowe

Obsługiwane formaty plików

Prześlij plik w jednym z siedmiu formatów wideo lub podaj publiczny adres URL. Pliki samych dźwięków nie zawierają twarzy na ekranie, więc synchronizacja ust dotyczy wyłącznie wideo.

Wideo

7 formatów
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

Audio

4 formaty
.mp3
.wav
.flac
.m4a

Metadane przed wydaniem środków

Ten punkt końcowy zwraca czas trwania, rozmiar pliku, kodek wideo, liczbę klatek na sekundę, rozdzielczość, kodek audio, częstotliwość próbkowania i układ kanałów. Sprawdź plik i oszacuj koszt z góry, ponieważ dubbing i synchronizacja ust są rozliczane za minutę długości wideo.
Bezpieczeństwo i zgodność z przepisami

Bezpieczna obsługa twarzy i głosów

Rask Inc posiada certyfikat SOC 2 Type II, działa zgodnie z RODO i publikuje aktualny status zabezpieczeń w swoim Centrum Zaufania. Wideo zawierające twarze i głosy są przetwarzane w zamkniętym środowisku AI.

Certyfikaty

SOC 2 Type II
RODO
Członek CAI i C2PA

Szyfrowanie

TLS 1.2 w tranzycie
AES-256 w spoczynku
Klucze zarządzane SSE-S3
Rotacja kluczy co najmniej co 12 miesięcy

Twoje treści

Zamknięte środowisko AI
Nigdy nieużywane do trenowania ogólnych modeli
Pełny eksport, bez wiązania się z jedną platformą

Dostęp

SSO i SAML
Kontrola dostępu oparta na rolach
Poświadczenia klienta OAuth 2.0

Dla firm

Opcje lokalizacji danych
Niestandardowe umowy SLA
Dedykowany opiekun klienta

Prawa do głosu

Syntetyczne głosy z prawami do użytkowania
Klonowanie głosu oparte na zgodzie
Zasady bezpieczeństwa AI, człowiek w pętli
Porównanie

API Rask a samodzielnie budowany system synchronizacji ust

Samodzielne API do synchronizacji ust wymaga gotowej ścieżki dźwiękowej w języku docelowym. Rask tworzy ścieżkę dubbingu i synchronizuje usta w ramach jednego projektu. Oto ten sam wynik uzyskany na dwa sposoby.
Czego potrzebujesz
Rask API
Złożone z części
Przetłumaczona ścieżka dźwiękowa do zsynchronizowania
Stworzone w ramach tego samego projektu
Najpierw dostawcy transkrypcji, tłumaczenia i syntezy mowy
Weryfikacja twarzy przed dokonaniem płatności
Automatycznie, raz na projekt
Twój własny krok wykrywania twarzy
Kilka twarzy na ekranie
is_multiple_speakers: true
Samodzielnie skonfigurowane śledzenie poszczególnych twarzy
Podgląd przed pełnym przetworzeniem
Jedna darmowa minuta na konto
Płać za każdą próbę
Zsynchronizuj ponownie po edycji tekstu
Nowa generacja synchronizacji ruchu warg dla całego wideo, rozliczana osobno
Zapłać ponownie za cały plik
Muzyka w tle i efekty
Zachowane przy nowym głosie
Samodzielnie przygotowany krok oddzielania źródeł
Napisy w formatach .srt i .vtt
W zestawie
Generowane na podstawie własnych danych czasowych
Widoczność w kolejce
Pozycja w kolejce i postęp 0-100
Wszystko, co udostępnia Twój dostawca
Limity zapytań
Brak
Wszystko, czego wymaga Twój najsurowszy dostawca
Rozliczenia
Za każdą wygenerowaną synchronizację ruchu warg dla całego wideo
Za każde uruchomienie i każdego dostawcę
Najczęściej zadawane pytania

Interfejs API synchronizacji ruchu warg: najczęściej zadawane pytania

Nie możesz znaleźć tego, czego szukasz? Skontaktuj się z działem sprzedaży.

Czy istnieje interfejs API do synchronizacji ruchu warg?

Czy mogę zsynchronizować ruch warg na wideo bez wcześniejszego dubbingu?

Czy mogę zsynchronizować ruch warg z własną ścieżką dźwiękową?

Czy API generuje mówiące awatary ze zdjęcia lub opisu tekstowego?

Czego wymaga wideo, aby przeprowadzić synchronizację ruchu warg?

Jak rozliczana jest synchronizacja ruchu warg?

Czy dostępny jest darmowy podgląd synchronizacji ruchu warg?

Czy synchronizacja ruchu warg działa w przypadku wielu osób mówiących?

Jak mogę śledzić postęp synchronizacji ruchu warg?

Jak długo trwa synchronizacja ruchu warg?

Co się dzieje po edycji dubbingu?

Co w przypadku niepowodzenia synchronizacji ruchu warg?

Jak mogę uzyskać dostęp do API i klucz API?

Rozpocznij dubbingowanie w jedno popołudnie

Wyślij swoje pierwsze zapytanie już dziś i skontaktuj się z nami, gdy potrzebujesz warunków dla dużych wolumenów lub języka, którego nikt inny nie ma.