From dec7eaefc6badfd59055ac5bcf29e20a95cf33c5 Mon Sep 17 00:00:00 2001 From: dvonthenen Date: Tue, 2 Apr 2024 19:19:17 -0700 Subject: [PATCH] Implement Some Examples --- Deepgram.Dev.sln | 158 +++++++++++++++++- Deepgram/Clients/Live/v1/Client.cs | 90 +++++----- Deepgram/GlobalUsings.cs | 1 - Deepgram/Logger/Log.cs | 6 +- examples/analyze/intent/Analyze.csproj | 28 ++++ examples/analyze/intent/Program.cs | 45 +++++ examples/analyze/intent/conversation.txt | 71 ++++++++ examples/analyze/sentiment/Analyze.csproj | 28 ++++ examples/analyze/sentiment/Program.cs | 45 +++++ examples/analyze/sentiment/conversation.txt | 71 ++++++++ examples/analyze/summary/Analyze.csproj | 28 ++++ examples/analyze/summary/Program.cs | 45 +++++ examples/analyze/summary/conversation.txt | 71 ++++++++ examples/analyze/topic/Analyze.csproj | 28 ++++ examples/analyze/topic/Program.cs | 45 +++++ examples/analyze/topic/conversation.txt | 71 ++++++++ .../file/Bueller-Life-moves-pretty-fast.wav | Bin 0 -> 3102792 bytes examples/prerecorded/file/PreRecorded.csproj | 28 ++++ examples/prerecorded/file/Program.cs | 14 +- .../intent/CallCenterPhoneCall.mp3 | Bin 0 -> 1825191 bytes .../prerecorded/intent/PreRecorded.csproj | 28 ++++ examples/prerecorded/intent/Program.cs | 46 +++++ .../sentiment/CallCenterPhoneCall.mp3 | Bin 0 -> 1825191 bytes .../prerecorded/sentiment/PreRecorded.csproj | 28 ++++ examples/prerecorded/sentiment/Program.cs | 47 ++++++ .../summary/CallCenterPhoneCall.mp3 | Bin 0 -> 1825191 bytes .../prerecorded/summary/PreRecorded.csproj | 28 ++++ examples/prerecorded/summary/Program.cs | 46 +++++ .../prerecorded/topic/CallCenterPhoneCall.mp3 | Bin 0 -> 1825191 bytes examples/prerecorded/topic/PreRecorded.csproj | 28 ++++ examples/prerecorded/topic/Program.cs | 46 +++++ .../PreRecorded.csproj} | 44 ++--- examples/prerecorded/url/Program.cs | 36 ++++ examples/speak/file/woodchuck/Program.cs | 39 +++++ examples/speak/file/woodchuck/Speak.csproj | 15 ++ tests/edge_cases/keepalive/KeepAlive.csproj | 18 ++ tests/edge_cases/keepalive/Program.cs | 77 +++++++++ .../reconnect_same_object/Program.cs | 118 +++++++++++++ .../ReconnectStreaming.csproj | 18 ++ .../exercise_timeout/ExerciseTimeout.csproj | 18 ++ .../exercise_timeout/Program.cs | 72 ++++++++ 41 files changed, 1546 insertions(+), 79 deletions(-) create mode 100644 examples/analyze/intent/Analyze.csproj create mode 100644 examples/analyze/intent/Program.cs create mode 100644 examples/analyze/intent/conversation.txt create mode 100644 examples/analyze/sentiment/Analyze.csproj create mode 100644 examples/analyze/sentiment/Program.cs create mode 100644 examples/analyze/sentiment/conversation.txt create mode 100644 examples/analyze/summary/Analyze.csproj create mode 100644 examples/analyze/summary/Program.cs create mode 100644 examples/analyze/summary/conversation.txt create mode 100644 examples/analyze/topic/Analyze.csproj create mode 100644 examples/analyze/topic/Program.cs create mode 100644 examples/analyze/topic/conversation.txt create mode 100644 examples/prerecorded/file/Bueller-Life-moves-pretty-fast.wav create mode 100644 examples/prerecorded/file/PreRecorded.csproj create mode 100644 examples/prerecorded/intent/CallCenterPhoneCall.mp3 create mode 100644 examples/prerecorded/intent/PreRecorded.csproj create mode 100644 examples/prerecorded/intent/Program.cs create mode 100644 examples/prerecorded/sentiment/CallCenterPhoneCall.mp3 create mode 100644 examples/prerecorded/sentiment/PreRecorded.csproj create mode 100644 examples/prerecorded/sentiment/Program.cs create mode 100644 examples/prerecorded/summary/CallCenterPhoneCall.mp3 create mode 100644 examples/prerecorded/summary/PreRecorded.csproj create mode 100644 examples/prerecorded/summary/Program.cs create mode 100644 examples/prerecorded/topic/CallCenterPhoneCall.mp3 create mode 100644 examples/prerecorded/topic/PreRecorded.csproj create mode 100644 examples/prerecorded/topic/Program.cs rename examples/prerecorded/{file/Prerecorded.csproj => url/PreRecorded.csproj} (95%) create mode 100644 examples/prerecorded/url/Program.cs create mode 100644 examples/speak/file/woodchuck/Program.cs create mode 100644 examples/speak/file/woodchuck/Speak.csproj create mode 100644 tests/edge_cases/keepalive/KeepAlive.csproj create mode 100644 tests/edge_cases/keepalive/Program.cs create mode 100644 tests/edge_cases/reconnect_same_object/Program.cs create mode 100644 tests/edge_cases/reconnect_same_object/ReconnectStreaming.csproj create mode 100644 tests/expected_failures/exercise_timeout/ExerciseTimeout.csproj create mode 100644 tests/expected_failures/exercise_timeout/Program.cs diff --git a/Deepgram.Dev.sln b/Deepgram.Dev.sln index fd6ca7c9..11eb422a 100644 --- a/Deepgram.Dev.sln +++ b/Deepgram.Dev.sln @@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deepgram", "Deepgram\Deepgr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deepgram.Tests", "Deepgram.Tests\Deepgram.Tests.csproj", "{12C80273-08DD-494C-B06D-DFC6D40B1D95}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\file\PreRecorded.csproj", "{70B63CBA-1130-46D1-A022-6CD31C37C60E}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speak", "examples\speak\file\hello-world\Speak.csproj", "{C3AA63DB-4555-4BEF-B2DD-89A3B19A265B}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Streaming", "examples\streaming\file\Streaming.csproj", "{FD8507CC-EECF-4750-81AF-3CF8E536C007}" @@ -35,6 +33,70 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "url", "url", "{0414D1CF-79F EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Streaming", "examples\streaming\microphone\Streaming.csproj", "{74335799-3B43-432C-ACD9-FBF2AB32A64A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{9D2B336D-17F9-41D5-A4E5-F3EDA7F496A5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "edge_cases", "edge_cases", "{1280E66D-A375-422A-ACB4-48F17E9C190E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "expected_failures", "expected_failures", "{5B1C7C37-BAE9-4027-927C-38B2393B3F43}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "keepalive", "keepalive", "{7F7328CF-D932-4D0F-B832-9CCE65E7B308}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "exercise_timeout", "exercise_timeout", "{3AC17A9C-30BB-4298-8E5A-4FAE73189821}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ExerciseTimeout", "tests\expected_failures\exercise_timeout\ExerciseTimeout.csproj", "{E19BE681-F801-444F-A3BD-8F1207FB3982}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KeepAlive", "tests\edge_cases\keepalive\KeepAlive.csproj", "{D3F886B5-1C28-44AF-A416-2BBE660D5EC4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "file", "file", "{FA17B9A9-F542-4F8A-AF4B-48404D009967}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "intent", "intent", "{02F10F52-5DFF-4CEC-8AAF-AFA16DEE27F1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "summary", "summary", "{287650F3-B83F-473E-8251-226069F797D7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "topic", "topic", "{B1D51F16-688B-4940-833A-8F38DC212292}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sentiment", "sentiment", "{B95CE5C6-977C-42A2-848A-5C6C99496F8A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\file\PreRecorded.csproj", "{9C720D12-AF17-40D7-8F92-7D96077BC7FB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\intent\PreRecorded.csproj", "{172FAC5E-32F0-4377-A92F-CFACDB294561}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\sentiment\PreRecorded.csproj", "{ABBF01EA-1015-4C16-A68C-F30A3904799B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\summary\PreRecorded.csproj", "{27C58ED4-DB4E-4A38-8D0E-D14854FE1814}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\topic\PreRecorded.csproj", "{C80145E0-5E37-4FA6-83FD-C9264876CAAF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PreRecorded", "examples\prerecorded\url\PreRecorded.csproj", "{1E5D1117-C170-4E6A-BC41-F7F8F46F2C59}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "analyze", "analyze", "{83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "intent", "intent", "{F476F3D0-65B2-4F0C-AA93-1E0049C7135A}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sentiment", "sentiment", "{0B951DDD-626E-4A4D-9379-17AF77A3531E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "topic", "topic", "{D6F102B6-FEDE-4D9A-A3BB-7BF26F26C3C4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "summary", "summary", "{92BF7997-2628-4434-A567-6C72352200A4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Analyze", "examples\analyze\sentiment\Analyze.csproj", "{B3A18F05-F1A4-4CC5-99A2-C77688E52D5E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Analyze", "examples\analyze\intent\Analyze.csproj", "{7258AEA6-720B-4554-9661-C40F381CA1C0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Analyze", "examples\analyze\summary\Analyze.csproj", "{DC4F480C-BC9E-4263-80D4-62CCCAF131E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Analyze", "examples\analyze\topic\Analyze.csproj", "{1785B862-DAB8-45DC-9EDC-E2D9021CEAA7}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "woodchuck", "woodchuck", "{1826908E-F3F3-4146-A2A1-5B3D71CB7F3D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Speak", "examples\speak\file\woodchuck\Speak.csproj", "{BE44FCAC-FBFF-4D70-BE52-B181049D1F70}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "manage", "manage", "{FA5723B3-74E9-4221-80EF-4833C1C3DD9F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "balances", "balances", "{7CD5D816-0F30-45D7-9C9F-872E67F6A711}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Manage", "examples\manage\balances\Manage.csproj", "{2BF14C9B-755E-41FD-BB59-D6A82E0EFC51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -49,10 +111,6 @@ Global {12C80273-08DD-494C-B06D-DFC6D40B1D95}.Debug|Any CPU.Build.0 = Debug|Any CPU {12C80273-08DD-494C-B06D-DFC6D40B1D95}.Release|Any CPU.ActiveCfg = Release|Any CPU {12C80273-08DD-494C-B06D-DFC6D40B1D95}.Release|Any CPU.Build.0 = Release|Any CPU - {70B63CBA-1130-46D1-A022-6CD31C37C60E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70B63CBA-1130-46D1-A022-6CD31C37C60E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70B63CBA-1130-46D1-A022-6CD31C37C60E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70B63CBA-1130-46D1-A022-6CD31C37C60E}.Release|Any CPU.Build.0 = Release|Any CPU {C3AA63DB-4555-4BEF-B2DD-89A3B19A265B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C3AA63DB-4555-4BEF-B2DD-89A3B19A265B}.Debug|Any CPU.Build.0 = Debug|Any CPU {C3AA63DB-4555-4BEF-B2DD-89A3B19A265B}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -69,12 +127,67 @@ Global {74335799-3B43-432C-ACD9-FBF2AB32A64A}.Debug|Any CPU.Build.0 = Debug|Any CPU {74335799-3B43-432C-ACD9-FBF2AB32A64A}.Release|Any CPU.ActiveCfg = Release|Any CPU {74335799-3B43-432C-ACD9-FBF2AB32A64A}.Release|Any CPU.Build.0 = Release|Any CPU + {E19BE681-F801-444F-A3BD-8F1207FB3982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E19BE681-F801-444F-A3BD-8F1207FB3982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E19BE681-F801-444F-A3BD-8F1207FB3982}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E19BE681-F801-444F-A3BD-8F1207FB3982}.Release|Any CPU.Build.0 = Release|Any CPU + {D3F886B5-1C28-44AF-A416-2BBE660D5EC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3F886B5-1C28-44AF-A416-2BBE660D5EC4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3F886B5-1C28-44AF-A416-2BBE660D5EC4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3F886B5-1C28-44AF-A416-2BBE660D5EC4}.Release|Any CPU.Build.0 = Release|Any CPU + {9C720D12-AF17-40D7-8F92-7D96077BC7FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C720D12-AF17-40D7-8F92-7D96077BC7FB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C720D12-AF17-40D7-8F92-7D96077BC7FB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C720D12-AF17-40D7-8F92-7D96077BC7FB}.Release|Any CPU.Build.0 = Release|Any CPU + {172FAC5E-32F0-4377-A92F-CFACDB294561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {172FAC5E-32F0-4377-A92F-CFACDB294561}.Debug|Any CPU.Build.0 = Debug|Any CPU + {172FAC5E-32F0-4377-A92F-CFACDB294561}.Release|Any CPU.ActiveCfg = Release|Any CPU + {172FAC5E-32F0-4377-A92F-CFACDB294561}.Release|Any CPU.Build.0 = Release|Any CPU + {ABBF01EA-1015-4C16-A68C-F30A3904799B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABBF01EA-1015-4C16-A68C-F30A3904799B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABBF01EA-1015-4C16-A68C-F30A3904799B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABBF01EA-1015-4C16-A68C-F30A3904799B}.Release|Any CPU.Build.0 = Release|Any CPU + {27C58ED4-DB4E-4A38-8D0E-D14854FE1814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {27C58ED4-DB4E-4A38-8D0E-D14854FE1814}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27C58ED4-DB4E-4A38-8D0E-D14854FE1814}.Release|Any CPU.ActiveCfg = Release|Any CPU + {27C58ED4-DB4E-4A38-8D0E-D14854FE1814}.Release|Any CPU.Build.0 = Release|Any CPU + {C80145E0-5E37-4FA6-83FD-C9264876CAAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C80145E0-5E37-4FA6-83FD-C9264876CAAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C80145E0-5E37-4FA6-83FD-C9264876CAAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C80145E0-5E37-4FA6-83FD-C9264876CAAF}.Release|Any CPU.Build.0 = Release|Any CPU + {1E5D1117-C170-4E6A-BC41-F7F8F46F2C59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E5D1117-C170-4E6A-BC41-F7F8F46F2C59}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E5D1117-C170-4E6A-BC41-F7F8F46F2C59}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E5D1117-C170-4E6A-BC41-F7F8F46F2C59}.Release|Any CPU.Build.0 = Release|Any CPU + {B3A18F05-F1A4-4CC5-99A2-C77688E52D5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B3A18F05-F1A4-4CC5-99A2-C77688E52D5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3A18F05-F1A4-4CC5-99A2-C77688E52D5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3A18F05-F1A4-4CC5-99A2-C77688E52D5E}.Release|Any CPU.Build.0 = Release|Any CPU + {7258AEA6-720B-4554-9661-C40F381CA1C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7258AEA6-720B-4554-9661-C40F381CA1C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7258AEA6-720B-4554-9661-C40F381CA1C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7258AEA6-720B-4554-9661-C40F381CA1C0}.Release|Any CPU.Build.0 = Release|Any CPU + {DC4F480C-BC9E-4263-80D4-62CCCAF131E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DC4F480C-BC9E-4263-80D4-62CCCAF131E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DC4F480C-BC9E-4263-80D4-62CCCAF131E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DC4F480C-BC9E-4263-80D4-62CCCAF131E3}.Release|Any CPU.Build.0 = Release|Any CPU + {1785B862-DAB8-45DC-9EDC-E2D9021CEAA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1785B862-DAB8-45DC-9EDC-E2D9021CEAA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1785B862-DAB8-45DC-9EDC-E2D9021CEAA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1785B862-DAB8-45DC-9EDC-E2D9021CEAA7}.Release|Any CPU.Build.0 = Release|Any CPU + {BE44FCAC-FBFF-4D70-BE52-B181049D1F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE44FCAC-FBFF-4D70-BE52-B181049D1F70}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE44FCAC-FBFF-4D70-BE52-B181049D1F70}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE44FCAC-FBFF-4D70-BE52-B181049D1F70}.Release|Any CPU.Build.0 = Release|Any CPU + {2BF14C9B-755E-41FD-BB59-D6A82E0EFC51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2BF14C9B-755E-41FD-BB59-D6A82E0EFC51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BF14C9B-755E-41FD-BB59-D6A82E0EFC51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BF14C9B-755E-41FD-BB59-D6A82E0EFC51}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {70B63CBA-1130-46D1-A022-6CD31C37C60E} = {0414D1CF-79FB-4C5B-BF2B-88C3C1AA4C32} {C3AA63DB-4555-4BEF-B2DD-89A3B19A265B} = {AE6FFA55-DD91-4BC1-AFDF-96F64B5221CD} {FD8507CC-EECF-4750-81AF-3CF8E536C007} = {5E75479B-B84A-4386-9D3E-69CFB30B24C6} {E2E3000D-FBBA-450E-A4E0-3542B38ADAFD} = {C673DFD1-528A-4BAE-94E6-02EF058AC363} @@ -86,6 +199,37 @@ Global {AE6FFA55-DD91-4BC1-AFDF-96F64B5221CD} = {50BA802D-603E-4BD2-9A3E-AFDABC3AF43C} {0414D1CF-79FB-4C5B-BF2B-88C3C1AA4C32} = {77ACBABB-CF6B-4929-957C-480E29646DFD} {74335799-3B43-432C-ACD9-FBF2AB32A64A} = {4D6C28C1-4D3F-4CFC-AF76-A389F6B00EC2} + {1280E66D-A375-422A-ACB4-48F17E9C190E} = {9D2B336D-17F9-41D5-A4E5-F3EDA7F496A5} + {5B1C7C37-BAE9-4027-927C-38B2393B3F43} = {9D2B336D-17F9-41D5-A4E5-F3EDA7F496A5} + {7F7328CF-D932-4D0F-B832-9CCE65E7B308} = {1280E66D-A375-422A-ACB4-48F17E9C190E} + {3AC17A9C-30BB-4298-8E5A-4FAE73189821} = {5B1C7C37-BAE9-4027-927C-38B2393B3F43} + {E19BE681-F801-444F-A3BD-8F1207FB3982} = {3AC17A9C-30BB-4298-8E5A-4FAE73189821} + {D3F886B5-1C28-44AF-A416-2BBE660D5EC4} = {7F7328CF-D932-4D0F-B832-9CCE65E7B308} + {FA17B9A9-F542-4F8A-AF4B-48404D009967} = {77ACBABB-CF6B-4929-957C-480E29646DFD} + {02F10F52-5DFF-4CEC-8AAF-AFA16DEE27F1} = {77ACBABB-CF6B-4929-957C-480E29646DFD} + {287650F3-B83F-473E-8251-226069F797D7} = {77ACBABB-CF6B-4929-957C-480E29646DFD} + {B1D51F16-688B-4940-833A-8F38DC212292} = {77ACBABB-CF6B-4929-957C-480E29646DFD} + {B95CE5C6-977C-42A2-848A-5C6C99496F8A} = {77ACBABB-CF6B-4929-957C-480E29646DFD} + {9C720D12-AF17-40D7-8F92-7D96077BC7FB} = {FA17B9A9-F542-4F8A-AF4B-48404D009967} + {172FAC5E-32F0-4377-A92F-CFACDB294561} = {02F10F52-5DFF-4CEC-8AAF-AFA16DEE27F1} + {ABBF01EA-1015-4C16-A68C-F30A3904799B} = {B95CE5C6-977C-42A2-848A-5C6C99496F8A} + {27C58ED4-DB4E-4A38-8D0E-D14854FE1814} = {287650F3-B83F-473E-8251-226069F797D7} + {C80145E0-5E37-4FA6-83FD-C9264876CAAF} = {B1D51F16-688B-4940-833A-8F38DC212292} + {1E5D1117-C170-4E6A-BC41-F7F8F46F2C59} = {0414D1CF-79FB-4C5B-BF2B-88C3C1AA4C32} + {83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72} = {C673DFD1-528A-4BAE-94E6-02EF058AC363} + {F476F3D0-65B2-4F0C-AA93-1E0049C7135A} = {83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72} + {0B951DDD-626E-4A4D-9379-17AF77A3531E} = {83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72} + {D6F102B6-FEDE-4D9A-A3BB-7BF26F26C3C4} = {83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72} + {92BF7997-2628-4434-A567-6C72352200A4} = {83D6D1F7-97E1-4E35-A0AA-E3ED5977EA72} + {B3A18F05-F1A4-4CC5-99A2-C77688E52D5E} = {0B951DDD-626E-4A4D-9379-17AF77A3531E} + {7258AEA6-720B-4554-9661-C40F381CA1C0} = {F476F3D0-65B2-4F0C-AA93-1E0049C7135A} + {DC4F480C-BC9E-4263-80D4-62CCCAF131E3} = {92BF7997-2628-4434-A567-6C72352200A4} + {1785B862-DAB8-45DC-9EDC-E2D9021CEAA7} = {D6F102B6-FEDE-4D9A-A3BB-7BF26F26C3C4} + {1826908E-F3F3-4146-A2A1-5B3D71CB7F3D} = {50BA802D-603E-4BD2-9A3E-AFDABC3AF43C} + {BE44FCAC-FBFF-4D70-BE52-B181049D1F70} = {1826908E-F3F3-4146-A2A1-5B3D71CB7F3D} + {FA5723B3-74E9-4221-80EF-4833C1C3DD9F} = {C673DFD1-528A-4BAE-94E6-02EF058AC363} + {7CD5D816-0F30-45D7-9C9F-872E67F6A711} = {FA5723B3-74E9-4221-80EF-4833C1C3DD9F} + {2BF14C9B-755E-41FD-BB59-D6A82E0EFC51} = {7CD5D816-0F30-45D7-9C9F-872E67F6A711} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8D4ABC6D-7126-4EE2-9303-43A954616B2A} diff --git a/Deepgram/Clients/Live/v1/Client.cs b/Deepgram/Clients/Live/v1/Client.cs index c4cda267..76963872 100644 --- a/Deepgram/Clients/Live/v1/Client.cs +++ b/Deepgram/Clients/Live/v1/Client.cs @@ -2,9 +2,6 @@ // Use of this source code is governed by a MIT license that can be found in the LICENSE file. // SPDX-License-Identifier: MIT -using System; -using System.Diagnostics.Tracing; -using System.Net.WebSockets; using Deepgram.Models.Authenticate.v1; using Deepgram.Models.Live.v1; @@ -19,7 +16,7 @@ public class Client : Attribute, IDisposable private readonly DeepgramWsClientOptions _deepgramClientOptions; private ClientWebSocket? _clientWebSocket; - private CancellationTokenSource _cancellationTokenSource; + private CancellationTokenSource? _cancellationTokenSource; #endregion /// Required DeepgramApiKey @@ -396,7 +393,6 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms switch (val) { case LiveType.Open: - //var openResponse = new ResponseEvent(data.Deserialize()); var openResponse = data.Deserialize(); if (_openReceived == null) { @@ -412,11 +408,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking OpenResponse. event: {openResponse}"); - _openReceived.Invoke(null, openResponse); - //InvokeResponseReceived(_openReceived, openResponse); + InvokeParallel(_openReceived, openResponse); break; case LiveType.Results: - //var eventResponse = new ResponseEvent(data.Deserialize()); var resultResponse = data.Deserialize(); if (_resultsReceived == null) { @@ -424,7 +418,7 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms Log.Verbose("ProcessDataReceived", "LEAVE"); return; } - if ( resultResponse == null) + if (resultResponse == null) { Log.Warning("ProcessDataReceived", "ResultResponse is invalid"); Log.Verbose("ProcessDataReceived", "LEAVE"); @@ -432,11 +426,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking ResultsResponse. event: {resultResponse}"); - _resultsReceived.Invoke(null, resultResponse); - //InvokeResponseReceived(_resultsReceived, eventResponse); + InvokeParallel(_resultsReceived, resultResponse); break; case LiveType.Metadata: - //var metadataResponse = new ResponseEvent(data.Deserialize()); var metadataResponse = data.Deserialize(); if (_metadataReceived == null) { @@ -452,11 +444,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking MetadataResponse. event: {metadataResponse}"); - _metadataReceived.Invoke(null, metadataResponse); - //InvokeResponseReceived(_metadataReceived, metadataResponse); + InvokeParallel(_metadataReceived, metadataResponse); break; case LiveType.UtteranceEnd: - //var utteranceEndResponse = new ResponseEvent(data.Deserialize()); var utteranceEndResponse = data.Deserialize(); if (_utteranceEndReceived == null) { @@ -472,11 +462,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking UtteranceEndResponse. event: {utteranceEndResponse}"); - _utteranceEndReceived.Invoke(null, utteranceEndResponse); - //InvokeResponseReceived(_utteranceEndReceived, utteranceEndResponse); + InvokeParallel(_utteranceEndReceived, utteranceEndResponse); break; case LiveType.SpeechStarted: - //var speechStartedResponse = new ResponseEvent(data.Deserialize()); var speechStartedResponse = data.Deserialize(); if (_speechStartedReceived == null) { @@ -492,11 +480,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking SpeechStartedResponse. event: {speechStartedResponse}"); - _speechStartedReceived.Invoke(null, speechStartedResponse); - //InvokeResponseReceived(_speechStartedReceived, speechStartedResponse); + InvokeParallel(_speechStartedReceived, speechStartedResponse); break; case LiveType.Close: - //var closeResponse = new ResponseEvent(data.Deserialize()); var closeResponse = data.Deserialize(); if (_closeReceived == null) { @@ -512,11 +498,9 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking CloseResponse. event: {closeResponse}"); - _closeReceived.Invoke(null, closeResponse); - //InvokeResponseReceived(_closeReceived, closeResponse); + InvokeParallel(_closeReceived, closeResponse); break; case LiveType.Error: - //var errorResponse = new ResponseEvent(data.Deserialize()); var errorResponse = data.Deserialize(); if (_errorReceived == null) { @@ -532,8 +516,7 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms } Log.Debug("ProcessDataReceived", $"Invoking ErrorResponse. event: {errorResponse}"); - _errorReceived.Invoke(null, errorResponse); - //InvokeResponseReceived(_errorReceived, errorResponse); + InvokeParallel(_errorReceived, errorResponse); break; default: if (_unhandledReceived == null) @@ -543,14 +526,12 @@ internal void ProcessDataReceived(WebSocketReceiveResult result, MemoryStream ms return; } - //var unhandledResponse = new ResponseEvent(data.Deserialize()); var unhandledResponse = new UnhandledResponse(); unhandledResponse.Type = LiveType.Unhandled; unhandledResponse.Raw = response; Log.Debug("ProcessDataReceived", $"Invoking UnhandledResponse. event: {unhandledResponse}"); - _unhandledReceived.Invoke(null, unhandledResponse); - //InvokeResponseReceived(_unhandledReceived, unhandledResponse); + InvokeParallel(_unhandledReceived, unhandledResponse); break; } @@ -627,12 +608,18 @@ await _clientWebSocket.CloseOutputAsync( // Always request cancellation to the local token source, if some function has been called without a token if (cancellationToken != null) { - Log.Debug("Stop", "Cancelling provided cancellation token..."); + Log.Debug("Stop", "Cancelling provided token..."); cancellationToken.Cancel(); } Log.Debug("Stop", "Disposing WebSocket connection..."); - _cancellationTokenSource.Cancel(); + if (_cancellationTokenSource != null) + { + Log.Debug("Stop", "Cancelling native token..."); + _cancellationTokenSource.Cancel(); + _cancellationTokenSource.Dispose(); + _cancellationTokenSource = null; + } Log.Debug("Stop", "Succeeded"); Log.Verbose("Stop", "LEAVE"); @@ -684,6 +671,28 @@ internal static Uri GetUri(DeepgramWsClientOptions options, LiveSchema parameter return new Uri($"{options.BaseAddress}/{UriSegments.LISTEN}?{queryString}"); } + + internal void InvokeParallel(EventHandler eventHandler, T e) + { + if (eventHandler != null) + { + try + { + Parallel.ForEach( + eventHandler.GetInvocationList().Cast>(), + (handler) => + handler(null, e)); + } + catch (AggregateException ae) + { + Log.Error("InvokeParallel", $"AggregateException occurred in one or more event handlers: {ae}"); + } + catch (Exception ex) + { + Log.Error("InvokeParallel", $"Exception occurred in event handler: {ex}"); + } + } + } #endregion #region Dispose @@ -704,6 +713,7 @@ public void Dispose() _cancellationTokenSource.Cancel(); } _cancellationTokenSource.Dispose(); + _cancellationTokenSource = null; } if (_sendChannel != null) @@ -711,19 +721,13 @@ public void Dispose() _sendChannel.Writer.Complete(); } - _clientWebSocket.Dispose(); + if (_clientWebSocket != null) + { + _clientWebSocket.Dispose(); + _clientWebSocket = null; + } + GC.SuppressFinalize(this); } - - //internal void InvokeResponseReceived(EventHandler eventHandler, ResponseEvent e) - //{ - // if (eventHandler != null) - // { - // Parallel.ForEach( - // eventHandler.GetInvocationList().Cast(), - // (handler) => - // handler(null, e)); - // } - //} #endregion } diff --git a/Deepgram/GlobalUsings.cs b/Deepgram/GlobalUsings.cs index a33d6c16..d3864d06 100644 --- a/Deepgram/GlobalUsings.cs +++ b/Deepgram/GlobalUsings.cs @@ -17,6 +17,5 @@ global using Deepgram.Logger; global using Deepgram.Utilities; global using Microsoft.Extensions.DependencyInjection; -global using Microsoft.Extensions.Logging; global using Polly; global using Polly.Contrib.WaitAndRetry; diff --git a/Deepgram/Logger/Log.cs b/Deepgram/Logger/Log.cs index 04482baa..deaaff52 100644 --- a/Deepgram/Logger/Log.cs +++ b/Deepgram/Logger/Log.cs @@ -25,14 +25,14 @@ public static Serilog.ILogger Initialize(LogLevel level = LogLevel.Information, { instance = new LoggerConfiguration() .MinimumLevel.Is((Serilog.Events.LogEventLevel) level) - .WriteTo.Console() - .WriteTo.File(filename) + .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") + .WriteTo.File(filename, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") .CreateLogger(); return instance; } instance = new LoggerConfiguration() .MinimumLevel.Is((Serilog.Events.LogEventLevel)level) - .WriteTo.Console() + .WriteTo.Console(outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}") .CreateLogger(); return instance; } diff --git a/examples/analyze/intent/Analyze.csproj b/examples/analyze/intent/Analyze.csproj new file mode 100644 index 00000000..d0ea3e2e --- /dev/null +++ b/examples/analyze/intent/Analyze.csproj @@ -0,0 +1,28 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + + + + + Always + + + + diff --git a/examples/analyze/intent/Program.cs b/examples/analyze/intent/Program.cs new file mode 100644 index 00000000..b778ce4c --- /dev/null +++ b/examples/analyze/intent/Program.cs @@ -0,0 +1,45 @@ +// Copyright 2024 Deepgram .NET SDK contributors. All Rights Reserved. +// Use of this source code is governed by a MIT license that can be found in the LICENSE file. +// SPDX-License-Identifier: MIT + +using System.Text.Json; + +using Deepgram.Models.Analyze.v1; + +namespace PreRecorded +{ + class Program + { + static async Task Main(string[] args) + { + // Initialize Library with default logging + // Normal logging is "Info" level + Library.Initialize(); + + // Set "DEEPGRAM_API_KEY" environment variable to your Deepgram API Key + var deepgramClient = new AnalyzeClient(); + + // check to see if the file exists + if (!File.Exists(@"conversation.txt")) + { + Console.WriteLine("Error: File 'conversation.txt' not found."); + return; + } + + var audioData = File.ReadAllBytes(@"conversation.txt"); + var response = await deepgramClient.AnalyzeFile( + audioData, + new AnalyzeSchema() + { + Language = "en", + Intents = true, + }); + + Console.WriteLine(JsonSerializer.Serialize(response)); + Console.ReadKey(); + + // Teardown Library + Library.Terminate(); + } + } +} \ No newline at end of file diff --git a/examples/analyze/intent/conversation.txt b/examples/analyze/intent/conversation.txt new file mode 100644 index 00000000..2af89e08 --- /dev/null +++ b/examples/analyze/intent/conversation.txt @@ -0,0 +1,71 @@ +Meet Deepgram Aura: real-time text-to-speech for real-time AI agents +---------- +It’s been a year since large language models (LLMs) seemingly went mainstream overnight (Happy Birthday, ChatGPT!!!), and the world has witnessed both rapid development of these technologies and immense interest in their potential. We believe that we have reached an inflection point where voice-based interfaces will be the primary means to accessing LLMs and the experiences they unlock. Here are a few recent signals in support of our thesis: + +- Good old fashioned voice notes are enjoying a healthy resurgence. + +- According to a recent survey, a majority of respondents stated phone calls are still their preferred communication channel for resolving customer service issues. + +- An emerging boom in wearable devices equipped with continuous listening and speech AI technology is gaining steam. + +- OpenAI recently enabled voice interactions in ChatGPT. + +- A wave of interest in voice-first experiences and tools is sweeping across brands, investors, and tech companies. + +Thanks to ChatGPT and the advent of the LLM era, the conversational AI tech stack has advanced sufficiently to support productive (not frustrating) voice-powered AI assistants and agents that can interact with humans in a natural manner. We have already observed this from our most innovative customers who are actively turning to these technologies to build a diverse range of AI agents for voice ordering systems, interview bots, personal AI assistants, automated drive-thru tellers, and autonomous sales and customer service agents. + +While these AI agents hold immense potential, many customers have expressed their dissatisfaction with the current crop of voice AI vendors, citing roadblocks related to speed, cost, reliability, and conversational quality. That’s why we’re excited to introduce our own text-to-speech (TTS) API, Deepgram Aura, built for real-time, conversational voice AI agents. + +Whether used on its own or in conjunction with our industry-leading Nova-2 speech-to-text API, we’ll soon provide developers with a complete speech AI platform, giving them the essential building blocks they need to build high throughput, real-time AI agents of the future. + +We are thrilled about the progress our initial group of developers has made using Aura, so much so that we are extending limited access to a select few partners who will be free to begin integrating with Aura immediately. With their feedback, we’ll continue to enhance our suite of voices and API features, as well as ensure a smooth launch of their production-grade applications. + + +What Customers Want +---------- +I feel the need, the need for speed +What we’ve heard from many of our customers and partners is that voice AI technology today caters to two main areas: high production or high throughput. + +High Production is all about crafting the perfect voice. It's used in projects where every tone and inflection matters, like in video games or audiobooks, to really bring a scene or story to life. Here, voice quality is king, with creators investing hours to fine-tune every detail for a powerful emotional impact. The primary benefit is the ability to swap out a high-paid voice actor with AI where you have more dynamic control over what’s being said while also achieving some cost savings. But these use cases are more specialized and represent just a sliver of the overall voice AI opportunity. + +On the flip side, High Throughput is about handling many quick, one-off interactions for real-time conversations at scale. Think fast food ordering, booking appointments, or inquiring about the latest deals at a car dealership. These tasks are relevant to just about everyone on the planet, and they require fast, efficient text-to-speech conversion for an AI agent to fulfill them. While voice quality is still important to keep users engaged, quality here is more about the naturalness of the flow of conversation and less about sounding like Morgan Freeman. But the primary focus for most customers in this category is on improving customer outcomes, meaning speed and efficiency are must-haves for ensuring these everyday exchanges are smooth and reliable at high volume. + +"Deepgram showed me less than 200ms latency today. That's the fastest text-to-speech I’ve ever seen. And our customers would be more than satisfied with the conversation quality." + +Jordan Dearsley, Co-founder at Vapi + +Although high production use cases seem to be well-served with UI-centric production tools, high throughput, real-time use cases still mostly rely on APIs provided by the major cloud providers. And our customers have been telling us that they’ve been falling short, with insufficient quality for a good user experience, too much latency to make real-time use cases work, and costs too expensive to operate at scale. + + +More human than human +---------- +With Aura, we’ll give realistic voices to AI agents. Our goal is to craft text-to-speech capabilities that mirror natural human conversations, including timely responses, the incorporation of natural speech fillers like 'um' and 'uh' during contemplation, and the modulation of tone and emotion according to the conversational context. We aim to incorporate laughter and other speech nuances as well. Furthermore, we are dedicated to tailoring these voices to their specific applications, ensuring they remain composed and articulate, particularly in enunciating account numbers and business names with precision. + +"I don’t really consider Azure and the other guys anymore because the voices sound so robotic." +Jordan Dearsley, Co-founder at Vapi + +In blind evaluation trials conducted for benchmarking, early versions of Aura have consistently been rated as sounding more human than prominent alternatives, even outranking human speakers for various audio clips more often than not on average. We were pleasantly surprised by these results (stay tuned for a future post containing comprehensive benchmarks for speed and quality soon!), so much so that we’re accelerating our development timeline and publicly announcing today’s waitlist expansion. + +Here are some sample clips generated by one of the earliest iterations of Aura. The quality and overall performance will continue to improve with additional model training and refinement. We encourage you to give them a listen and note the naturalness of their cadence, rhythm, and tone in the flow of conversation with another human. + + +Our Approach +---------- +For nearly a decade, we’ve worked tirelessly to advance the art of the possible in speech recognition and spoken language understanding. Along the way, we’ve transcribed trillions of spoken words into highly accurate transcriptions. Our model research team has developed novel transformer architectures equipped to deal with the nuances of conversational audio–across different languages, accents, and dialects, while handling disfluencies and the changing rhythms, tones, cadences, and inflections that occur in natural, back-and-forth conversations. + +And all the while, we’ve purposefully built our models under limited constraints to optimize their speed and efficiency. With support for dozens of languages and custom model training, our technical team has trained and deployed thousands of speech AI models (more than anybody else) which we operate and manage for our customers each day using our own computing infrastructure. + +We also have our own in-house data labeling and data ops team with years of experience building bespoke workflows to record, store, and transfer vast amounts of audio in order to label it and continuously grow our bank of high-quality data (millions of hours and counting) used in our model training. + +These combined experiences have made us experts in processing and modeling speech audio, especially in support of streaming use cases with our real-time STT models. Our customers have been asking if we could apply the same approach for TTS, and we can. + +So what can you expect from Aura? Delivering the same market-leading value and performance as Nova-2 does for STT. Aura is built to be the panacea for speed, quality, and efficiency–the fastest of the high-quality options, and the best quality of the fast ones. And that’s really what end users need and what our customers have been asking us to build. + +"Deepgram is a valued partner, providing our customers with high throughput speech-to-text that delivers unrivaled performance without tradeoffs between quality, speed, and cost. We're excited to see Deepgram extend their speech AI platform and bring this approach to the text-to-speech market." - Richard Dumas, VP AI Product Strategy at Five9 + + +What's Next +---------- +As we’ve discussed, scaled voice agents are a high throughput use case, and we believe their success will ultimately depend on a unified approach to audio, one that strikes the right balance between natural voice quality, responsiveness, and cost-efficiency. And with Aura, we’re just getting started. We’re looking forward to continuing to work with customers like Asurion and partners like Five9 across speech-to-text AND text-to-speech as we help them define the future of AI agents, and we invite you to join us on this journey. + +We expect to release generally early next year, but if you’re working on any real-time AI agent use cases, join our waitlist today to jumpstart your development in production as we continue to refine our model and API features with your direct feedback. \ No newline at end of file diff --git a/examples/analyze/sentiment/Analyze.csproj b/examples/analyze/sentiment/Analyze.csproj new file mode 100644 index 00000000..d0ea3e2e --- /dev/null +++ b/examples/analyze/sentiment/Analyze.csproj @@ -0,0 +1,28 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + + + + + Always + + + + diff --git a/examples/analyze/sentiment/Program.cs b/examples/analyze/sentiment/Program.cs new file mode 100644 index 00000000..7312ff85 --- /dev/null +++ b/examples/analyze/sentiment/Program.cs @@ -0,0 +1,45 @@ +// Copyright 2024 Deepgram .NET SDK contributors. All Rights Reserved. +// Use of this source code is governed by a MIT license that can be found in the LICENSE file. +// SPDX-License-Identifier: MIT + +using System.Text.Json; + +using Deepgram.Models.Analyze.v1; + +namespace PreRecorded +{ + class Program + { + static async Task Main(string[] args) + { + // Initialize Library with default logging + // Normal logging is "Info" level + Library.Initialize(); + + // Set "DEEPGRAM_API_KEY" environment variable to your Deepgram API Key + var deepgramClient = new AnalyzeClient(); + + // check to see if the file exists + if (!File.Exists(@"conversation.txt")) + { + Console.WriteLine("Error: File 'conversation.txt' not found."); + return; + } + + var audioData = File.ReadAllBytes(@"conversation.txt"); + var response = await deepgramClient.AnalyzeFile( + audioData, + new AnalyzeSchema() + { + Language = "en", + Sentiment = true, + }); + + Console.WriteLine(JsonSerializer.Serialize(response)); + Console.ReadKey(); + + // Teardown Library + Library.Terminate(); + } + } +} \ No newline at end of file diff --git a/examples/analyze/sentiment/conversation.txt b/examples/analyze/sentiment/conversation.txt new file mode 100644 index 00000000..2af89e08 --- /dev/null +++ b/examples/analyze/sentiment/conversation.txt @@ -0,0 +1,71 @@ +Meet Deepgram Aura: real-time text-to-speech for real-time AI agents +---------- +It’s been a year since large language models (LLMs) seemingly went mainstream overnight (Happy Birthday, ChatGPT!!!), and the world has witnessed both rapid development of these technologies and immense interest in their potential. We believe that we have reached an inflection point where voice-based interfaces will be the primary means to accessing LLMs and the experiences they unlock. Here are a few recent signals in support of our thesis: + +- Good old fashioned voice notes are enjoying a healthy resurgence. + +- According to a recent survey, a majority of respondents stated phone calls are still their preferred communication channel for resolving customer service issues. + +- An emerging boom in wearable devices equipped with continuous listening and speech AI technology is gaining steam. + +- OpenAI recently enabled voice interactions in ChatGPT. + +- A wave of interest in voice-first experiences and tools is sweeping across brands, investors, and tech companies. + +Thanks to ChatGPT and the advent of the LLM era, the conversational AI tech stack has advanced sufficiently to support productive (not frustrating) voice-powered AI assistants and agents that can interact with humans in a natural manner. We have already observed this from our most innovative customers who are actively turning to these technologies to build a diverse range of AI agents for voice ordering systems, interview bots, personal AI assistants, automated drive-thru tellers, and autonomous sales and customer service agents. + +While these AI agents hold immense potential, many customers have expressed their dissatisfaction with the current crop of voice AI vendors, citing roadblocks related to speed, cost, reliability, and conversational quality. That’s why we’re excited to introduce our own text-to-speech (TTS) API, Deepgram Aura, built for real-time, conversational voice AI agents. + +Whether used on its own or in conjunction with our industry-leading Nova-2 speech-to-text API, we’ll soon provide developers with a complete speech AI platform, giving them the essential building blocks they need to build high throughput, real-time AI agents of the future. + +We are thrilled about the progress our initial group of developers has made using Aura, so much so that we are extending limited access to a select few partners who will be free to begin integrating with Aura immediately. With their feedback, we’ll continue to enhance our suite of voices and API features, as well as ensure a smooth launch of their production-grade applications. + + +What Customers Want +---------- +I feel the need, the need for speed +What we’ve heard from many of our customers and partners is that voice AI technology today caters to two main areas: high production or high throughput. + +High Production is all about crafting the perfect voice. It's used in projects where every tone and inflection matters, like in video games or audiobooks, to really bring a scene or story to life. Here, voice quality is king, with creators investing hours to fine-tune every detail for a powerful emotional impact. The primary benefit is the ability to swap out a high-paid voice actor with AI where you have more dynamic control over what’s being said while also achieving some cost savings. But these use cases are more specialized and represent just a sliver of the overall voice AI opportunity. + +On the flip side, High Throughput is about handling many quick, one-off interactions for real-time conversations at scale. Think fast food ordering, booking appointments, or inquiring about the latest deals at a car dealership. These tasks are relevant to just about everyone on the planet, and they require fast, efficient text-to-speech conversion for an AI agent to fulfill them. While voice quality is still important to keep users engaged, quality here is more about the naturalness of the flow of conversation and less about sounding like Morgan Freeman. But the primary focus for most customers in this category is on improving customer outcomes, meaning speed and efficiency are must-haves for ensuring these everyday exchanges are smooth and reliable at high volume. + +"Deepgram showed me less than 200ms latency today. That's the fastest text-to-speech I’ve ever seen. And our customers would be more than satisfied with the conversation quality." + +Jordan Dearsley, Co-founder at Vapi + +Although high production use cases seem to be well-served with UI-centric production tools, high throughput, real-time use cases still mostly rely on APIs provided by the major cloud providers. And our customers have been telling us that they’ve been falling short, with insufficient quality for a good user experience, too much latency to make real-time use cases work, and costs too expensive to operate at scale. + + +More human than human +---------- +With Aura, we’ll give realistic voices to AI agents. Our goal is to craft text-to-speech capabilities that mirror natural human conversations, including timely responses, the incorporation of natural speech fillers like 'um' and 'uh' during contemplation, and the modulation of tone and emotion according to the conversational context. We aim to incorporate laughter and other speech nuances as well. Furthermore, we are dedicated to tailoring these voices to their specific applications, ensuring they remain composed and articulate, particularly in enunciating account numbers and business names with precision. + +"I don’t really consider Azure and the other guys anymore because the voices sound so robotic." +Jordan Dearsley, Co-founder at Vapi + +In blind evaluation trials conducted for benchmarking, early versions of Aura have consistently been rated as sounding more human than prominent alternatives, even outranking human speakers for various audio clips more often than not on average. We were pleasantly surprised by these results (stay tuned for a future post containing comprehensive benchmarks for speed and quality soon!), so much so that we’re accelerating our development timeline and publicly announcing today’s waitlist expansion. + +Here are some sample clips generated by one of the earliest iterations of Aura. The quality and overall performance will continue to improve with additional model training and refinement. We encourage you to give them a listen and note the naturalness of their cadence, rhythm, and tone in the flow of conversation with another human. + + +Our Approach +---------- +For nearly a decade, we’ve worked tirelessly to advance the art of the possible in speech recognition and spoken language understanding. Along the way, we’ve transcribed trillions of spoken words into highly accurate transcriptions. Our model research team has developed novel transformer architectures equipped to deal with the nuances of conversational audio–across different languages, accents, and dialects, while handling disfluencies and the changing rhythms, tones, cadences, and inflections that occur in natural, back-and-forth conversations. + +And all the while, we’ve purposefully built our models under limited constraints to optimize their speed and efficiency. With support for dozens of languages and custom model training, our technical team has trained and deployed thousands of speech AI models (more than anybody else) which we operate and manage for our customers each day using our own computing infrastructure. + +We also have our own in-house data labeling and data ops team with years of experience building bespoke workflows to record, store, and transfer vast amounts of audio in order to label it and continuously grow our bank of high-quality data (millions of hours and counting) used in our model training. + +These combined experiences have made us experts in processing and modeling speech audio, especially in support of streaming use cases with our real-time STT models. Our customers have been asking if we could apply the same approach for TTS, and we can. + +So what can you expect from Aura? Delivering the same market-leading value and performance as Nova-2 does for STT. Aura is built to be the panacea for speed, quality, and efficiency–the fastest of the high-quality options, and the best quality of the fast ones. And that’s really what end users need and what our customers have been asking us to build. + +"Deepgram is a valued partner, providing our customers with high throughput speech-to-text that delivers unrivaled performance without tradeoffs between quality, speed, and cost. We're excited to see Deepgram extend their speech AI platform and bring this approach to the text-to-speech market." - Richard Dumas, VP AI Product Strategy at Five9 + + +What's Next +---------- +As we’ve discussed, scaled voice agents are a high throughput use case, and we believe their success will ultimately depend on a unified approach to audio, one that strikes the right balance between natural voice quality, responsiveness, and cost-efficiency. And with Aura, we’re just getting started. We’re looking forward to continuing to work with customers like Asurion and partners like Five9 across speech-to-text AND text-to-speech as we help them define the future of AI agents, and we invite you to join us on this journey. + +We expect to release generally early next year, but if you’re working on any real-time AI agent use cases, join our waitlist today to jumpstart your development in production as we continue to refine our model and API features with your direct feedback. \ No newline at end of file diff --git a/examples/analyze/summary/Analyze.csproj b/examples/analyze/summary/Analyze.csproj new file mode 100644 index 00000000..d0ea3e2e --- /dev/null +++ b/examples/analyze/summary/Analyze.csproj @@ -0,0 +1,28 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + + + + + Always + + + + diff --git a/examples/analyze/summary/Program.cs b/examples/analyze/summary/Program.cs new file mode 100644 index 00000000..d848fdec --- /dev/null +++ b/examples/analyze/summary/Program.cs @@ -0,0 +1,45 @@ +// Copyright 2024 Deepgram .NET SDK contributors. All Rights Reserved. +// Use of this source code is governed by a MIT license that can be found in the LICENSE file. +// SPDX-License-Identifier: MIT + +using System.Text.Json; + +using Deepgram.Models.Analyze.v1; + +namespace PreRecorded +{ + class Program + { + static async Task Main(string[] args) + { + // Initialize Library with default logging + // Normal logging is "Info" level + Library.Initialize(); + + // Set "DEEPGRAM_API_KEY" environment variable to your Deepgram API Key + var deepgramClient = new AnalyzeClient(); + + // check to see if the file exists + if (!File.Exists(@"conversation.txt")) + { + Console.WriteLine("Error: File 'conversation.txt' not found."); + return; + } + + var audioData = File.ReadAllBytes(@"conversation.txt"); + var response = await deepgramClient.AnalyzeFile( + audioData, + new AnalyzeSchema() + { + Language = "en", + Summarize = true, + }); + + Console.WriteLine(JsonSerializer.Serialize(response)); + Console.ReadKey(); + + // Teardown Library + Library.Terminate(); + } + } +} \ No newline at end of file diff --git a/examples/analyze/summary/conversation.txt b/examples/analyze/summary/conversation.txt new file mode 100644 index 00000000..2af89e08 --- /dev/null +++ b/examples/analyze/summary/conversation.txt @@ -0,0 +1,71 @@ +Meet Deepgram Aura: real-time text-to-speech for real-time AI agents +---------- +It’s been a year since large language models (LLMs) seemingly went mainstream overnight (Happy Birthday, ChatGPT!!!), and the world has witnessed both rapid development of these technologies and immense interest in their potential. We believe that we have reached an inflection point where voice-based interfaces will be the primary means to accessing LLMs and the experiences they unlock. Here are a few recent signals in support of our thesis: + +- Good old fashioned voice notes are enjoying a healthy resurgence. + +- According to a recent survey, a majority of respondents stated phone calls are still their preferred communication channel for resolving customer service issues. + +- An emerging boom in wearable devices equipped with continuous listening and speech AI technology is gaining steam. + +- OpenAI recently enabled voice interactions in ChatGPT. + +- A wave of interest in voice-first experiences and tools is sweeping across brands, investors, and tech companies. + +Thanks to ChatGPT and the advent of the LLM era, the conversational AI tech stack has advanced sufficiently to support productive (not frustrating) voice-powered AI assistants and agents that can interact with humans in a natural manner. We have already observed this from our most innovative customers who are actively turning to these technologies to build a diverse range of AI agents for voice ordering systems, interview bots, personal AI assistants, automated drive-thru tellers, and autonomous sales and customer service agents. + +While these AI agents hold immense potential, many customers have expressed their dissatisfaction with the current crop of voice AI vendors, citing roadblocks related to speed, cost, reliability, and conversational quality. That’s why we’re excited to introduce our own text-to-speech (TTS) API, Deepgram Aura, built for real-time, conversational voice AI agents. + +Whether used on its own or in conjunction with our industry-leading Nova-2 speech-to-text API, we’ll soon provide developers with a complete speech AI platform, giving them the essential building blocks they need to build high throughput, real-time AI agents of the future. + +We are thrilled about the progress our initial group of developers has made using Aura, so much so that we are extending limited access to a select few partners who will be free to begin integrating with Aura immediately. With their feedback, we’ll continue to enhance our suite of voices and API features, as well as ensure a smooth launch of their production-grade applications. + + +What Customers Want +---------- +I feel the need, the need for speed +What we’ve heard from many of our customers and partners is that voice AI technology today caters to two main areas: high production or high throughput. + +High Production is all about crafting the perfect voice. It's used in projects where every tone and inflection matters, like in video games or audiobooks, to really bring a scene or story to life. Here, voice quality is king, with creators investing hours to fine-tune every detail for a powerful emotional impact. The primary benefit is the ability to swap out a high-paid voice actor with AI where you have more dynamic control over what’s being said while also achieving some cost savings. But these use cases are more specialized and represent just a sliver of the overall voice AI opportunity. + +On the flip side, High Throughput is about handling many quick, one-off interactions for real-time conversations at scale. Think fast food ordering, booking appointments, or inquiring about the latest deals at a car dealership. These tasks are relevant to just about everyone on the planet, and they require fast, efficient text-to-speech conversion for an AI agent to fulfill them. While voice quality is still important to keep users engaged, quality here is more about the naturalness of the flow of conversation and less about sounding like Morgan Freeman. But the primary focus for most customers in this category is on improving customer outcomes, meaning speed and efficiency are must-haves for ensuring these everyday exchanges are smooth and reliable at high volume. + +"Deepgram showed me less than 200ms latency today. That's the fastest text-to-speech I’ve ever seen. And our customers would be more than satisfied with the conversation quality." + +Jordan Dearsley, Co-founder at Vapi + +Although high production use cases seem to be well-served with UI-centric production tools, high throughput, real-time use cases still mostly rely on APIs provided by the major cloud providers. And our customers have been telling us that they’ve been falling short, with insufficient quality for a good user experience, too much latency to make real-time use cases work, and costs too expensive to operate at scale. + + +More human than human +---------- +With Aura, we’ll give realistic voices to AI agents. Our goal is to craft text-to-speech capabilities that mirror natural human conversations, including timely responses, the incorporation of natural speech fillers like 'um' and 'uh' during contemplation, and the modulation of tone and emotion according to the conversational context. We aim to incorporate laughter and other speech nuances as well. Furthermore, we are dedicated to tailoring these voices to their specific applications, ensuring they remain composed and articulate, particularly in enunciating account numbers and business names with precision. + +"I don’t really consider Azure and the other guys anymore because the voices sound so robotic." +Jordan Dearsley, Co-founder at Vapi + +In blind evaluation trials conducted for benchmarking, early versions of Aura have consistently been rated as sounding more human than prominent alternatives, even outranking human speakers for various audio clips more often than not on average. We were pleasantly surprised by these results (stay tuned for a future post containing comprehensive benchmarks for speed and quality soon!), so much so that we’re accelerating our development timeline and publicly announcing today’s waitlist expansion. + +Here are some sample clips generated by one of the earliest iterations of Aura. The quality and overall performance will continue to improve with additional model training and refinement. We encourage you to give them a listen and note the naturalness of their cadence, rhythm, and tone in the flow of conversation with another human. + + +Our Approach +---------- +For nearly a decade, we’ve worked tirelessly to advance the art of the possible in speech recognition and spoken language understanding. Along the way, we’ve transcribed trillions of spoken words into highly accurate transcriptions. Our model research team has developed novel transformer architectures equipped to deal with the nuances of conversational audio–across different languages, accents, and dialects, while handling disfluencies and the changing rhythms, tones, cadences, and inflections that occur in natural, back-and-forth conversations. + +And all the while, we’ve purposefully built our models under limited constraints to optimize their speed and efficiency. With support for dozens of languages and custom model training, our technical team has trained and deployed thousands of speech AI models (more than anybody else) which we operate and manage for our customers each day using our own computing infrastructure. + +We also have our own in-house data labeling and data ops team with years of experience building bespoke workflows to record, store, and transfer vast amounts of audio in order to label it and continuously grow our bank of high-quality data (millions of hours and counting) used in our model training. + +These combined experiences have made us experts in processing and modeling speech audio, especially in support of streaming use cases with our real-time STT models. Our customers have been asking if we could apply the same approach for TTS, and we can. + +So what can you expect from Aura? Delivering the same market-leading value and performance as Nova-2 does for STT. Aura is built to be the panacea for speed, quality, and efficiency–the fastest of the high-quality options, and the best quality of the fast ones. And that’s really what end users need and what our customers have been asking us to build. + +"Deepgram is a valued partner, providing our customers with high throughput speech-to-text that delivers unrivaled performance without tradeoffs between quality, speed, and cost. We're excited to see Deepgram extend their speech AI platform and bring this approach to the text-to-speech market." - Richard Dumas, VP AI Product Strategy at Five9 + + +What's Next +---------- +As we’ve discussed, scaled voice agents are a high throughput use case, and we believe their success will ultimately depend on a unified approach to audio, one that strikes the right balance between natural voice quality, responsiveness, and cost-efficiency. And with Aura, we’re just getting started. We’re looking forward to continuing to work with customers like Asurion and partners like Five9 across speech-to-text AND text-to-speech as we help them define the future of AI agents, and we invite you to join us on this journey. + +We expect to release generally early next year, but if you’re working on any real-time AI agent use cases, join our waitlist today to jumpstart your development in production as we continue to refine our model and API features with your direct feedback. \ No newline at end of file diff --git a/examples/analyze/topic/Analyze.csproj b/examples/analyze/topic/Analyze.csproj new file mode 100644 index 00000000..d0ea3e2e --- /dev/null +++ b/examples/analyze/topic/Analyze.csproj @@ -0,0 +1,28 @@ + + + + Exe + net6.0 + enable + enable + + + + + + + + + + + + + + + + + Always + + + + diff --git a/examples/analyze/topic/Program.cs b/examples/analyze/topic/Program.cs new file mode 100644 index 00000000..47a45070 --- /dev/null +++ b/examples/analyze/topic/Program.cs @@ -0,0 +1,45 @@ +// Copyright 2024 Deepgram .NET SDK contributors. All Rights Reserved. +// Use of this source code is governed by a MIT license that can be found in the LICENSE file. +// SPDX-License-Identifier: MIT + +using System.Text.Json; + +using Deepgram.Models.Analyze.v1; + +namespace PreRecorded +{ + class Program + { + static async Task Main(string[] args) + { + // Initialize Library with default logging + // Normal logging is "Info" level + Library.Initialize(); + + // Set "DEEPGRAM_API_KEY" environment variable to your Deepgram API Key + var deepgramClient = new AnalyzeClient(); + + // check to see if the file exists + if (!File.Exists(@"conversation.txt")) + { + Console.WriteLine("Error: File 'conversation.txt' not found."); + return; + } + + var audioData = File.ReadAllBytes(@"conversation.txt"); + var response = await deepgramClient.AnalyzeFile( + audioData, + new AnalyzeSchema() + { + Language = "en", + Topics = true, + }); + + Console.WriteLine(JsonSerializer.Serialize(response)); + Console.ReadKey(); + + // Teardown Library + Library.Terminate(); + } + } +} \ No newline at end of file diff --git a/examples/analyze/topic/conversation.txt b/examples/analyze/topic/conversation.txt new file mode 100644 index 00000000..2af89e08 --- /dev/null +++ b/examples/analyze/topic/conversation.txt @@ -0,0 +1,71 @@ +Meet Deepgram Aura: real-time text-to-speech for real-time AI agents +---------- +It’s been a year since large language models (LLMs) seemingly went mainstream overnight (Happy Birthday, ChatGPT!!!), and the world has witnessed both rapid development of these technologies and immense interest in their potential. We believe that we have reached an inflection point where voice-based interfaces will be the primary means to accessing LLMs and the experiences they unlock. Here are a few recent signals in support of our thesis: + +- Good old fashioned voice notes are enjoying a healthy resurgence. + +- According to a recent survey, a majority of respondents stated phone calls are still their preferred communication channel for resolving customer service issues. + +- An emerging boom in wearable devices equipped with continuous listening and speech AI technology is gaining steam. + +- OpenAI recently enabled voice interactions in ChatGPT. + +- A wave of interest in voice-first experiences and tools is sweeping across brands, investors, and tech companies. + +Thanks to ChatGPT and the advent of the LLM era, the conversational AI tech stack has advanced sufficiently to support productive (not frustrating) voice-powered AI assistants and agents that can interact with humans in a natural manner. We have already observed this from our most innovative customers who are actively turning to these technologies to build a diverse range of AI agents for voice ordering systems, interview bots, personal AI assistants, automated drive-thru tellers, and autonomous sales and customer service agents. + +While these AI agents hold immense potential, many customers have expressed their dissatisfaction with the current crop of voice AI vendors, citing roadblocks related to speed, cost, reliability, and conversational quality. That’s why we’re excited to introduce our own text-to-speech (TTS) API, Deepgram Aura, built for real-time, conversational voice AI agents. + +Whether used on its own or in conjunction with our industry-leading Nova-2 speech-to-text API, we’ll soon provide developers with a complete speech AI platform, giving them the essential building blocks they need to build high throughput, real-time AI agents of the future. + +We are thrilled about the progress our initial group of developers has made using Aura, so much so that we are extending limited access to a select few partners who will be free to begin integrating with Aura immediately. With their feedback, we’ll continue to enhance our suite of voices and API features, as well as ensure a smooth launch of their production-grade applications. + + +What Customers Want +---------- +I feel the need, the need for speed +What we’ve heard from many of our customers and partners is that voice AI technology today caters to two main areas: high production or high throughput. + +High Production is all about crafting the perfect voice. It's used in projects where every tone and inflection matters, like in video games or audiobooks, to really bring a scene or story to life. Here, voice quality is king, with creators investing hours to fine-tune every detail for a powerful emotional impact. The primary benefit is the ability to swap out a high-paid voice actor with AI where you have more dynamic control over what’s being said while also achieving some cost savings. But these use cases are more specialized and represent just a sliver of the overall voice AI opportunity. + +On the flip side, High Throughput is about handling many quick, one-off interactions for real-time conversations at scale. Think fast food ordering, booking appointments, or inquiring about the latest deals at a car dealership. These tasks are relevant to just about everyone on the planet, and they require fast, efficient text-to-speech conversion for an AI agent to fulfill them. While voice quality is still important to keep users engaged, quality here is more about the naturalness of the flow of conversation and less about sounding like Morgan Freeman. But the primary focus for most customers in this category is on improving customer outcomes, meaning speed and efficiency are must-haves for ensuring these everyday exchanges are smooth and reliable at high volume. + +"Deepgram showed me less than 200ms latency today. That's the fastest text-to-speech I’ve ever seen. And our customers would be more than satisfied with the conversation quality." + +Jordan Dearsley, Co-founder at Vapi + +Although high production use cases seem to be well-served with UI-centric production tools, high throughput, real-time use cases still mostly rely on APIs provided by the major cloud providers. And our customers have been telling us that they’ve been falling short, with insufficient quality for a good user experience, too much latency to make real-time use cases work, and costs too expensive to operate at scale. + + +More human than human +---------- +With Aura, we’ll give realistic voices to AI agents. Our goal is to craft text-to-speech capabilities that mirror natural human conversations, including timely responses, the incorporation of natural speech fillers like 'um' and 'uh' during contemplation, and the modulation of tone and emotion according to the conversational context. We aim to incorporate laughter and other speech nuances as well. Furthermore, we are dedicated to tailoring these voices to their specific applications, ensuring they remain composed and articulate, particularly in enunciating account numbers and business names with precision. + +"I don’t really consider Azure and the other guys anymore because the voices sound so robotic." +Jordan Dearsley, Co-founder at Vapi + +In blind evaluation trials conducted for benchmarking, early versions of Aura have consistently been rated as sounding more human than prominent alternatives, even outranking human speakers for various audio clips more often than not on average. We were pleasantly surprised by these results (stay tuned for a future post containing comprehensive benchmarks for speed and quality soon!), so much so that we’re accelerating our development timeline and publicly announcing today’s waitlist expansion. + +Here are some sample clips generated by one of the earliest iterations of Aura. The quality and overall performance will continue to improve with additional model training and refinement. We encourage you to give them a listen and note the naturalness of their cadence, rhythm, and tone in the flow of conversation with another human. + + +Our Approach +---------- +For nearly a decade, we’ve worked tirelessly to advance the art of the possible in speech recognition and spoken language understanding. Along the way, we’ve transcribed trillions of spoken words into highly accurate transcriptions. Our model research team has developed novel transformer architectures equipped to deal with the nuances of conversational audio–across different languages, accents, and dialects, while handling disfluencies and the changing rhythms, tones, cadences, and inflections that occur in natural, back-and-forth conversations. + +And all the while, we’ve purposefully built our models under limited constraints to optimize their speed and efficiency. With support for dozens of languages and custom model training, our technical team has trained and deployed thousands of speech AI models (more than anybody else) which we operate and manage for our customers each day using our own computing infrastructure. + +We also have our own in-house data labeling and data ops team with years of experience building bespoke workflows to record, store, and transfer vast amounts of audio in order to label it and continuously grow our bank of high-quality data (millions of hours and counting) used in our model training. + +These combined experiences have made us experts in processing and modeling speech audio, especially in support of streaming use cases with our real-time STT models. Our customers have been asking if we could apply the same approach for TTS, and we can. + +So what can you expect from Aura? Delivering the same market-leading value and performance as Nova-2 does for STT. Aura is built to be the panacea for speed, quality, and efficiency–the fastest of the high-quality options, and the best quality of the fast ones. And that’s really what end users need and what our customers have been asking us to build. + +"Deepgram is a valued partner, providing our customers with high throughput speech-to-text that delivers unrivaled performance without tradeoffs between quality, speed, and cost. We're excited to see Deepgram extend their speech AI platform and bring this approach to the text-to-speech market." - Richard Dumas, VP AI Product Strategy at Five9 + + +What's Next +---------- +As we’ve discussed, scaled voice agents are a high throughput use case, and we believe their success will ultimately depend on a unified approach to audio, one that strikes the right balance between natural voice quality, responsiveness, and cost-efficiency. And with Aura, we’re just getting started. We’re looking forward to continuing to work with customers like Asurion and partners like Five9 across speech-to-text AND text-to-speech as we help them define the future of AI agents, and we invite you to join us on this journey. + +We expect to release generally early next year, but if you’re working on any real-time AI agent use cases, join our waitlist today to jumpstart your development in production as we continue to refine our model and API features with your direct feedback. \ No newline at end of file diff --git a/examples/prerecorded/file/Bueller-Life-moves-pretty-fast.wav b/examples/prerecorded/file/Bueller-Life-moves-pretty-fast.wav new file mode 100644 index 0000000000000000000000000000000000000000..ca08d9218b4ad3aa62e383bd69956f309bb2af84 GIT binary patch literal 3102792 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