Неофициальный синтез голоса ElevenLabs Restful для игрового двигателя Unity.
На основе Elevenlabs-Dotnet
Я не связан с ElevenLabs, и требуется учетная запись с API -доступом.
Все авторские права, товарные знаки, логотипы и активы являются собственностью их соответствующих владельцев.
Требуется Unity 2021.3 LTS или выше.
Рекомендуемый метод установки - это хотя диспетчер пакетов Unity и OpenUpm.
Package Manager 
OpenUPMhttps://package.openupm.comcom.rest.elevenlabscom.utilitiesMy RegistriesElevenLabshttps://github.com/RageAgainstThePixel/com.rest.elevenlabs.git#upmПримечание: в этом репо зависите от других репозиториев! Вы несете ответственность за добавление их самостоятельно.
Есть 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 от имени вашего приложения переднего интерфейса. Эта библиотека может быть использована как для конфигураций фронтального, так и посредника, обеспечивая безопасную связь с API ElevenLabs.
В примере переднего конца вам нужно будет безопасно аутентифицировать своих пользователей, используя ваш предпочтительный провайдер OAuth. После того, как пользователь будет аутентифицирован, обменяйте свой пользовательский токен аудитория с вашим ключом API на бэкэнде.
Следуйте этим шагам:
ElevenLabsAuthentication и пропустите пользовательский токен.ElevenLabsSettings и укажите домен, где находится ваш промежуточный API.auth и settings Constructor 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. Прокси -сервер будет обрабатывать аутентификацию и направлять запросы в API ElevenLabs, гарантируя, что ваши клавиши API и другая конфиденциальная информация оставались безопасными.
Install-Package ElevenLabs-DotNet-Proxydotnet add package ElevenLabs-DotNet-Proxy<PackageReference Include="ElevenLabs-DotNet-Proxy" />AbstractAuthenticationFilter и переопределяет метод ValidateAuthenticationAsync . Это будет реализовать IAuthenticationFilter , который вы будете использовать для проверки токена сеанса пользователя на ваш внутренний сервер.ElevenLabsProxyStartup.CreateDefaultHost Program.cs AuthenticationFilterElevenLabsAuthentication и ElevenLabsClientSettings , как обычно, с настройками API, ID или идентификатором Org или 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, а не непосредственно в API ElevenLabs. Прокси -сервер будет обрабатывать аутентификацию и направлять запросы в API ElevenLabs, гарантируя, что ваши клавиши API и другая конфиденциальная информация оставались безопасными.
Вы можете выполнить все те же действия с веб -сайта ElevenLabs, в редакторе, используя Dashboard ElevenLabs!
Window/Dashboards/ElevenLabs

Как и на веб -сайте ElevenLabs, вы можете синтезировать новые аудио -клипы, используя доступные голоса. Этот инструмент делает его еще более удобным, так как клипы автоматически загружаются и импортируются в ваш проект, готовые к вам!

Как и на веб -сайте ElevenLabs, вы можете управлять всеми своими голосами непосредственно в редакторе.

Выбор Create New Voice будет отображать всплывающее окно, где вы можете разработать совершенно новые голоса, используя генеративные модели 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, а Dubs только звуки будут возвращены в mp3.
var dubbedClipPath = await ElevenLabsClient . DubbingEndpoint . GetDubbedFileAsync ( metadata . DubbingId , request . TargetLanguage ) ;
var dubbedClip = await Rest . DownloadAudioClipAsync ( $ "file:// { dubbedClipPath } " , AudioType . MPEG ) ;
audioSource . PlayOneShot ( dubbedClip ) ; Возвращает стенограмму для Dub в желаемом формате.
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 ) ; Удаляет проект Dubbing.
var api = new ElevenLabsClient ( ) ;
await api . DubbingEndpoint . DeleteDubbingProjectAsync ( "dubbing-id" ) ;API, который преобразует текст в звуки и использует самую продвинутую аудио -модель ИИ.
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 ( ) ;