Ses¶
TEBHOS sesi LiveKit üzerinden çalıştırır. Gateway bir oturumu bir ses kanalına yerleştirir ve ona tek bir kimlik bilgisi verir. İstemci bu kimlik bilgisini bir LiveKit medya sunucusuna sunar ve her parça (track) orada açtığı bağlantı üzerinden gider. Mikrofon, kamera ve ekran paylaşımı bu tek bağlantı üzerindeki parça kaynaklarıdır; bu nedenle yayına geçmek yeni hiçbir şey açmaz.
Yerleştirme protokolü İstemci komutları ve Gateway olayları sayfalarında tanımlanır.
Ses yüzeyleri¶
| Yüzey | Nedir | Başvuru |
|---|---|---|
| Sunucu ses kanalı | Ses türündeki bir sunucu kanalı; mesajları, sabitlemeleri ve yavaş modu da vardır | Kanallar |
| Özel arama | Bir ses kanalının DM ve grup DM karşılığı | Aramalar |
| Go Live yayını | Üyenin zaten sahip olduğu bir ses bağlantısında ek bir parça olarak yayımlanan ekran paylaşımı. İkinci bir bağlantı açmaz ve ikinci bir kimlik bilgisi vermez | Yayınlar |
| Giriş sesi | Bir ses kanalına zaten bağlı olan herkese duyurulan kısa bir klip. Medya parçası yayımlamayan tek yüzey | Giriş sesleri |
| Ses etkinliği paylaşımı | Bir arkadaşa hesabın hangi ses kanalında olduğunun bildirilip bildirilmeyeceği | Kullanıcı ayarları |
TEBHOS ayrıca LiveKit üzerine kurulu, ayrı bir birinci taraf özellik olan herkese açık canlı odalar da çalıştırır. Bunlar bu başvuruda ele alınmaz.
Medya aktarımı¶
Medya hiçbir zaman HTTP API'den geçmez. Hiçbir yol ses veya video parçası döndürmez ve yerleştirme kimlik bilgisi yalnızca Gateway tarafından iletilir.
TEBHOS kendine ait bir sinyalleşme protokolü yayımlamaz. Ses WebSocket'i, ses işlem kodu (opcode) kümesi, UDP keşif adımı ve ayrı bir şifreleme el sıkışması yoktur. İstemci, Voice Server Update yetkisinin belirttiği endpoint adresine bağlanır, yetkinin token değerini sunar ve oradan itibaren LiveKit protokolünü konuşur.
| Kavram | Değer |
|---|---|
| Oda adı, sunucu ses kanalı | {channel_id} |
| Oda adı, özel arama | dm_{channel_id} |
| Katılımcı kimliği | user_{user_id}_{connection_id} |
| Yetki ömrü | 6 saat |
Bir oda bir ses kanalıdır, bir katılımcı da bir ses bağlantısıdır. Aynı kanalda birkaç bağlantıya sahip bir üye, aynı odada birkaç katılımcıdır; bir hesap birden fazla cihazdan bu şekilde bulunur.
Yetki, bağlantının yayımlayabileceği parça kaynaklarını belirtir. SPEAK microphone kaynağına, STREAM ise camera, screen_share ve screen_share_audio kaynaklarına izin verir. Sunucu tarafından sağırlaştırılmış bir bağlantı ne yayımlayabilir ne de abone olabilir. Özel bir aramada her katılımcı her kaynağı yayımlayabilir.
Dağıtım özellik durumu¶
Bir dağıtım ses olmadan yapılandırılabilir. Örnek (instance) keşif belgesi bu durumu features.voice_enabled olarak bildirir; bir LiveKit sunucusu yapılandırılmışsa değer true olur. False olduğunda hiçbir medya kimlik bilgisi verilemez ve her yerleştirme yetki olmadan başarısız olur.
Yerleştirme¶
Voice State Update, bir oturumun nerede olmak istediğini bildirir. self_mute, self_deaf, self_video ve self_stream ile birlikte hedef guild_id, channel_id ve connection_id değerlerini taşır. Null bir channel_id ayrılır; arama yerleştirmesinde guild_id her zaman null'dır.
| Komut biçimi | Sonuç |
|---|---|
channel_id var, connection_id yok |
Yeni bir bağlantı açar |
channel_id ve bir connection_id |
O bağlantıyı günceller veya taşır |
Null channel_id ve bir connection_id, sunucuda |
O bağlantıyı bırakır |
Null channel_id ve connection_id yok, sunucuda |
VOICE_MISSING_CONNECTION_ID ile reddedilir |
Null channel_id ve bir connection_id, aramada |
O arama bağlantısını bırakır |
Null guild_id, null channel_id ve connection_id yok |
Oturumun sahip olduğu tüm ses üyeliklerini bırakır |
Sunucu, ortaya çıkan üyelik için kanalı görebilen her oturuma iletilen bir Voice State Update ile ve yalnızca isteği yapan oturuma iletilen bir Voice Server Update ile yanıt verir. Bu yetki, dağıtımın seçtiği medya sunucusunun token, endpoint, channel_id ve connection_id değerlerini taşır. guild_id sunucu ses kanalı için bulunur, arama için gönderilmez. Kanal uçtan uca şifreliyse ayrıca bir e2ee_key taşır.
Yetki; bir bağlantı açıldığında, başka bir kanala taşındığında ve bölge değiştiğinde verilir. Aynı kanalda kalan bir güncelleme hiçbir şeyi yeniden vermez; dolayısıyla self_mute, self_video veya self_stream değiştirmek bir Voice State Update üretir ve yeni yetki üretmez.
Yetki token değerini yalnızca medya bağlantısı kullanır. Hiçbir HTTP yolu onu kabul etmez.
Reddedilen bir yerleştirme hiçbir Dispatch üretmez. İstemci bunu yalnızca yetkinin gelmemesinden anlar.
Asgari istemci akışı¶
import { Room } from "livekit-client";
// 1. Ask the Gateway to place this session in a voice channel.
gateway.send(JSON.stringify({
op: 4,
d: {
guild_id: "1189375284394692608",
channel_id: "1189375284394692610",
self_mute: false,
self_deaf: false,
},
}));
// 2. Wait for the grant and connect to LiveKit with it.
gateway.on("VOICE_SERVER_UPDATE", async (grant) => {
const room = new Room();
await room.connect(grant.endpoint, grant.token);
await room.localParticipant.setMicrophoneEnabled(true);
});
// 3. Leave: null channel with the connection_id from the grant.
function leave(guildId, connectionId) {
gateway.send(JSON.stringify({
op: 4,
d: { guild_id: guildId, channel_id: null, connection_id: connectionId },
}));
}
Sunucu ses kanalları¶
Bir sunucu ses kanalı bitrate, user_limit, voice_connection_limit ve rtc_region değerlerini kanal nesnesinde saklar. Ayrıca Mesajlar kaynağı üzerinden okunup yazılan sıradan mesajları, sabitlemeleri ve yavaş modu vardır.
Yeni bir ses kanalı saniyede 64000 bit (64 kbps) bit hızı saklar; bit hızı her zaman saniyede bit olarak saklanır ve döndürülür. Kabul edilen aralık 8 kbps'den başlar. Üst sınır 96 kbps'dir; TEBHOS Pro'ya sahip bir üye için 128 kbps, takviye seviyesi 1 veya 2 olan bir sunucuda 128 kbps veya 384 kbps'dir; Pro ve takviye üst sınırlarından yüksek olanı uygulanır. Kesin bit hızı kuralları için Kanallar sayfasına bakın.
İzinler¶
| İzin | Ses üzerindeki etkisi |
|---|---|
| VIEW_CHANNEL ve CONNECT | Kanalda bir ses bağlantısı tutmak için ikisi de gereklidir. Birinden yoksun bir üye VOICE_PERMISSION_DENIED ile reddedilir |
| SPEAK | Ses yayımlama. Bu izni olmayan üye suppress true olarak kabul edilir |
| STREAM | Kamera videosu ve Go Live medyası yayımlama. Tek bir bit ikisini de denetler |
| MUTE_MEMBERS | Moderatör susturması veya sağırlaştırması uygulama ve kaldırma |
| MOVE_MEMBERS | Bir üyeyi başka bir sunucu ses kanalına taşıma veya bağlantısını kesme |
| UPDATE_RTC_REGION | Kanalın rtc_region değerini değiştirme |
ADMINISTRATOR bu tablonun her satırını karşılar. İki durum VIEW_CHANNEL ve CONNECT denetimini atlar: sunucunun zaten taşımakta olduğu bir üye ve kanala sanal erişimi olan bir üye. Sunucu, VIEW_CHANNEL iznini kaybeden veya bir moderatörün göremeyeceği bir kanala taşıdığı bağlı bir üyeye sanal erişim verir.
Gateway bu izinleri bir yetki verirken denetler; sunucu da zaten açık olan bağlantılar için bunları yeniden denetler. Katılma, taşıma, bölge değişikliği, rol düzenleme, geçersiz kılma düzenleme ve üye rol değişikliğinin her biri SPEAK ve STREAM değerlerini yeniden hesaplar. Sunucu yeni sonucu canlı bağlantıya yeni bir Voice Server Update olmadan uygular: medya sunucusu, üyenin artık yayımlayamayacağı bir parçayı susturur ve VIEW_CHANNEL ile CONNECT denetimini geçemeyen bir bağlantıyı düşürür.
Moderasyon, sunucu üyeliği üzerinde bir HTTP işlemidir. Sunucu üyesini değiştirme mute, deaf, channel_id ve connection_id alanlarını kabul eder:
| Alan | Etki | Gereken izin |
|---|---|---|
| mute | Üyenin ses bağlantılarında moderatör susturması | MUTE_MEMBERS |
| deaf | Üyenin ses bağlantılarında moderatör sağırlaştırması | MUTE_MEMBERS |
| channel_id | Başka bir sunucu ses kanalına taşıma veya bağlantıyı kesmek için null |
MOVE_MEMBERS |
| connection_id | Taşımayı veya bağlantı kesmeyi üyenin bağlantılarından biriyle sınırlar | Yok |
Başka bir üye üzerinde işlem yapmak ayrıca onunkinden daha yüksek bir rol gerektirir ve sunucu sahibi moderasyona tabi tutulamaz. Susturma veya sağırlaştırma medya sunucusuna yeni bir kimlik bilgisi olmadan ulaşır.
Kapasite¶
| Sınır | Red |
|---|---|
user_limit |
VOICE_CHANNEL_FULL |
voice_connection_limit |
VOICE_CONNECTION_LIMIT_REACHED |
| Kamerası açık 25 üye | VOICE_CAMERA_USER_LIMIT |
Saklanan 0 değerindeki user_limit sınır olmadığı anlamına gelir. Kanaldaki herhangi bir üyenin kamerası açıkken geçerli doluluk sınırı user_limit ile 25'ten küçük olanı olur.
voice_connection_limit, bir üyenin kanalda aynı anda tutabileceği bağlantı sayısının üst sınırıdır. Değer saklamayan bir kanal 5 olarak değerlendirilir ve değerler 1 ile 100 arasıyla sınırlıdır. Özel bir arama her üye için sabit 5 bağlantılık bir üst sınır uygular.
Zaman aşımı hâlâ sürmekte olan bir üye, herhangi bir izin veya kapasite denetiminden önce VOICE_MEMBER_TIMED_OUT ile reddedilir. e2ee_capable ile identify yapmamış bir oturum, kanal uçtan uca şifreleme gerektirdiği sürece VOICE_E2EE_REQUIRED ile reddedilir. Bot bundan muaftır.
Bölgeler¶
RTC bölgelerini listeleme, çağıranın bir ses kanalı için seçebileceği RTC bölgesi nesnelerini döndürür. Bir bölge yalnızca çağıran onun için yapılandırılmış her kısıtlamayı geçiyorsa döndürülür. Dizi boş olabilir.
rtc_region, Kanalı değiştirme ile yazılır ve UPDATE_RTC_REGION gerektirir. Null değer, boş string ve automatic ile auto değerleri otomatik yönlendirmeyi seçer; yerleştirilen hesabın ulaşamadığı saklanmış bir değer de aynı sonucu verir.
Otomatik yönlendirme, mümkün olduğunda istemcinin latitude ve longitude değerlerini kullanarak müsait bir sunucu seçer. Aynı kanaldaki katılımcılar bir sunucuyu paylaşır. Her zaman Voice Server Update'te döndürülen uç noktayı kullanın.
Özel aramalar¶
Özel bir aramada moderatör, izin geçersiz kılmaları ve moderatör susturması, sağırlaştırması veya bağlantı kesmesi yoktur. Katılma ve ayrılma, guild_id null olmak üzere aynı Voice State Update komutunu kullanır.
HTTP yüzeyi Aramalar kaynağına aittir: çağıranın arayıp arayamayacağını okur, alıcıları çaldırır, çalmalarını durdurur, etkin bir aramanın bölgesini değiştirir ve aramayı sonlandırır. Arama durumu Call Create, Call Update ve Call Delete ile yayımlanır.
Bir alıcının gelen arama ayarları onun çaldırılıp çaldırılmayacağına karar verir. Bu ayarlar hiç kimseyi, yalnızca arkadaşları, arkadaşların arkadaşlarını, sunucu üyelerini veya herkesi kabul edebilir; herkesi sessiz olarak da kabul edebilir. Herhangi bir yönde engellenmiş bir ilişki hiçbir zaman çalmaz.
Go Live yayınları¶
Yayına geçmek, üyenin kanalda zaten sahip olduğu LiveKit katılımcısı üzerinde bir ekran paylaşımı parçası ve onun ekran paylaşımı ses parçasını yayımlar. İkinci bir bağlantı, ikinci bir katılımcı ve ikinci bir connection_id yoktur. Yerleştirme sırasında STREAM iznine sahip olan bir üyenin yetkisinde her iki ekran paylaşımı kaynağı zaten bulunur; bu nedenle yeni kimlik bilgisi verilmez.
Yayımlayan, Voice State Update ile o bağlantıda self_stream değerini ayarlayarak ve bağlantının kendi connection_id değerini belirterek yayını duyurur. Sunucu ses durumunun version değerini artırır ve durumu yeniden yayınlar.
Kanalında STREAM izni olmayan bir bağlantının ses durumunda, istemci ne gönderirse göndersin self_stream ve self_video false olur.
Bir izleyici hangi yayınları izlediğini kendi ses durumundaki viewer_stream_keys ile bildirir; kanal taşıma bu listeyi sıfırlar.
Yayımlayanın connection_id değeri, yayın anahtarının son kesimidir; anahtar sunucu ses kanalı için {guild_id}:{channel_id}:{connection_id}, özel arama için dm:{channel_id}:{connection_id} biçimindedir. Yayınlar kaynağı bir bölge tercihini kaydeder ve bu anahtarla adreslenen JPEG önizleme görüntüsünü yönetir.
Giriş sesleri¶
Giriş sesi, bir hesabın bir ses kanalına zaten bağlı olan herkes için çaldığı kısa bir kliptir. Bir hesap, her biri 100 ile 5,200 milisaniye arasında ve çözüldüğünde en fazla 1,048,576 bayt olan, mp3, ogg, m4a veya wav olarak saklanan en fazla sekiz kliplik bir kitaplık tutar ve klipleri kapsamlara atar. Klip atamak ve çalmak TEBHOS Pro gerektirir.
Giriş sesini çalma klibi açıkça belirtir; böylece belirli bir kanal için hangi seçimin geçerli olduğuna istemci karar verir. Çalma, hedef kanalda bir ses bağlantısı gerektirir, kanal izni gerektirmez. Başarılı bir çağrı, kanalda ses durumu olan diğer her hesaba bir ENTRANCE_SOUND_PLAY Dispatch gönderir; her alıcı klibi URL'sinden getirir ve yerel olarak çalar.
Ses etkinliği paylaşımı¶
Bir hesap, arkadaşlarına hangi ses kanalında olduğunun bildirilip bildirilmeyeceğini seçer. {"share_voice_activity": true | false} ile PUT /users/@me/settings/voice-activity-sharing, hesabın varsayılanını yazar ve çağıranın mevcut her arkadaşlıktaki tarafını aynı değerle yeniden yazar; ardından yeniden yazılan her arkadaşlığın iki tarafına da Relationship Update yayar. 24 saat içindeki ikinci bir değişiklik 429 ve bir retry_after ile reddedilir.
Saklanan sonuç, çağıranın kendi ilişki nesnesindeki share_voice_activity alanıdır.
Gateway ses etkinliği paylaşımını zorunlu kılmaz
Bir ses durumu, share_voice_activity ne olursa olsun kanalı görebilen her oturuma ulaşır. İstemci bu bayrağı bir gizleme yöntemi olarak SUNMAMALIDIR.