การสังเคราะห์เสียงที่ไม่เป็นทางการที่ไม่เป็นทางการของลูกค้าสำหรับเครื่องมือเกม Unity Game
ขึ้นอยู่กับ Elevenlabs-Dotnet
ฉันไม่ได้มีส่วนเกี่ยวข้องกับสิบเอ็ดคนและบัญชีที่มีการเข้าถึง API เป็นสิ่งจำเป็น
ลิขสิทธิ์เครื่องหมายการค้าโลโก้และสินทรัพย์ทั้งหมดเป็นทรัพย์สินของเจ้าของที่เกี่ยวข้อง
ต้องใช้เอกภาพ 2021.3 LTS หรือสูงกว่า
วิธีการติดตั้งที่แนะนำคือแม้ว่า Unity Package Manager และ OpenUPM
Package Manager 
OpenUPMhttps://package.openupm.comcom.rest.elevenlabscom.utilitiesMy RegistriesElevenLabshttps://github.com/RageAgainstThePixel/com.rest.elevenlabs.git#upmหมายเหตุ: repo นี้มีการพึ่งพาที่เก็บอื่น ๆ ! คุณต้องรับผิดชอบในการเพิ่มสิ่งเหล่านี้ด้วยตัวคุณเอง
มี 4 วิธีในการจัดหาคีย์ API ของคุณตามลำดับความสำคัญ:
var api = new ElevenLabsClient ( "yourApiKey" ) ; หรือสร้างวัตถุ ElevenLabsAuthentication
var api = new ElevenLabsClient ( new ElevenLabsAuthentication ( "yourApiKey" ) ) ; คุณสามารถบันทึกคีย์ได้โดยตรงลงในวัตถุสคริปต์ที่อยู่ในโฟลเดอร์ Assets/Resources
คุณสามารถสร้างใหม่ได้โดยใช้เมนูบริบทของบานหน้าต่างโครงการและสร้างวัตถุสคริปต์ ElevenLabsConfiguration ใหม่

พยายามโหลดคีย์ API จากไฟล์การกำหนดค่าโดยค่าเริ่มต้น. .elevenlabs ในไดเรกทอรีปัจจุบันโดยทางเลือกข้ามแผนผังไดเรกทอรีหรือในไดเรกทอรีบ้านของผู้ใช้
ในการสร้างไฟล์กำหนดค่าให้สร้างไฟล์ข้อความใหม่ชื่อ .elevenlabs และมีบรรทัด:
{
"apiKey" : " yourApiKey " ,
}นอกจากนี้คุณยังสามารถโหลดไฟล์ได้โดยตรงด้วยเส้นทางที่รู้จักโดยเรียกวิธีการคงที่ในการรับรองความถูกต้อง:
var api = new ElevenLabsClient ( new ElevenLabsAuthentication ( ) . LoadFromDirectory ( "your/path/to/.elevenlabs" ) ) ; ; ใช้ตัวแปรสภาพแวดล้อมของระบบของคุณระบุคีย์ API ที่จะใช้
ELEVEN_LABS_API_KEY สำหรับคีย์ API ของคุณ var api = new ElevenLabsClient ( new ElevenLabsAuthentication ( ) . LoadFromEnvironment ( ) ) ;การใช้ทั้ง ElevenLabs-Dotnet หรือ com.rest.elevenlabs แพคเกจโดยตรงในแอพส่วนหน้าของคุณอาจเปิดเผยปุ่ม API และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณ เพื่อลดความเสี่ยงนี้ขอแนะนำให้ตั้งค่า API ระดับกลางที่ให้การร้องขอ ElevenLabs ในนามของแอพส่วนหน้าของคุณ ห้องสมุดนี้สามารถใช้สำหรับการกำหนดค่าโฮสต์ทั้งด้านหน้าและตัวกลางเพื่อให้มั่นใจว่าการสื่อสารที่ปลอดภัยกับ Elevenlabs API
ในตัวอย่างด้านหน้าคุณจะต้องตรวจสอบสิทธิ์ผู้ใช้ของคุณอย่างปลอดภัยโดยใช้ผู้ให้บริการ OAuth ที่คุณต้องการ เมื่อผู้ใช้ได้รับการรับรองความถูกต้องแล้วให้แลกเปลี่ยนโทเค็นการรับรองความถูกต้องของคุณด้วยคีย์ API ของคุณบนแบ็กเอนด์
ทำตามขั้นตอนเหล่านี้:
ElevenLabsAuthentication ใหม่และส่งผ่านโทเค็นที่กำหนดเองElevenLabsSettings ใหม่และระบุโดเมนที่ API ระดับกลางของคุณตั้งอยู่auth และ settings ใหม่ของคุณไปยังตัวสร้าง ElevenLabsClient เมื่อคุณสร้างอินสแตนซ์ไคลเอนต์นี่คือตัวอย่างของวิธีการตั้งค่าส่วนหน้า:
var authToken = await LoginAsync ( ) ;
var auth = new ElevenLabsAuthentication ( authToken ) ;
var settings = new ElevenLabsSettings ( domain : "api.your-custom-domain.com" ) ;
var api = new ElevenLabsClient ( auth , settings ) ;การตั้งค่านี้ช่วยให้แอปพลิเคชันส่วนหน้าของคุณสามารถสื่อสารกับแบ็กเอนด์ของคุณได้อย่างปลอดภัยซึ่งจะใช้ Elevenlabs-Dotnet-Proxy ซึ่งจะส่งต่อคำขอไปยัง ElevenLabs API สิ่งนี้ทำให้มั่นใจได้ว่าคีย์ API Elevenlabs และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณยังคงปลอดภัยตลอดกระบวนการ
ในตัวอย่างนี้เราสาธิตวิธีการตั้งค่าและใช้ ElevenLabsProxyStartup ในแอป ASP.NET Core Web ใหม่ พร็อกซีเซิร์ฟเวอร์จะจัดการการรับรองความถูกต้องและส่งต่อไปยัง ElevenLabs API เพื่อให้มั่นใจว่าคีย์ API และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณยังคงปลอดภัย
Install-Package ElevenLabs-DotNet-Proxydotnet add package ElevenLabs-DotNet-Proxy<PackageReference Include="ElevenLabs-DotNet-Proxy" />AbstractAuthenticationFilter และแทนที่วิธี ValidateAuthenticationAsync สิ่งนี้จะใช้ IAuthenticationFilter ที่คุณจะใช้เพื่อตรวจสอบโทเค็นเซสชันผู้ใช้กับเซิร์ฟเวอร์ภายในของคุณProgram.cs ให้สร้างแอปพลิเคชันเว็บพร็อกซีใหม่โดยเรียก ElevenLabsProxyStartup.CreateDefaultHost วิธีผ่าน AuthenticationFilter ของคุณเองเป็นอาร์กิวเมนต์ประเภทElevenLabsAuthentication และ ElevenLabsClientSettings ตามปกติด้วยคีย์ API ของคุณ org id หรือการตั้งค่า Azure public partial class Program
{
private class AuthenticationFilter : AbstractAuthenticationFilter
{
public override async Task ValidateAuthenticationAsync ( IHeaderDictionary request )
{
await Task . CompletedTask ; // remote resource call
// You will need to implement your own class to properly test
// custom issued tokens you've setup for your end users.
if ( ! request [ "xi-api-key" ] . ToString ( ) . Contains ( TestUserToken ) )
{
throw new AuthenticationException ( "User is not authorized" ) ;
}
}
}
public static void Main ( string [ ] args )
{
var client = new ElevenLabsClient ( ) ;
var proxy = ElevenLabsProxyStartup . CreateDefaultHost < AuthenticationFilter > ( args , client ) ;
proxy . Run ( ) ;
}
}เมื่อคุณตั้งค่าพร็อกซีเซิร์ฟเวอร์แล้วผู้ใช้ปลายทางของคุณสามารถทำการร้องขอการรับรองความถูกต้องไปยังพร็อกซี API ของคุณแทน ElevenLabs API โดยตรง พร็อกซีเซิร์ฟเวอร์จะจัดการการรับรองความถูกต้องและส่งต่อไปยัง ElevenLabs API เพื่อให้มั่นใจว่าคีย์ API และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณยังคงปลอดภัย
คุณสามารถทำการกระทำเดียวกันทั้งหมดได้จากเว็บไซต์ Elevenlabs ในตัวแก้ไขโดยใช้แดชบอร์ด Elevenlabs!
Window/Dashboards/ElevenLabs

เช่นเดียวกับในเว็บไซต์ Elevenlabs คุณสามารถสังเคราะห์คลิปเสียงใหม่โดยใช้เสียงที่มีอยู่ เครื่องมือนี้ทำให้มีประโยชน์มากขึ้นเนื่องจากคลิปจะถูกดาวน์โหลดและนำเข้าสู่โครงการของคุณโดยอัตโนมัติพร้อมให้คุณใช้!

เช่นเดียวกับในเว็บไซต์ Elevenlabs คุณสามารถจัดการเสียงทั้งหมดของคุณได้โดยตรงในบรรณาธิการ

การเลือก Create New Voice จะแสดงป๊อปอัพที่คุณสามารถออกแบบเสียงใหม่ทั้งหมดโดยใช้รุ่น Generative Elevenlabs

นอกจากนี้คุณยังสามารถโคลนเสียงจากการบันทึกตัวอย่าง

นอกจากนี้คุณยังสามารถเข้าถึงรายการทั้งหมดของตัวอย่างที่สร้างขึ้นทั้งหมดของคุณพร้อมสำหรับการดาวน์โหลด

แปลงข้อความเป็นคำพูด
var api = new ElevenLabsClient ( ) ;
var text = "The quick brown fox jumps over the lazy dog." ;
var voice = ( await api . VoicesEndpoint . GetAllVoicesAsync ( ) ) . FirstOrDefault ( ) ;
var request = new TextToSpeechRequest ( voice , text ) ;
var voiceClip = await api . TextToSpeechEndpoint . TextToSpeechAsync ( request ) ;
audioSource . PlayOneShot ( voiceClip . AudioClip ) ;หมายเหตุ: หากคุณต้องการบันทึกคลิปเสียงลงในโครงการของคุณคุณจะต้องคัดลอกจากเส้นทางแคชไปยังตำแหน่งที่ระบุในโครงการของคุณ:
voiceClip . CopyIntoProject ( editorDownloadDirectory ) ; สตรีมข้อความเป็นคำพูด
var api = new ElevenLabsClient ( ) ;
var text = "The quick brown fox jumps over the lazy dog." ;
var voice = ( await api . VoicesEndpoint . GetAllVoicesAsync ( ) ) . FirstOrDefault ( ) ;
var partialClips = new Queue < VoiceClip > ( ) ;
var request = new TextToSpeechRequest ( voice , message , model : Model . EnglishTurboV2 , outputFormat : OutputFormat . PCM_44100 ) ;
var voiceClip = await api . TextToSpeechEndpoint . StreamTextToSpeechAsync ( request , partialClip =>
{
// Note: check demo scene for best practices
// on how to handle playback with OnAudioFilterRead
partialClips . Enqueue ( partialClip ) ;
} ) ;การเข้าถึงเสียงที่สร้างโดยผู้ใช้หรือสิบเอ็ด
รับรายการเสียงที่ใช้ร่วมกันในห้องสมุดเสียงสาธารณะ
var api = new ElevenLabsClient ( ) ;
var results = await ElevenLabsClient . SharedVoicesEndpoint . GetSharedVoicesAsync ( ) ;
foreach ( var voice in results . Voices )
{
Debug . Log ( $ " { voice . OwnerId } | { voice . VoiceId } | { voice . Date } | { voice . Name } " ) ;
} รับรายการเสียงที่มีอยู่ทั้งหมด
var api = new ElevenLabsClient ( ) ;
var allVoices = await api . VoicesEndpoint . GetAllVoicesAsync ( ) ;
foreach ( var voice in allVoices )
{
Debug . Log ( $ " { voice . Id } | { voice . Name } | similarity boost: { voice . Settings ? . SimilarityBoost } | stability: { voice . Settings ? . Stability } " ) ;
} รับการตั้งค่าเสียงเริ่มต้นทั่วโลก
var api = new ElevenLabsClient ( ) ;
var result = await api . VoicesEndpoint . GetDefaultVoiceSettingsAsync ( ) ;
Debug . Log ( $ "stability: { result . Stability } | similarity boost: { result . SimilarityBoost } " ) ; var api = new ElevenLabsClient ( ) ;
var voice = await api . VoicesEndpoint . GetVoiceAsync ( "voiceId" ) ;
Debug . Log ( $ " { voice . Id } | { voice . Name } | { voice . PreviewUrl } " ) ; แก้ไขการตั้งค่าสำหรับเสียงเฉพาะ
var api = new ElevenLabsClient ( ) ;
var success = await api . VoicesEndpoint . EditVoiceSettingsAsync ( voice , new VoiceSettings ( 0.7f , 0.7f ) ) ;
Debug . Log ( $ "Was successful? { success } " ) ; var api = new ElevenLabsClient ( ) ;
var labels = new Dictionary < string , string >
{
{ "accent" , "american" }
} ;
var audioSamplePaths = new List < string > ( ) ;
var voice = await api . VoicesEndpoint . AddVoiceAsync ( "Voice Name" , audioSamplePaths , labels ) ; var api = new ElevenLabsClient ( ) ;
var labels = new Dictionary < string , string >
{
{ "age" , "young" }
} ;
var audioSamplePaths = new List < string > ( ) ;
var success = await api . VoicesEndpoint . EditVoiceAsync ( voice , audioSamplePaths , labels ) ;
Debug . Log ( $ "Was successful? { success } " ) ; var api = new ElevenLabsClient ( ) ;
var success = await api . VoicesEndpoint . DeleteVoiceAsync ( voiceId ) ;
Debug . Log ( $ "Was successful? { success } " ) ; เข้าถึงตัวอย่างของคุณสร้างโดยคุณเมื่อโคลนเสียง
var api = new ElevenLabsClient ( ) ;
var voiceClip = await api . VoicesEndpoint . DownloadVoiceSampleAsync ( voice , sample ) ; var api = new ElevenLabsClient ( ) ;
var success = await api . VoicesEndpoint . DeleteVoiceSampleAsync ( voiceId , sampleId ) ;
Debug . Log ( $ "Was successful? { success } " ) ;Dubs ให้ไฟล์เสียงหรือวิดีโอเป็นภาษาที่กำหนด
var api = new ElevenLabsClient ( ) ;
// from URI
var request = new DubbingRequest ( new Uri ( "https://youtu.be/Zo5-rhYOlNk" ) , "ja" , "en" , 1 , true ) ;
// from file
var request = new DubbingRequest ( filePath , "es" , "en" , 1 ) ;
var metadata = await api . DubbingEndpoint . DubAsync ( request , progress : new Progress < DubbingProjectMetadata > ( metadata =>
{
switch ( metadata . Status )
{
case "dubbing" :
Debug . Log ( $ "Dubbing for { metadata . DubbingId } in progress... Expected Duration: { metadata . ExpectedDurationSeconds : 0.00 } seconds" ) ;
break ;
case "dubbed" :
Debug . Log ( $ "Dubbing for { metadata . DubbingId } complete in { metadata . TimeCompleted . TotalSeconds : 0.00 } seconds!" ) ;
break ;
default :
Debug . Log ( $ "Status: { metadata . Status } " ) ;
break ;
}
} ) ) ; ส่งคืนข้อมูลเมตาเกี่ยวกับโครงการพากย์รวมถึงว่ายังอยู่ในระหว่างดำเนินการหรือไม่
var api = new ElevenLabsClient ( ) ;
var metadata = api . await GetDubbingProjectMetadataAsync ( "dubbing - id");ส่งคืนเส้นทางไฟล์พากย์ที่ดาวน์โหลด
สำคัญ
วิดีโอจะถูกส่งคืนในรูปแบบ MP4 และเสียงพากย์เท่านั้นที่จะถูกส่งกลับใน MP3
var dubbedClipPath = await ElevenLabsClient . DubbingEndpoint . GetDubbedFileAsync ( metadata . DubbingId , request . TargetLanguage ) ;
var dubbedClip = await Rest . DownloadAudioClipAsync ( $ "file:// { dubbedClipPath } " , AudioType . MPEG ) ;
audioSource . PlayOneShot ( dubbedClip ) ; ส่งคืนการถอดเสียงสำหรับพากย์ในรูปแบบที่ต้องการ
var srcFile = new FileInfo ( audioPath ) ;
var transcriptPath = new FileInfo ( $ " { srcFile . FullName } .dubbed. { request . TargetLanguage } .srt" ) ;
var transcriptFile = await ElevenLabsClient . DubbingEndpoint . GetTranscriptForDubAsync ( metadata . DubbingId , request . TargetLanguage ) ;
await File . WriteAllTextAsync ( transcriptPath . FullName , transcriptFile ) ; ลบโครงการพากย์
var api = new ElevenLabsClient ( ) ;
await api . DubbingEndpoint . DeleteDubbingProjectAsync ( "dubbing-id" ) ;API ที่แปลงข้อความเป็นเสียงและใช้โมเดลเสียง AI ที่ทันสมัยที่สุดเท่าที่เคยมีมา
var api = new ElevenLabsClient ( ) ;
var request = new SoundGenerationRequest ( "Star Wars Light Saber parry" ) ;
var clip = await api . SoundGenerationEndpoint . GenerateSoundAsync ( request ) ;เข้าถึงคลิปเสียงที่สังเคราะห์ขึ้นก่อนหน้านี้ของคุณรวมถึงข้อมูลเมตา
รับข้อมูลเมตาเกี่ยวกับเสียงที่สร้างขึ้นทั้งหมดของคุณ
var api = new ElevenLabsClient ( ) ;
var historyItems = await api . HistoryEndpoint . GetHistoryAsync ( ) ;
foreach ( var item in historyItems . OrderBy ( historyItem => historyItem . Date ) )
{
Debug . Log ( $ " { item . State } { item . Date } | { item . Id } | { item . Text . Length } | { item . Text } " ) ;
} รับข้อมูลเกี่ยวกับรายการเฉพาะ
var api = new ElevenLabsClient ( ) ;
var historyItem = await api . HistoryEndpoint . GetHistoryItemAsync ( voiceClip . Id ) ; var api = new ElevenLabsClient ( ) ;
var voiceClip = await api . HistoryEndpoint . DownloadHistoryAudioAsync ( historyItem ) ; ดาวน์โหลดรายการประวัติ 100 รายการล่าสุดหรือคอลเลกชันของรายการที่ระบุ
var api = new ElevenLabsClient ( ) ;
var voiceClips = await api . HistoryEndpoint . DownloadHistoryItemsAsync ( ) ;หมายเหตุ: ในการคัดลอกคลิปลงในโครงการของคุณโดยตรงคุณสามารถโทรเพิ่มเติมได้:
VoiceClipUtilities . CopyIntoProject ( editorDownloadDirectory , downloadItems . ToArray ( ) ) ; var api = new ElevenLabsClient ( ) ;
var success = await api . HistoryEndpoint . DeleteHistoryItemAsync ( historyItem ) ;
Debug . Log ( $ "Was successful? { success } " ) ;เข้าถึงข้อมูลผู้ใช้และสถานะการสมัครสมาชิกของคุณ
รับข้อมูลเกี่ยวกับบัญชีผู้ใช้ของคุณด้วย Elevenlabs
var api = new ElevenLabsClient ( ) ;
var userInfo = await api . UserEndpoint . GetUserInfoAsync ( ) ; รับข้อมูลเกี่ยวกับการสมัครสมาชิกของคุณด้วย Elevenlabs
var api = new ElevenLabsClient ( ) ;
var subscriptionInfo = await api . UserEndpoint . GetSubscriptionInfoAsync ( ) ;