diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Voice ID SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2021-09-27@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-voice-id)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.VoiceId](http://hackage.haskell.org/package/amazonka-voice-id/docs/Amazonka-VoiceId.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-voice-id` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-voice-id.cabal b/amazonka-voice-id.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-voice-id.cabal
@@ -0,0 +1,142 @@
+cabal-version:      2.2
+name:               amazonka-voice-id
+version:            2.0
+synopsis:           Amazon Voice ID SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2021-09-27@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.VoiceId.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.VoiceId" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-voice-id
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.VoiceId
+    Amazonka.VoiceId.CreateDomain
+    Amazonka.VoiceId.DeleteDomain
+    Amazonka.VoiceId.DeleteFraudster
+    Amazonka.VoiceId.DeleteSpeaker
+    Amazonka.VoiceId.DescribeDomain
+    Amazonka.VoiceId.DescribeFraudster
+    Amazonka.VoiceId.DescribeFraudsterRegistrationJob
+    Amazonka.VoiceId.DescribeSpeaker
+    Amazonka.VoiceId.DescribeSpeakerEnrollmentJob
+    Amazonka.VoiceId.EvaluateSession
+    Amazonka.VoiceId.Lens
+    Amazonka.VoiceId.ListDomains
+    Amazonka.VoiceId.ListFraudsterRegistrationJobs
+    Amazonka.VoiceId.ListSpeakerEnrollmentJobs
+    Amazonka.VoiceId.ListSpeakers
+    Amazonka.VoiceId.ListTagsForResource
+    Amazonka.VoiceId.OptOutSpeaker
+    Amazonka.VoiceId.StartFraudsterRegistrationJob
+    Amazonka.VoiceId.StartSpeakerEnrollmentJob
+    Amazonka.VoiceId.TagResource
+    Amazonka.VoiceId.Types
+    Amazonka.VoiceId.Types.AuthenticationConfiguration
+    Amazonka.VoiceId.Types.AuthenticationDecision
+    Amazonka.VoiceId.Types.AuthenticationResult
+    Amazonka.VoiceId.Types.Domain
+    Amazonka.VoiceId.Types.DomainStatus
+    Amazonka.VoiceId.Types.DomainSummary
+    Amazonka.VoiceId.Types.DuplicateRegistrationAction
+    Amazonka.VoiceId.Types.EnrollmentConfig
+    Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig
+    Amazonka.VoiceId.Types.ExistingEnrollmentAction
+    Amazonka.VoiceId.Types.FailureDetails
+    Amazonka.VoiceId.Types.FraudDetectionAction
+    Amazonka.VoiceId.Types.FraudDetectionConfiguration
+    Amazonka.VoiceId.Types.FraudDetectionDecision
+    Amazonka.VoiceId.Types.FraudDetectionReason
+    Amazonka.VoiceId.Types.FraudDetectionResult
+    Amazonka.VoiceId.Types.FraudRiskDetails
+    Amazonka.VoiceId.Types.Fraudster
+    Amazonka.VoiceId.Types.FraudsterRegistrationJob
+    Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+    Amazonka.VoiceId.Types.FraudsterRegistrationJobSummary
+    Amazonka.VoiceId.Types.InputDataConfig
+    Amazonka.VoiceId.Types.JobProgress
+    Amazonka.VoiceId.Types.KnownFraudsterRisk
+    Amazonka.VoiceId.Types.OutputDataConfig
+    Amazonka.VoiceId.Types.RegistrationConfig
+    Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+    Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+    Amazonka.VoiceId.Types.ServerSideEncryptionUpdateStatus
+    Amazonka.VoiceId.Types.Speaker
+    Amazonka.VoiceId.Types.SpeakerEnrollmentJob
+    Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+    Amazonka.VoiceId.Types.SpeakerEnrollmentJobSummary
+    Amazonka.VoiceId.Types.SpeakerStatus
+    Amazonka.VoiceId.Types.SpeakerSummary
+    Amazonka.VoiceId.Types.StreamingStatus
+    Amazonka.VoiceId.Types.Tag
+    Amazonka.VoiceId.Types.VoiceSpoofingRisk
+    Amazonka.VoiceId.UntagResource
+    Amazonka.VoiceId.UpdateDomain
+    Amazonka.VoiceId.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-voice-id-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.VoiceId
+    Test.Amazonka.VoiceId
+    Test.Amazonka.VoiceId.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-test         >=2.0 && <2.1
+    , amazonka-voice-id
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateDomain.yaml b/fixture/CreateDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDomainResponse.proto b/fixture/CreateDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDomainResponse.proto
diff --git a/fixture/DeleteDomain.yaml b/fixture/DeleteDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDomainResponse.proto b/fixture/DeleteDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDomainResponse.proto
diff --git a/fixture/DeleteFraudster.yaml b/fixture/DeleteFraudster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFraudster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteFraudsterResponse.proto b/fixture/DeleteFraudsterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFraudsterResponse.proto
diff --git a/fixture/DeleteSpeaker.yaml b/fixture/DeleteSpeaker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSpeaker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSpeakerResponse.proto b/fixture/DeleteSpeakerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSpeakerResponse.proto
diff --git a/fixture/DescribeDomain.yaml b/fixture/DescribeDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDomainResponse.proto b/fixture/DescribeDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDomainResponse.proto
diff --git a/fixture/DescribeFraudster.yaml b/fixture/DescribeFraudster.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFraudster.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeFraudsterRegistrationJob.yaml b/fixture/DescribeFraudsterRegistrationJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFraudsterRegistrationJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeFraudsterRegistrationJobResponse.proto b/fixture/DescribeFraudsterRegistrationJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFraudsterRegistrationJobResponse.proto
diff --git a/fixture/DescribeFraudsterResponse.proto b/fixture/DescribeFraudsterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFraudsterResponse.proto
diff --git a/fixture/DescribeSpeaker.yaml b/fixture/DescribeSpeaker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpeaker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSpeakerEnrollmentJob.yaml b/fixture/DescribeSpeakerEnrollmentJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpeakerEnrollmentJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSpeakerEnrollmentJobResponse.proto b/fixture/DescribeSpeakerEnrollmentJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpeakerEnrollmentJobResponse.proto
diff --git a/fixture/DescribeSpeakerResponse.proto b/fixture/DescribeSpeakerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSpeakerResponse.proto
diff --git a/fixture/EvaluateSession.yaml b/fixture/EvaluateSession.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/EvaluateSession.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/EvaluateSessionResponse.proto b/fixture/EvaluateSessionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/EvaluateSessionResponse.proto
diff --git a/fixture/ListDomains.yaml b/fixture/ListDomains.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomains.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDomainsResponse.proto b/fixture/ListDomainsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDomainsResponse.proto
diff --git a/fixture/ListFraudsterRegistrationJobs.yaml b/fixture/ListFraudsterRegistrationJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListFraudsterRegistrationJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListFraudsterRegistrationJobsResponse.proto b/fixture/ListFraudsterRegistrationJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListFraudsterRegistrationJobsResponse.proto
diff --git a/fixture/ListSpeakerEnrollmentJobs.yaml b/fixture/ListSpeakerEnrollmentJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSpeakerEnrollmentJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListSpeakerEnrollmentJobsResponse.proto b/fixture/ListSpeakerEnrollmentJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSpeakerEnrollmentJobsResponse.proto
diff --git a/fixture/ListSpeakers.yaml b/fixture/ListSpeakers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSpeakers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListSpeakersResponse.proto b/fixture/ListSpeakersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSpeakersResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/OptOutSpeaker.yaml b/fixture/OptOutSpeaker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/OptOutSpeaker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/OptOutSpeakerResponse.proto b/fixture/OptOutSpeakerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/OptOutSpeakerResponse.proto
diff --git a/fixture/StartFraudsterRegistrationJob.yaml b/fixture/StartFraudsterRegistrationJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartFraudsterRegistrationJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartFraudsterRegistrationJobResponse.proto b/fixture/StartFraudsterRegistrationJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartFraudsterRegistrationJobResponse.proto
diff --git a/fixture/StartSpeakerEnrollmentJob.yaml b/fixture/StartSpeakerEnrollmentJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartSpeakerEnrollmentJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartSpeakerEnrollmentJobResponse.proto b/fixture/StartSpeakerEnrollmentJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartSpeakerEnrollmentJobResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateDomain.yaml b/fixture/UpdateDomain.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDomain.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/voiceid/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  voiceid.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateDomainResponse.proto b/fixture/UpdateDomainResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDomainResponse.proto
diff --git a/gen/Amazonka/VoiceId.hs b/gen/Amazonka/VoiceId.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId.hs
@@ -0,0 +1,370 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.VoiceId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2021-09-27@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Connect Voice ID provides real-time caller authentication and
+-- fraud screening. This guide describes the APIs used for this service.
+module Amazonka.VoiceId
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateDomain
+    CreateDomain (CreateDomain'),
+    newCreateDomain,
+    CreateDomainResponse (CreateDomainResponse'),
+    newCreateDomainResponse,
+
+    -- ** DeleteDomain
+    DeleteDomain (DeleteDomain'),
+    newDeleteDomain,
+    DeleteDomainResponse (DeleteDomainResponse'),
+    newDeleteDomainResponse,
+
+    -- ** DeleteFraudster
+    DeleteFraudster (DeleteFraudster'),
+    newDeleteFraudster,
+    DeleteFraudsterResponse (DeleteFraudsterResponse'),
+    newDeleteFraudsterResponse,
+
+    -- ** DeleteSpeaker
+    DeleteSpeaker (DeleteSpeaker'),
+    newDeleteSpeaker,
+    DeleteSpeakerResponse (DeleteSpeakerResponse'),
+    newDeleteSpeakerResponse,
+
+    -- ** DescribeDomain
+    DescribeDomain (DescribeDomain'),
+    newDescribeDomain,
+    DescribeDomainResponse (DescribeDomainResponse'),
+    newDescribeDomainResponse,
+
+    -- ** DescribeFraudster
+    DescribeFraudster (DescribeFraudster'),
+    newDescribeFraudster,
+    DescribeFraudsterResponse (DescribeFraudsterResponse'),
+    newDescribeFraudsterResponse,
+
+    -- ** DescribeFraudsterRegistrationJob
+    DescribeFraudsterRegistrationJob (DescribeFraudsterRegistrationJob'),
+    newDescribeFraudsterRegistrationJob,
+    DescribeFraudsterRegistrationJobResponse (DescribeFraudsterRegistrationJobResponse'),
+    newDescribeFraudsterRegistrationJobResponse,
+
+    -- ** DescribeSpeaker
+    DescribeSpeaker (DescribeSpeaker'),
+    newDescribeSpeaker,
+    DescribeSpeakerResponse (DescribeSpeakerResponse'),
+    newDescribeSpeakerResponse,
+
+    -- ** DescribeSpeakerEnrollmentJob
+    DescribeSpeakerEnrollmentJob (DescribeSpeakerEnrollmentJob'),
+    newDescribeSpeakerEnrollmentJob,
+    DescribeSpeakerEnrollmentJobResponse (DescribeSpeakerEnrollmentJobResponse'),
+    newDescribeSpeakerEnrollmentJobResponse,
+
+    -- ** EvaluateSession
+    EvaluateSession (EvaluateSession'),
+    newEvaluateSession,
+    EvaluateSessionResponse (EvaluateSessionResponse'),
+    newEvaluateSessionResponse,
+
+    -- ** ListDomains (Paginated)
+    ListDomains (ListDomains'),
+    newListDomains,
+    ListDomainsResponse (ListDomainsResponse'),
+    newListDomainsResponse,
+
+    -- ** ListFraudsterRegistrationJobs (Paginated)
+    ListFraudsterRegistrationJobs (ListFraudsterRegistrationJobs'),
+    newListFraudsterRegistrationJobs,
+    ListFraudsterRegistrationJobsResponse (ListFraudsterRegistrationJobsResponse'),
+    newListFraudsterRegistrationJobsResponse,
+
+    -- ** ListSpeakerEnrollmentJobs (Paginated)
+    ListSpeakerEnrollmentJobs (ListSpeakerEnrollmentJobs'),
+    newListSpeakerEnrollmentJobs,
+    ListSpeakerEnrollmentJobsResponse (ListSpeakerEnrollmentJobsResponse'),
+    newListSpeakerEnrollmentJobsResponse,
+
+    -- ** ListSpeakers (Paginated)
+    ListSpeakers (ListSpeakers'),
+    newListSpeakers,
+    ListSpeakersResponse (ListSpeakersResponse'),
+    newListSpeakersResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** OptOutSpeaker
+    OptOutSpeaker (OptOutSpeaker'),
+    newOptOutSpeaker,
+    OptOutSpeakerResponse (OptOutSpeakerResponse'),
+    newOptOutSpeakerResponse,
+
+    -- ** StartFraudsterRegistrationJob
+    StartFraudsterRegistrationJob (StartFraudsterRegistrationJob'),
+    newStartFraudsterRegistrationJob,
+    StartFraudsterRegistrationJobResponse (StartFraudsterRegistrationJobResponse'),
+    newStartFraudsterRegistrationJobResponse,
+
+    -- ** StartSpeakerEnrollmentJob
+    StartSpeakerEnrollmentJob (StartSpeakerEnrollmentJob'),
+    newStartSpeakerEnrollmentJob,
+    StartSpeakerEnrollmentJobResponse (StartSpeakerEnrollmentJobResponse'),
+    newStartSpeakerEnrollmentJobResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateDomain
+    UpdateDomain (UpdateDomain'),
+    newUpdateDomain,
+    UpdateDomainResponse (UpdateDomainResponse'),
+    newUpdateDomainResponse,
+
+    -- * Types
+
+    -- ** AuthenticationDecision
+    AuthenticationDecision (..),
+
+    -- ** DomainStatus
+    DomainStatus (..),
+
+    -- ** DuplicateRegistrationAction
+    DuplicateRegistrationAction (..),
+
+    -- ** ExistingEnrollmentAction
+    ExistingEnrollmentAction (..),
+
+    -- ** FraudDetectionAction
+    FraudDetectionAction (..),
+
+    -- ** FraudDetectionDecision
+    FraudDetectionDecision (..),
+
+    -- ** FraudDetectionReason
+    FraudDetectionReason (..),
+
+    -- ** FraudsterRegistrationJobStatus
+    FraudsterRegistrationJobStatus (..),
+
+    -- ** ServerSideEncryptionUpdateStatus
+    ServerSideEncryptionUpdateStatus (..),
+
+    -- ** SpeakerEnrollmentJobStatus
+    SpeakerEnrollmentJobStatus (..),
+
+    -- ** SpeakerStatus
+    SpeakerStatus (..),
+
+    -- ** StreamingStatus
+    StreamingStatus (..),
+
+    -- ** AuthenticationConfiguration
+    AuthenticationConfiguration (AuthenticationConfiguration'),
+    newAuthenticationConfiguration,
+
+    -- ** AuthenticationResult
+    AuthenticationResult (AuthenticationResult'),
+    newAuthenticationResult,
+
+    -- ** Domain
+    Domain (Domain'),
+    newDomain,
+
+    -- ** DomainSummary
+    DomainSummary (DomainSummary'),
+    newDomainSummary,
+
+    -- ** EnrollmentConfig
+    EnrollmentConfig (EnrollmentConfig'),
+    newEnrollmentConfig,
+
+    -- ** EnrollmentJobFraudDetectionConfig
+    EnrollmentJobFraudDetectionConfig (EnrollmentJobFraudDetectionConfig'),
+    newEnrollmentJobFraudDetectionConfig,
+
+    -- ** FailureDetails
+    FailureDetails (FailureDetails'),
+    newFailureDetails,
+
+    -- ** FraudDetectionConfiguration
+    FraudDetectionConfiguration (FraudDetectionConfiguration'),
+    newFraudDetectionConfiguration,
+
+    -- ** FraudDetectionResult
+    FraudDetectionResult (FraudDetectionResult'),
+    newFraudDetectionResult,
+
+    -- ** FraudRiskDetails
+    FraudRiskDetails (FraudRiskDetails'),
+    newFraudRiskDetails,
+
+    -- ** Fraudster
+    Fraudster (Fraudster'),
+    newFraudster,
+
+    -- ** FraudsterRegistrationJob
+    FraudsterRegistrationJob (FraudsterRegistrationJob'),
+    newFraudsterRegistrationJob,
+
+    -- ** FraudsterRegistrationJobSummary
+    FraudsterRegistrationJobSummary (FraudsterRegistrationJobSummary'),
+    newFraudsterRegistrationJobSummary,
+
+    -- ** InputDataConfig
+    InputDataConfig (InputDataConfig'),
+    newInputDataConfig,
+
+    -- ** JobProgress
+    JobProgress (JobProgress'),
+    newJobProgress,
+
+    -- ** KnownFraudsterRisk
+    KnownFraudsterRisk (KnownFraudsterRisk'),
+    newKnownFraudsterRisk,
+
+    -- ** OutputDataConfig
+    OutputDataConfig (OutputDataConfig'),
+    newOutputDataConfig,
+
+    -- ** RegistrationConfig
+    RegistrationConfig (RegistrationConfig'),
+    newRegistrationConfig,
+
+    -- ** ServerSideEncryptionConfiguration
+    ServerSideEncryptionConfiguration (ServerSideEncryptionConfiguration'),
+    newServerSideEncryptionConfiguration,
+
+    -- ** ServerSideEncryptionUpdateDetails
+    ServerSideEncryptionUpdateDetails (ServerSideEncryptionUpdateDetails'),
+    newServerSideEncryptionUpdateDetails,
+
+    -- ** Speaker
+    Speaker (Speaker'),
+    newSpeaker,
+
+    -- ** SpeakerEnrollmentJob
+    SpeakerEnrollmentJob (SpeakerEnrollmentJob'),
+    newSpeakerEnrollmentJob,
+
+    -- ** SpeakerEnrollmentJobSummary
+    SpeakerEnrollmentJobSummary (SpeakerEnrollmentJobSummary'),
+    newSpeakerEnrollmentJobSummary,
+
+    -- ** SpeakerSummary
+    SpeakerSummary (SpeakerSummary'),
+    newSpeakerSummary,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** VoiceSpoofingRisk
+    VoiceSpoofingRisk (VoiceSpoofingRisk'),
+    newVoiceSpoofingRisk,
+  )
+where
+
+import Amazonka.VoiceId.CreateDomain
+import Amazonka.VoiceId.DeleteDomain
+import Amazonka.VoiceId.DeleteFraudster
+import Amazonka.VoiceId.DeleteSpeaker
+import Amazonka.VoiceId.DescribeDomain
+import Amazonka.VoiceId.DescribeFraudster
+import Amazonka.VoiceId.DescribeFraudsterRegistrationJob
+import Amazonka.VoiceId.DescribeSpeaker
+import Amazonka.VoiceId.DescribeSpeakerEnrollmentJob
+import Amazonka.VoiceId.EvaluateSession
+import Amazonka.VoiceId.Lens
+import Amazonka.VoiceId.ListDomains
+import Amazonka.VoiceId.ListFraudsterRegistrationJobs
+import Amazonka.VoiceId.ListSpeakerEnrollmentJobs
+import Amazonka.VoiceId.ListSpeakers
+import Amazonka.VoiceId.ListTagsForResource
+import Amazonka.VoiceId.OptOutSpeaker
+import Amazonka.VoiceId.StartFraudsterRegistrationJob
+import Amazonka.VoiceId.StartSpeakerEnrollmentJob
+import Amazonka.VoiceId.TagResource
+import Amazonka.VoiceId.Types
+import Amazonka.VoiceId.UntagResource
+import Amazonka.VoiceId.UpdateDomain
+import Amazonka.VoiceId.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'VoiceId'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/VoiceId/CreateDomain.hs b/gen/Amazonka/VoiceId/CreateDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/CreateDomain.hs
@@ -0,0 +1,241 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.CreateDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a domain that contains all Amazon Connect Voice ID data, such as
+-- speakers, fraudsters, customer audio, and voiceprints.
+module Amazonka.VoiceId.CreateDomain
+  ( -- * Creating a Request
+    CreateDomain (..),
+    newCreateDomain,
+
+    -- * Request Lenses
+    createDomain_clientToken,
+    createDomain_description,
+    createDomain_tags,
+    createDomain_name,
+    createDomain_serverSideEncryptionConfiguration,
+
+    -- * Destructuring the Response
+    CreateDomainResponse (..),
+    newCreateDomainResponse,
+
+    -- * Response Lenses
+    createDomainResponse_domain,
+    createDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newCreateDomain' smart constructor.
+data CreateDomain = CreateDomain'
+  { -- | The idempotency token for creating a new domain. If not provided, Amazon
+    -- Web Services SDK populates this field.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A brief description of the domain.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | A list of tags you want added to the domain.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the domain.
+    name :: Data.Sensitive Prelude.Text,
+    -- | The configuration, containing the KMS key identifier, to be used by
+    -- Voice ID for the server-side encryption of your data. Refer to
+    -- <https://docs.aws.amazon.com/connect/latest/adminguide/encryption-at-rest.html#encryption-at-rest-voiceid Amazon Connect Voice ID encryption at rest>
+    -- for more details on how the KMS key is used.
+    serverSideEncryptionConfiguration :: ServerSideEncryptionConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'createDomain_clientToken' - The idempotency token for creating a new domain. If not provided, Amazon
+-- Web Services SDK populates this field.
+--
+-- 'description', 'createDomain_description' - A brief description of the domain.
+--
+-- 'tags', 'createDomain_tags' - A list of tags you want added to the domain.
+--
+-- 'name', 'createDomain_name' - The name of the domain.
+--
+-- 'serverSideEncryptionConfiguration', 'createDomain_serverSideEncryptionConfiguration' - The configuration, containing the KMS key identifier, to be used by
+-- Voice ID for the server-side encryption of your data. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/encryption-at-rest.html#encryption-at-rest-voiceid Amazon Connect Voice ID encryption at rest>
+-- for more details on how the KMS key is used.
+newCreateDomain ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'serverSideEncryptionConfiguration'
+  ServerSideEncryptionConfiguration ->
+  CreateDomain
+newCreateDomain
+  pName_
+  pServerSideEncryptionConfiguration_ =
+    CreateDomain'
+      { clientToken = Prelude.Nothing,
+        description = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        name = Data._Sensitive Lens.# pName_,
+        serverSideEncryptionConfiguration =
+          pServerSideEncryptionConfiguration_
+      }
+
+-- | The idempotency token for creating a new domain. If not provided, Amazon
+-- Web Services SDK populates this field.
+createDomain_clientToken :: Lens.Lens' CreateDomain (Prelude.Maybe Prelude.Text)
+createDomain_clientToken = Lens.lens (\CreateDomain' {clientToken} -> clientToken) (\s@CreateDomain' {} a -> s {clientToken = a} :: CreateDomain)
+
+-- | A brief description of the domain.
+createDomain_description :: Lens.Lens' CreateDomain (Prelude.Maybe Prelude.Text)
+createDomain_description = Lens.lens (\CreateDomain' {description} -> description) (\s@CreateDomain' {} a -> s {description = a} :: CreateDomain) Prelude.. Lens.mapping Data._Sensitive
+
+-- | A list of tags you want added to the domain.
+createDomain_tags :: Lens.Lens' CreateDomain (Prelude.Maybe [Tag])
+createDomain_tags = Lens.lens (\CreateDomain' {tags} -> tags) (\s@CreateDomain' {} a -> s {tags = a} :: CreateDomain) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the domain.
+createDomain_name :: Lens.Lens' CreateDomain Prelude.Text
+createDomain_name = Lens.lens (\CreateDomain' {name} -> name) (\s@CreateDomain' {} a -> s {name = a} :: CreateDomain) Prelude.. Data._Sensitive
+
+-- | The configuration, containing the KMS key identifier, to be used by
+-- Voice ID for the server-side encryption of your data. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/encryption-at-rest.html#encryption-at-rest-voiceid Amazon Connect Voice ID encryption at rest>
+-- for more details on how the KMS key is used.
+createDomain_serverSideEncryptionConfiguration :: Lens.Lens' CreateDomain ServerSideEncryptionConfiguration
+createDomain_serverSideEncryptionConfiguration = Lens.lens (\CreateDomain' {serverSideEncryptionConfiguration} -> serverSideEncryptionConfiguration) (\s@CreateDomain' {} a -> s {serverSideEncryptionConfiguration = a} :: CreateDomain)
+
+instance Core.AWSRequest CreateDomain where
+  type AWSResponse CreateDomain = CreateDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDomainResponse'
+            Prelude.<$> (x Data..?> "Domain")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDomain where
+  hashWithSalt _salt CreateDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` serverSideEncryptionConfiguration
+
+instance Prelude.NFData CreateDomain where
+  rnf CreateDomain' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf serverSideEncryptionConfiguration
+
+instance Data.ToHeaders CreateDomain where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.CreateDomain" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDomain where
+  toJSON CreateDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("Description" Data..=) Prelude.<$> description,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("Name" Data..= name),
+            Prelude.Just
+              ( "ServerSideEncryptionConfiguration"
+                  Data..= serverSideEncryptionConfiguration
+              )
+          ]
+      )
+
+instance Data.ToPath CreateDomain where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDomainResponse' smart constructor.
+data CreateDomainResponse = CreateDomainResponse'
+  { -- | Information about the newly created domain.
+    domain :: Prelude.Maybe Domain,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'createDomainResponse_domain' - Information about the newly created domain.
+--
+-- 'httpStatus', 'createDomainResponse_httpStatus' - The response's http status code.
+newCreateDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDomainResponse
+newCreateDomainResponse pHttpStatus_ =
+  CreateDomainResponse'
+    { domain = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the newly created domain.
+createDomainResponse_domain :: Lens.Lens' CreateDomainResponse (Prelude.Maybe Domain)
+createDomainResponse_domain = Lens.lens (\CreateDomainResponse' {domain} -> domain) (\s@CreateDomainResponse' {} a -> s {domain = a} :: CreateDomainResponse)
+
+-- | The response's http status code.
+createDomainResponse_httpStatus :: Lens.Lens' CreateDomainResponse Prelude.Int
+createDomainResponse_httpStatus = Lens.lens (\CreateDomainResponse' {httpStatus} -> httpStatus) (\s@CreateDomainResponse' {} a -> s {httpStatus = a} :: CreateDomainResponse)
+
+instance Prelude.NFData CreateDomainResponse where
+  rnf CreateDomainResponse' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/DeleteDomain.hs b/gen/Amazonka/VoiceId/DeleteDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DeleteDomain.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DeleteDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified domain from Voice ID.
+module Amazonka.VoiceId.DeleteDomain
+  ( -- * Creating a Request
+    DeleteDomain (..),
+    newDeleteDomain,
+
+    -- * Request Lenses
+    deleteDomain_domainId,
+
+    -- * Destructuring the Response
+    DeleteDomainResponse (..),
+    newDeleteDomainResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDeleteDomain' smart constructor.
+data DeleteDomain = DeleteDomain'
+  { -- | The identifier of the domain you want to delete.
+    domainId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'deleteDomain_domainId' - The identifier of the domain you want to delete.
+newDeleteDomain ::
+  -- | 'domainId'
+  Prelude.Text ->
+  DeleteDomain
+newDeleteDomain pDomainId_ =
+  DeleteDomain' {domainId = pDomainId_}
+
+-- | The identifier of the domain you want to delete.
+deleteDomain_domainId :: Lens.Lens' DeleteDomain Prelude.Text
+deleteDomain_domainId = Lens.lens (\DeleteDomain' {domainId} -> domainId) (\s@DeleteDomain' {} a -> s {domainId = a} :: DeleteDomain)
+
+instance Core.AWSRequest DeleteDomain where
+  type AWSResponse DeleteDomain = DeleteDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull DeleteDomainResponse'
+
+instance Prelude.Hashable DeleteDomain where
+  hashWithSalt _salt DeleteDomain' {..} =
+    _salt `Prelude.hashWithSalt` domainId
+
+instance Prelude.NFData DeleteDomain where
+  rnf DeleteDomain' {..} = Prelude.rnf domainId
+
+instance Data.ToHeaders DeleteDomain where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DeleteDomain" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDomain where
+  toJSON DeleteDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DomainId" Data..= domainId)]
+      )
+
+instance Data.ToPath DeleteDomain where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDomainResponse' smart constructor.
+data DeleteDomainResponse = DeleteDomainResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteDomainResponse ::
+  DeleteDomainResponse
+newDeleteDomainResponse = DeleteDomainResponse'
+
+instance Prelude.NFData DeleteDomainResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/VoiceId/DeleteFraudster.hs b/gen/Amazonka/VoiceId/DeleteFraudster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DeleteFraudster.hs
@@ -0,0 +1,150 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DeleteFraudster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified fraudster from Voice ID.
+module Amazonka.VoiceId.DeleteFraudster
+  ( -- * Creating a Request
+    DeleteFraudster (..),
+    newDeleteFraudster,
+
+    -- * Request Lenses
+    deleteFraudster_domainId,
+    deleteFraudster_fraudsterId,
+
+    -- * Destructuring the Response
+    DeleteFraudsterResponse (..),
+    newDeleteFraudsterResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDeleteFraudster' smart constructor.
+data DeleteFraudster = DeleteFraudster'
+  { -- | The identifier of the domain containing the fraudster.
+    domainId :: Prelude.Text,
+    -- | The identifier of the fraudster you want to delete.
+    fraudsterId :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteFraudster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'deleteFraudster_domainId' - The identifier of the domain containing the fraudster.
+--
+-- 'fraudsterId', 'deleteFraudster_fraudsterId' - The identifier of the fraudster you want to delete.
+newDeleteFraudster ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'fraudsterId'
+  Prelude.Text ->
+  DeleteFraudster
+newDeleteFraudster pDomainId_ pFraudsterId_ =
+  DeleteFraudster'
+    { domainId = pDomainId_,
+      fraudsterId = Data._Sensitive Lens.# pFraudsterId_
+    }
+
+-- | The identifier of the domain containing the fraudster.
+deleteFraudster_domainId :: Lens.Lens' DeleteFraudster Prelude.Text
+deleteFraudster_domainId = Lens.lens (\DeleteFraudster' {domainId} -> domainId) (\s@DeleteFraudster' {} a -> s {domainId = a} :: DeleteFraudster)
+
+-- | The identifier of the fraudster you want to delete.
+deleteFraudster_fraudsterId :: Lens.Lens' DeleteFraudster Prelude.Text
+deleteFraudster_fraudsterId = Lens.lens (\DeleteFraudster' {fraudsterId} -> fraudsterId) (\s@DeleteFraudster' {} a -> s {fraudsterId = a} :: DeleteFraudster) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest DeleteFraudster where
+  type
+    AWSResponse DeleteFraudster =
+      DeleteFraudsterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteFraudsterResponse'
+
+instance Prelude.Hashable DeleteFraudster where
+  hashWithSalt _salt DeleteFraudster' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` fraudsterId
+
+instance Prelude.NFData DeleteFraudster where
+  rnf DeleteFraudster' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf fraudsterId
+
+instance Data.ToHeaders DeleteFraudster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DeleteFraudster" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteFraudster where
+  toJSON DeleteFraudster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("FraudsterId" Data..= fraudsterId)
+          ]
+      )
+
+instance Data.ToPath DeleteFraudster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteFraudster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteFraudsterResponse' smart constructor.
+data DeleteFraudsterResponse = DeleteFraudsterResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteFraudsterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteFraudsterResponse ::
+  DeleteFraudsterResponse
+newDeleteFraudsterResponse = DeleteFraudsterResponse'
+
+instance Prelude.NFData DeleteFraudsterResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/VoiceId/DeleteSpeaker.hs b/gen/Amazonka/VoiceId/DeleteSpeaker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DeleteSpeaker.hs
@@ -0,0 +1,150 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DeleteSpeaker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the specified speaker from Voice ID.
+module Amazonka.VoiceId.DeleteSpeaker
+  ( -- * Creating a Request
+    DeleteSpeaker (..),
+    newDeleteSpeaker,
+
+    -- * Request Lenses
+    deleteSpeaker_domainId,
+    deleteSpeaker_speakerId,
+
+    -- * Destructuring the Response
+    DeleteSpeakerResponse (..),
+    newDeleteSpeakerResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDeleteSpeaker' smart constructor.
+data DeleteSpeaker = DeleteSpeaker'
+  { -- | The identifier of the domain containing the speaker.
+    domainId :: Prelude.Text,
+    -- | The identifier of the speaker you want to delete.
+    speakerId :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSpeaker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'deleteSpeaker_domainId' - The identifier of the domain containing the speaker.
+--
+-- 'speakerId', 'deleteSpeaker_speakerId' - The identifier of the speaker you want to delete.
+newDeleteSpeaker ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'speakerId'
+  Prelude.Text ->
+  DeleteSpeaker
+newDeleteSpeaker pDomainId_ pSpeakerId_ =
+  DeleteSpeaker'
+    { domainId = pDomainId_,
+      speakerId = Data._Sensitive Lens.# pSpeakerId_
+    }
+
+-- | The identifier of the domain containing the speaker.
+deleteSpeaker_domainId :: Lens.Lens' DeleteSpeaker Prelude.Text
+deleteSpeaker_domainId = Lens.lens (\DeleteSpeaker' {domainId} -> domainId) (\s@DeleteSpeaker' {} a -> s {domainId = a} :: DeleteSpeaker)
+
+-- | The identifier of the speaker you want to delete.
+deleteSpeaker_speakerId :: Lens.Lens' DeleteSpeaker Prelude.Text
+deleteSpeaker_speakerId = Lens.lens (\DeleteSpeaker' {speakerId} -> speakerId) (\s@DeleteSpeaker' {} a -> s {speakerId = a} :: DeleteSpeaker) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest DeleteSpeaker where
+  type
+    AWSResponse DeleteSpeaker =
+      DeleteSpeakerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteSpeakerResponse'
+
+instance Prelude.Hashable DeleteSpeaker where
+  hashWithSalt _salt DeleteSpeaker' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` speakerId
+
+instance Prelude.NFData DeleteSpeaker where
+  rnf DeleteSpeaker' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf speakerId
+
+instance Data.ToHeaders DeleteSpeaker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DeleteSpeaker" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteSpeaker where
+  toJSON DeleteSpeaker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("SpeakerId" Data..= speakerId)
+          ]
+      )
+
+instance Data.ToPath DeleteSpeaker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteSpeaker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSpeakerResponse' smart constructor.
+data DeleteSpeakerResponse = DeleteSpeakerResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSpeakerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteSpeakerResponse ::
+  DeleteSpeakerResponse
+newDeleteSpeakerResponse = DeleteSpeakerResponse'
+
+instance Prelude.NFData DeleteSpeakerResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/VoiceId/DescribeDomain.hs b/gen/Amazonka/VoiceId/DescribeDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DescribeDomain.hs
@@ -0,0 +1,165 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DescribeDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified domain.
+module Amazonka.VoiceId.DescribeDomain
+  ( -- * Creating a Request
+    DescribeDomain (..),
+    newDescribeDomain,
+
+    -- * Request Lenses
+    describeDomain_domainId,
+
+    -- * Destructuring the Response
+    DescribeDomainResponse (..),
+    newDescribeDomainResponse,
+
+    -- * Response Lenses
+    describeDomainResponse_domain,
+    describeDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDescribeDomain' smart constructor.
+data DescribeDomain = DescribeDomain'
+  { -- | The identifier of the domain you are describing.
+    domainId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'describeDomain_domainId' - The identifier of the domain you are describing.
+newDescribeDomain ::
+  -- | 'domainId'
+  Prelude.Text ->
+  DescribeDomain
+newDescribeDomain pDomainId_ =
+  DescribeDomain' {domainId = pDomainId_}
+
+-- | The identifier of the domain you are describing.
+describeDomain_domainId :: Lens.Lens' DescribeDomain Prelude.Text
+describeDomain_domainId = Lens.lens (\DescribeDomain' {domainId} -> domainId) (\s@DescribeDomain' {} a -> s {domainId = a} :: DescribeDomain)
+
+instance Core.AWSRequest DescribeDomain where
+  type
+    AWSResponse DescribeDomain =
+      DescribeDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDomainResponse'
+            Prelude.<$> (x Data..?> "Domain")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDomain where
+  hashWithSalt _salt DescribeDomain' {..} =
+    _salt `Prelude.hashWithSalt` domainId
+
+instance Prelude.NFData DescribeDomain where
+  rnf DescribeDomain' {..} = Prelude.rnf domainId
+
+instance Data.ToHeaders DescribeDomain where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DescribeDomain" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDomain where
+  toJSON DescribeDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("DomainId" Data..= domainId)]
+      )
+
+instance Data.ToPath DescribeDomain where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDomainResponse' smart constructor.
+data DescribeDomainResponse = DescribeDomainResponse'
+  { -- | Information about the specified domain.
+    domain :: Prelude.Maybe Domain,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'describeDomainResponse_domain' - Information about the specified domain.
+--
+-- 'httpStatus', 'describeDomainResponse_httpStatus' - The response's http status code.
+newDescribeDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDomainResponse
+newDescribeDomainResponse pHttpStatus_ =
+  DescribeDomainResponse'
+    { domain = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the specified domain.
+describeDomainResponse_domain :: Lens.Lens' DescribeDomainResponse (Prelude.Maybe Domain)
+describeDomainResponse_domain = Lens.lens (\DescribeDomainResponse' {domain} -> domain) (\s@DescribeDomainResponse' {} a -> s {domain = a} :: DescribeDomainResponse)
+
+-- | The response's http status code.
+describeDomainResponse_httpStatus :: Lens.Lens' DescribeDomainResponse Prelude.Int
+describeDomainResponse_httpStatus = Lens.lens (\DescribeDomainResponse' {httpStatus} -> httpStatus) (\s@DescribeDomainResponse' {} a -> s {httpStatus = a} :: DescribeDomainResponse)
+
+instance Prelude.NFData DescribeDomainResponse where
+  rnf DescribeDomainResponse' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/DescribeFraudster.hs b/gen/Amazonka/VoiceId/DescribeFraudster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DescribeFraudster.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DescribeFraudster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified fraudster.
+module Amazonka.VoiceId.DescribeFraudster
+  ( -- * Creating a Request
+    DescribeFraudster (..),
+    newDescribeFraudster,
+
+    -- * Request Lenses
+    describeFraudster_domainId,
+    describeFraudster_fraudsterId,
+
+    -- * Destructuring the Response
+    DescribeFraudsterResponse (..),
+    newDescribeFraudsterResponse,
+
+    -- * Response Lenses
+    describeFraudsterResponse_fraudster,
+    describeFraudsterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDescribeFraudster' smart constructor.
+data DescribeFraudster = DescribeFraudster'
+  { -- | The identifier of the domain containing the fraudster.
+    domainId :: Prelude.Text,
+    -- | The identifier of the fraudster you are describing.
+    fraudsterId :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFraudster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'describeFraudster_domainId' - The identifier of the domain containing the fraudster.
+--
+-- 'fraudsterId', 'describeFraudster_fraudsterId' - The identifier of the fraudster you are describing.
+newDescribeFraudster ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'fraudsterId'
+  Prelude.Text ->
+  DescribeFraudster
+newDescribeFraudster pDomainId_ pFraudsterId_ =
+  DescribeFraudster'
+    { domainId = pDomainId_,
+      fraudsterId = Data._Sensitive Lens.# pFraudsterId_
+    }
+
+-- | The identifier of the domain containing the fraudster.
+describeFraudster_domainId :: Lens.Lens' DescribeFraudster Prelude.Text
+describeFraudster_domainId = Lens.lens (\DescribeFraudster' {domainId} -> domainId) (\s@DescribeFraudster' {} a -> s {domainId = a} :: DescribeFraudster)
+
+-- | The identifier of the fraudster you are describing.
+describeFraudster_fraudsterId :: Lens.Lens' DescribeFraudster Prelude.Text
+describeFraudster_fraudsterId = Lens.lens (\DescribeFraudster' {fraudsterId} -> fraudsterId) (\s@DescribeFraudster' {} a -> s {fraudsterId = a} :: DescribeFraudster) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest DescribeFraudster where
+  type
+    AWSResponse DescribeFraudster =
+      DescribeFraudsterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeFraudsterResponse'
+            Prelude.<$> (x Data..?> "Fraudster")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeFraudster where
+  hashWithSalt _salt DescribeFraudster' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` fraudsterId
+
+instance Prelude.NFData DescribeFraudster where
+  rnf DescribeFraudster' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf fraudsterId
+
+instance Data.ToHeaders DescribeFraudster where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DescribeFraudster" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeFraudster where
+  toJSON DescribeFraudster' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("FraudsterId" Data..= fraudsterId)
+          ]
+      )
+
+instance Data.ToPath DescribeFraudster where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeFraudster where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeFraudsterResponse' smart constructor.
+data DescribeFraudsterResponse = DescribeFraudsterResponse'
+  { -- | Information about the specified fraudster.
+    fraudster :: Prelude.Maybe Fraudster,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFraudsterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'fraudster', 'describeFraudsterResponse_fraudster' - Information about the specified fraudster.
+--
+-- 'httpStatus', 'describeFraudsterResponse_httpStatus' - The response's http status code.
+newDescribeFraudsterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeFraudsterResponse
+newDescribeFraudsterResponse pHttpStatus_ =
+  DescribeFraudsterResponse'
+    { fraudster =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the specified fraudster.
+describeFraudsterResponse_fraudster :: Lens.Lens' DescribeFraudsterResponse (Prelude.Maybe Fraudster)
+describeFraudsterResponse_fraudster = Lens.lens (\DescribeFraudsterResponse' {fraudster} -> fraudster) (\s@DescribeFraudsterResponse' {} a -> s {fraudster = a} :: DescribeFraudsterResponse)
+
+-- | The response's http status code.
+describeFraudsterResponse_httpStatus :: Lens.Lens' DescribeFraudsterResponse Prelude.Int
+describeFraudsterResponse_httpStatus = Lens.lens (\DescribeFraudsterResponse' {httpStatus} -> httpStatus) (\s@DescribeFraudsterResponse' {} a -> s {httpStatus = a} :: DescribeFraudsterResponse)
+
+instance Prelude.NFData DescribeFraudsterResponse where
+  rnf DescribeFraudsterResponse' {..} =
+    Prelude.rnf fraudster
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/DescribeFraudsterRegistrationJob.hs b/gen/Amazonka/VoiceId/DescribeFraudsterRegistrationJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DescribeFraudsterRegistrationJob.hs
@@ -0,0 +1,212 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DescribeFraudsterRegistrationJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified fraudster registration job.
+module Amazonka.VoiceId.DescribeFraudsterRegistrationJob
+  ( -- * Creating a Request
+    DescribeFraudsterRegistrationJob (..),
+    newDescribeFraudsterRegistrationJob,
+
+    -- * Request Lenses
+    describeFraudsterRegistrationJob_domainId,
+    describeFraudsterRegistrationJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeFraudsterRegistrationJobResponse (..),
+    newDescribeFraudsterRegistrationJobResponse,
+
+    -- * Response Lenses
+    describeFraudsterRegistrationJobResponse_job,
+    describeFraudsterRegistrationJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDescribeFraudsterRegistrationJob' smart constructor.
+data DescribeFraudsterRegistrationJob = DescribeFraudsterRegistrationJob'
+  { -- | The identifier for the domain containing the fraudster registration job.
+    domainId :: Prelude.Text,
+    -- | The identifier for the fraudster registration job you are describing.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFraudsterRegistrationJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'describeFraudsterRegistrationJob_domainId' - The identifier for the domain containing the fraudster registration job.
+--
+-- 'jobId', 'describeFraudsterRegistrationJob_jobId' - The identifier for the fraudster registration job you are describing.
+newDescribeFraudsterRegistrationJob ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeFraudsterRegistrationJob
+newDescribeFraudsterRegistrationJob
+  pDomainId_
+  pJobId_ =
+    DescribeFraudsterRegistrationJob'
+      { domainId =
+          pDomainId_,
+        jobId = pJobId_
+      }
+
+-- | The identifier for the domain containing the fraudster registration job.
+describeFraudsterRegistrationJob_domainId :: Lens.Lens' DescribeFraudsterRegistrationJob Prelude.Text
+describeFraudsterRegistrationJob_domainId = Lens.lens (\DescribeFraudsterRegistrationJob' {domainId} -> domainId) (\s@DescribeFraudsterRegistrationJob' {} a -> s {domainId = a} :: DescribeFraudsterRegistrationJob)
+
+-- | The identifier for the fraudster registration job you are describing.
+describeFraudsterRegistrationJob_jobId :: Lens.Lens' DescribeFraudsterRegistrationJob Prelude.Text
+describeFraudsterRegistrationJob_jobId = Lens.lens (\DescribeFraudsterRegistrationJob' {jobId} -> jobId) (\s@DescribeFraudsterRegistrationJob' {} a -> s {jobId = a} :: DescribeFraudsterRegistrationJob)
+
+instance
+  Core.AWSRequest
+    DescribeFraudsterRegistrationJob
+  where
+  type
+    AWSResponse DescribeFraudsterRegistrationJob =
+      DescribeFraudsterRegistrationJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeFraudsterRegistrationJobResponse'
+            Prelude.<$> (x Data..?> "Job")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeFraudsterRegistrationJob
+  where
+  hashWithSalt
+    _salt
+    DescribeFraudsterRegistrationJob' {..} =
+      _salt
+        `Prelude.hashWithSalt` domainId
+        `Prelude.hashWithSalt` jobId
+
+instance
+  Prelude.NFData
+    DescribeFraudsterRegistrationJob
+  where
+  rnf DescribeFraudsterRegistrationJob' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf jobId
+
+instance
+  Data.ToHeaders
+    DescribeFraudsterRegistrationJob
+  where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.DescribeFraudsterRegistrationJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeFraudsterRegistrationJob where
+  toJSON DescribeFraudsterRegistrationJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath DescribeFraudsterRegistrationJob where
+  toPath = Prelude.const "/"
+
+instance
+  Data.ToQuery
+    DescribeFraudsterRegistrationJob
+  where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeFraudsterRegistrationJobResponse' smart constructor.
+data DescribeFraudsterRegistrationJobResponse = DescribeFraudsterRegistrationJobResponse'
+  { -- | Contains details about the specified fraudster registration job.
+    job :: Prelude.Maybe FraudsterRegistrationJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFraudsterRegistrationJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'job', 'describeFraudsterRegistrationJobResponse_job' - Contains details about the specified fraudster registration job.
+--
+-- 'httpStatus', 'describeFraudsterRegistrationJobResponse_httpStatus' - The response's http status code.
+newDescribeFraudsterRegistrationJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeFraudsterRegistrationJobResponse
+newDescribeFraudsterRegistrationJobResponse
+  pHttpStatus_ =
+    DescribeFraudsterRegistrationJobResponse'
+      { job =
+          Prelude.Nothing,
+        httpStatus = pHttpStatus_
+      }
+
+-- | Contains details about the specified fraudster registration job.
+describeFraudsterRegistrationJobResponse_job :: Lens.Lens' DescribeFraudsterRegistrationJobResponse (Prelude.Maybe FraudsterRegistrationJob)
+describeFraudsterRegistrationJobResponse_job = Lens.lens (\DescribeFraudsterRegistrationJobResponse' {job} -> job) (\s@DescribeFraudsterRegistrationJobResponse' {} a -> s {job = a} :: DescribeFraudsterRegistrationJobResponse)
+
+-- | The response's http status code.
+describeFraudsterRegistrationJobResponse_httpStatus :: Lens.Lens' DescribeFraudsterRegistrationJobResponse Prelude.Int
+describeFraudsterRegistrationJobResponse_httpStatus = Lens.lens (\DescribeFraudsterRegistrationJobResponse' {httpStatus} -> httpStatus) (\s@DescribeFraudsterRegistrationJobResponse' {} a -> s {httpStatus = a} :: DescribeFraudsterRegistrationJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeFraudsterRegistrationJobResponse
+  where
+  rnf DescribeFraudsterRegistrationJobResponse' {..} =
+    Prelude.rnf job
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/DescribeSpeaker.hs b/gen/Amazonka/VoiceId/DescribeSpeaker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DescribeSpeaker.hs
@@ -0,0 +1,185 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DescribeSpeaker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified speaker.
+module Amazonka.VoiceId.DescribeSpeaker
+  ( -- * Creating a Request
+    DescribeSpeaker (..),
+    newDescribeSpeaker,
+
+    -- * Request Lenses
+    describeSpeaker_domainId,
+    describeSpeaker_speakerId,
+
+    -- * Destructuring the Response
+    DescribeSpeakerResponse (..),
+    newDescribeSpeakerResponse,
+
+    -- * Response Lenses
+    describeSpeakerResponse_speaker,
+    describeSpeakerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDescribeSpeaker' smart constructor.
+data DescribeSpeaker = DescribeSpeaker'
+  { -- | The identifier of the domain that contains the speaker.
+    domainId :: Prelude.Text,
+    -- | The identifier of the speaker you are describing.
+    speakerId :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpeaker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'describeSpeaker_domainId' - The identifier of the domain that contains the speaker.
+--
+-- 'speakerId', 'describeSpeaker_speakerId' - The identifier of the speaker you are describing.
+newDescribeSpeaker ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'speakerId'
+  Prelude.Text ->
+  DescribeSpeaker
+newDescribeSpeaker pDomainId_ pSpeakerId_ =
+  DescribeSpeaker'
+    { domainId = pDomainId_,
+      speakerId = Data._Sensitive Lens.# pSpeakerId_
+    }
+
+-- | The identifier of the domain that contains the speaker.
+describeSpeaker_domainId :: Lens.Lens' DescribeSpeaker Prelude.Text
+describeSpeaker_domainId = Lens.lens (\DescribeSpeaker' {domainId} -> domainId) (\s@DescribeSpeaker' {} a -> s {domainId = a} :: DescribeSpeaker)
+
+-- | The identifier of the speaker you are describing.
+describeSpeaker_speakerId :: Lens.Lens' DescribeSpeaker Prelude.Text
+describeSpeaker_speakerId = Lens.lens (\DescribeSpeaker' {speakerId} -> speakerId) (\s@DescribeSpeaker' {} a -> s {speakerId = a} :: DescribeSpeaker) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest DescribeSpeaker where
+  type
+    AWSResponse DescribeSpeaker =
+      DescribeSpeakerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSpeakerResponse'
+            Prelude.<$> (x Data..?> "Speaker")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSpeaker where
+  hashWithSalt _salt DescribeSpeaker' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` speakerId
+
+instance Prelude.NFData DescribeSpeaker where
+  rnf DescribeSpeaker' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf speakerId
+
+instance Data.ToHeaders DescribeSpeaker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.DescribeSpeaker" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSpeaker where
+  toJSON DescribeSpeaker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("SpeakerId" Data..= speakerId)
+          ]
+      )
+
+instance Data.ToPath DescribeSpeaker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSpeaker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSpeakerResponse' smart constructor.
+data DescribeSpeakerResponse = DescribeSpeakerResponse'
+  { -- | Information about the specified speaker.
+    speaker :: Prelude.Maybe Speaker,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpeakerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'speaker', 'describeSpeakerResponse_speaker' - Information about the specified speaker.
+--
+-- 'httpStatus', 'describeSpeakerResponse_httpStatus' - The response's http status code.
+newDescribeSpeakerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSpeakerResponse
+newDescribeSpeakerResponse pHttpStatus_ =
+  DescribeSpeakerResponse'
+    { speaker = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the specified speaker.
+describeSpeakerResponse_speaker :: Lens.Lens' DescribeSpeakerResponse (Prelude.Maybe Speaker)
+describeSpeakerResponse_speaker = Lens.lens (\DescribeSpeakerResponse' {speaker} -> speaker) (\s@DescribeSpeakerResponse' {} a -> s {speaker = a} :: DescribeSpeakerResponse)
+
+-- | The response's http status code.
+describeSpeakerResponse_httpStatus :: Lens.Lens' DescribeSpeakerResponse Prelude.Int
+describeSpeakerResponse_httpStatus = Lens.lens (\DescribeSpeakerResponse' {httpStatus} -> httpStatus) (\s@DescribeSpeakerResponse' {} a -> s {httpStatus = a} :: DescribeSpeakerResponse)
+
+instance Prelude.NFData DescribeSpeakerResponse where
+  rnf DescribeSpeakerResponse' {..} =
+    Prelude.rnf speaker
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/DescribeSpeakerEnrollmentJob.hs b/gen/Amazonka/VoiceId/DescribeSpeakerEnrollmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/DescribeSpeakerEnrollmentJob.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.DescribeSpeakerEnrollmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the specified speaker enrollment job.
+module Amazonka.VoiceId.DescribeSpeakerEnrollmentJob
+  ( -- * Creating a Request
+    DescribeSpeakerEnrollmentJob (..),
+    newDescribeSpeakerEnrollmentJob,
+
+    -- * Request Lenses
+    describeSpeakerEnrollmentJob_domainId,
+    describeSpeakerEnrollmentJob_jobId,
+
+    -- * Destructuring the Response
+    DescribeSpeakerEnrollmentJobResponse (..),
+    newDescribeSpeakerEnrollmentJobResponse,
+
+    -- * Response Lenses
+    describeSpeakerEnrollmentJobResponse_job,
+    describeSpeakerEnrollmentJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newDescribeSpeakerEnrollmentJob' smart constructor.
+data DescribeSpeakerEnrollmentJob = DescribeSpeakerEnrollmentJob'
+  { -- | The identifier of the domain containing the speaker enrollment job.
+    domainId :: Prelude.Text,
+    -- | The identifier of the speaker enrollment job you are describing.
+    jobId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpeakerEnrollmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'describeSpeakerEnrollmentJob_domainId' - The identifier of the domain containing the speaker enrollment job.
+--
+-- 'jobId', 'describeSpeakerEnrollmentJob_jobId' - The identifier of the speaker enrollment job you are describing.
+newDescribeSpeakerEnrollmentJob ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'jobId'
+  Prelude.Text ->
+  DescribeSpeakerEnrollmentJob
+newDescribeSpeakerEnrollmentJob pDomainId_ pJobId_ =
+  DescribeSpeakerEnrollmentJob'
+    { domainId =
+        pDomainId_,
+      jobId = pJobId_
+    }
+
+-- | The identifier of the domain containing the speaker enrollment job.
+describeSpeakerEnrollmentJob_domainId :: Lens.Lens' DescribeSpeakerEnrollmentJob Prelude.Text
+describeSpeakerEnrollmentJob_domainId = Lens.lens (\DescribeSpeakerEnrollmentJob' {domainId} -> domainId) (\s@DescribeSpeakerEnrollmentJob' {} a -> s {domainId = a} :: DescribeSpeakerEnrollmentJob)
+
+-- | The identifier of the speaker enrollment job you are describing.
+describeSpeakerEnrollmentJob_jobId :: Lens.Lens' DescribeSpeakerEnrollmentJob Prelude.Text
+describeSpeakerEnrollmentJob_jobId = Lens.lens (\DescribeSpeakerEnrollmentJob' {jobId} -> jobId) (\s@DescribeSpeakerEnrollmentJob' {} a -> s {jobId = a} :: DescribeSpeakerEnrollmentJob)
+
+instance Core.AWSRequest DescribeSpeakerEnrollmentJob where
+  type
+    AWSResponse DescribeSpeakerEnrollmentJob =
+      DescribeSpeakerEnrollmentJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSpeakerEnrollmentJobResponse'
+            Prelude.<$> (x Data..?> "Job")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeSpeakerEnrollmentJob
+  where
+  hashWithSalt _salt DescribeSpeakerEnrollmentJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` jobId
+
+instance Prelude.NFData DescribeSpeakerEnrollmentJob where
+  rnf DescribeSpeakerEnrollmentJob' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf jobId
+
+instance Data.ToHeaders DescribeSpeakerEnrollmentJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.DescribeSpeakerEnrollmentJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSpeakerEnrollmentJob where
+  toJSON DescribeSpeakerEnrollmentJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("JobId" Data..= jobId)
+          ]
+      )
+
+instance Data.ToPath DescribeSpeakerEnrollmentJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSpeakerEnrollmentJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSpeakerEnrollmentJobResponse' smart constructor.
+data DescribeSpeakerEnrollmentJobResponse = DescribeSpeakerEnrollmentJobResponse'
+  { -- | Contains details about the specified speaker enrollment job.
+    job :: Prelude.Maybe SpeakerEnrollmentJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSpeakerEnrollmentJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'job', 'describeSpeakerEnrollmentJobResponse_job' - Contains details about the specified speaker enrollment job.
+--
+-- 'httpStatus', 'describeSpeakerEnrollmentJobResponse_httpStatus' - The response's http status code.
+newDescribeSpeakerEnrollmentJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSpeakerEnrollmentJobResponse
+newDescribeSpeakerEnrollmentJobResponse pHttpStatus_ =
+  DescribeSpeakerEnrollmentJobResponse'
+    { job =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Contains details about the specified speaker enrollment job.
+describeSpeakerEnrollmentJobResponse_job :: Lens.Lens' DescribeSpeakerEnrollmentJobResponse (Prelude.Maybe SpeakerEnrollmentJob)
+describeSpeakerEnrollmentJobResponse_job = Lens.lens (\DescribeSpeakerEnrollmentJobResponse' {job} -> job) (\s@DescribeSpeakerEnrollmentJobResponse' {} a -> s {job = a} :: DescribeSpeakerEnrollmentJobResponse)
+
+-- | The response's http status code.
+describeSpeakerEnrollmentJobResponse_httpStatus :: Lens.Lens' DescribeSpeakerEnrollmentJobResponse Prelude.Int
+describeSpeakerEnrollmentJobResponse_httpStatus = Lens.lens (\DescribeSpeakerEnrollmentJobResponse' {httpStatus} -> httpStatus) (\s@DescribeSpeakerEnrollmentJobResponse' {} a -> s {httpStatus = a} :: DescribeSpeakerEnrollmentJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeSpeakerEnrollmentJobResponse
+  where
+  rnf DescribeSpeakerEnrollmentJobResponse' {..} =
+    Prelude.rnf job
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/EvaluateSession.hs b/gen/Amazonka/VoiceId/EvaluateSession.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/EvaluateSession.hs
@@ -0,0 +1,281 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.EvaluateSession
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Evaluates a specified session based on audio data accumulated during a
+-- streaming Amazon Connect Voice ID call.
+module Amazonka.VoiceId.EvaluateSession
+  ( -- * Creating a Request
+    EvaluateSession (..),
+    newEvaluateSession,
+
+    -- * Request Lenses
+    evaluateSession_domainId,
+    evaluateSession_sessionNameOrId,
+
+    -- * Destructuring the Response
+    EvaluateSessionResponse (..),
+    newEvaluateSessionResponse,
+
+    -- * Response Lenses
+    evaluateSessionResponse_authenticationResult,
+    evaluateSessionResponse_domainId,
+    evaluateSessionResponse_fraudDetectionResult,
+    evaluateSessionResponse_sessionId,
+    evaluateSessionResponse_sessionName,
+    evaluateSessionResponse_streamingStatus,
+    evaluateSessionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newEvaluateSession' smart constructor.
+data EvaluateSession = EvaluateSession'
+  { -- | The identifier of the domain where the session started.
+    domainId :: Prelude.Text,
+    -- | The session identifier, or name of the session, that you want to
+    -- evaluate. In Voice ID integration, this is the Contact-Id.
+    sessionNameOrId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EvaluateSession' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'evaluateSession_domainId' - The identifier of the domain where the session started.
+--
+-- 'sessionNameOrId', 'evaluateSession_sessionNameOrId' - The session identifier, or name of the session, that you want to
+-- evaluate. In Voice ID integration, this is the Contact-Id.
+newEvaluateSession ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'sessionNameOrId'
+  Prelude.Text ->
+  EvaluateSession
+newEvaluateSession pDomainId_ pSessionNameOrId_ =
+  EvaluateSession'
+    { domainId = pDomainId_,
+      sessionNameOrId = pSessionNameOrId_
+    }
+
+-- | The identifier of the domain where the session started.
+evaluateSession_domainId :: Lens.Lens' EvaluateSession Prelude.Text
+evaluateSession_domainId = Lens.lens (\EvaluateSession' {domainId} -> domainId) (\s@EvaluateSession' {} a -> s {domainId = a} :: EvaluateSession)
+
+-- | The session identifier, or name of the session, that you want to
+-- evaluate. In Voice ID integration, this is the Contact-Id.
+evaluateSession_sessionNameOrId :: Lens.Lens' EvaluateSession Prelude.Text
+evaluateSession_sessionNameOrId = Lens.lens (\EvaluateSession' {sessionNameOrId} -> sessionNameOrId) (\s@EvaluateSession' {} a -> s {sessionNameOrId = a} :: EvaluateSession)
+
+instance Core.AWSRequest EvaluateSession where
+  type
+    AWSResponse EvaluateSession =
+      EvaluateSessionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          EvaluateSessionResponse'
+            Prelude.<$> (x Data..?> "AuthenticationResult")
+            Prelude.<*> (x Data..?> "DomainId")
+            Prelude.<*> (x Data..?> "FraudDetectionResult")
+            Prelude.<*> (x Data..?> "SessionId")
+            Prelude.<*> (x Data..?> "SessionName")
+            Prelude.<*> (x Data..?> "StreamingStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable EvaluateSession where
+  hashWithSalt _salt EvaluateSession' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` sessionNameOrId
+
+instance Prelude.NFData EvaluateSession where
+  rnf EvaluateSession' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf sessionNameOrId
+
+instance Data.ToHeaders EvaluateSession where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.EvaluateSession" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON EvaluateSession where
+  toJSON EvaluateSession' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just
+              ("SessionNameOrId" Data..= sessionNameOrId)
+          ]
+      )
+
+instance Data.ToPath EvaluateSession where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery EvaluateSession where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newEvaluateSessionResponse' smart constructor.
+data EvaluateSessionResponse = EvaluateSessionResponse'
+  { -- | Details resulting from the authentication process, such as
+    -- authentication decision and authentication score.
+    authenticationResult :: Prelude.Maybe AuthenticationResult,
+    -- | The identifier of the domain containing the session.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | Details resulting from the fraud detection process, such as fraud
+    -- detection decision and risk score.
+    fraudDetectionResult :: Prelude.Maybe FraudDetectionResult,
+    -- | The service-generated identifier of the session.
+    sessionId :: Prelude.Maybe Prelude.Text,
+    -- | The client-provided name of the session.
+    sessionName :: Prelude.Maybe Prelude.Text,
+    -- | The current status of audio streaming for this session. This field is
+    -- useful to infer next steps when the Authentication or Fraud Detection
+    -- results are empty or the decision is @NOT_ENOUGH_SPEECH@. In this
+    -- situation, if the @StreamingStatus@ is @ONGOING\/PENDING_CONFIGURATION@,
+    -- it can mean that the client should call the API again later, after Voice
+    -- ID has enough audio to produce a result. If the decision remains
+    -- @NOT_ENOUGH_SPEECH@ even after @StreamingStatus@ is @ENDED@, it means
+    -- that the previously streamed session did not have enough speech to
+    -- perform evaluation, and a new streaming session is needed to try again.
+    streamingStatus :: Prelude.Maybe StreamingStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EvaluateSessionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'authenticationResult', 'evaluateSessionResponse_authenticationResult' - Details resulting from the authentication process, such as
+-- authentication decision and authentication score.
+--
+-- 'domainId', 'evaluateSessionResponse_domainId' - The identifier of the domain containing the session.
+--
+-- 'fraudDetectionResult', 'evaluateSessionResponse_fraudDetectionResult' - Details resulting from the fraud detection process, such as fraud
+-- detection decision and risk score.
+--
+-- 'sessionId', 'evaluateSessionResponse_sessionId' - The service-generated identifier of the session.
+--
+-- 'sessionName', 'evaluateSessionResponse_sessionName' - The client-provided name of the session.
+--
+-- 'streamingStatus', 'evaluateSessionResponse_streamingStatus' - The current status of audio streaming for this session. This field is
+-- useful to infer next steps when the Authentication or Fraud Detection
+-- results are empty or the decision is @NOT_ENOUGH_SPEECH@. In this
+-- situation, if the @StreamingStatus@ is @ONGOING\/PENDING_CONFIGURATION@,
+-- it can mean that the client should call the API again later, after Voice
+-- ID has enough audio to produce a result. If the decision remains
+-- @NOT_ENOUGH_SPEECH@ even after @StreamingStatus@ is @ENDED@, it means
+-- that the previously streamed session did not have enough speech to
+-- perform evaluation, and a new streaming session is needed to try again.
+--
+-- 'httpStatus', 'evaluateSessionResponse_httpStatus' - The response's http status code.
+newEvaluateSessionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  EvaluateSessionResponse
+newEvaluateSessionResponse pHttpStatus_ =
+  EvaluateSessionResponse'
+    { authenticationResult =
+        Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      fraudDetectionResult = Prelude.Nothing,
+      sessionId = Prelude.Nothing,
+      sessionName = Prelude.Nothing,
+      streamingStatus = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details resulting from the authentication process, such as
+-- authentication decision and authentication score.
+evaluateSessionResponse_authenticationResult :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe AuthenticationResult)
+evaluateSessionResponse_authenticationResult = Lens.lens (\EvaluateSessionResponse' {authenticationResult} -> authenticationResult) (\s@EvaluateSessionResponse' {} a -> s {authenticationResult = a} :: EvaluateSessionResponse)
+
+-- | The identifier of the domain containing the session.
+evaluateSessionResponse_domainId :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe Prelude.Text)
+evaluateSessionResponse_domainId = Lens.lens (\EvaluateSessionResponse' {domainId} -> domainId) (\s@EvaluateSessionResponse' {} a -> s {domainId = a} :: EvaluateSessionResponse)
+
+-- | Details resulting from the fraud detection process, such as fraud
+-- detection decision and risk score.
+evaluateSessionResponse_fraudDetectionResult :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe FraudDetectionResult)
+evaluateSessionResponse_fraudDetectionResult = Lens.lens (\EvaluateSessionResponse' {fraudDetectionResult} -> fraudDetectionResult) (\s@EvaluateSessionResponse' {} a -> s {fraudDetectionResult = a} :: EvaluateSessionResponse)
+
+-- | The service-generated identifier of the session.
+evaluateSessionResponse_sessionId :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe Prelude.Text)
+evaluateSessionResponse_sessionId = Lens.lens (\EvaluateSessionResponse' {sessionId} -> sessionId) (\s@EvaluateSessionResponse' {} a -> s {sessionId = a} :: EvaluateSessionResponse)
+
+-- | The client-provided name of the session.
+evaluateSessionResponse_sessionName :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe Prelude.Text)
+evaluateSessionResponse_sessionName = Lens.lens (\EvaluateSessionResponse' {sessionName} -> sessionName) (\s@EvaluateSessionResponse' {} a -> s {sessionName = a} :: EvaluateSessionResponse)
+
+-- | The current status of audio streaming for this session. This field is
+-- useful to infer next steps when the Authentication or Fraud Detection
+-- results are empty or the decision is @NOT_ENOUGH_SPEECH@. In this
+-- situation, if the @StreamingStatus@ is @ONGOING\/PENDING_CONFIGURATION@,
+-- it can mean that the client should call the API again later, after Voice
+-- ID has enough audio to produce a result. If the decision remains
+-- @NOT_ENOUGH_SPEECH@ even after @StreamingStatus@ is @ENDED@, it means
+-- that the previously streamed session did not have enough speech to
+-- perform evaluation, and a new streaming session is needed to try again.
+evaluateSessionResponse_streamingStatus :: Lens.Lens' EvaluateSessionResponse (Prelude.Maybe StreamingStatus)
+evaluateSessionResponse_streamingStatus = Lens.lens (\EvaluateSessionResponse' {streamingStatus} -> streamingStatus) (\s@EvaluateSessionResponse' {} a -> s {streamingStatus = a} :: EvaluateSessionResponse)
+
+-- | The response's http status code.
+evaluateSessionResponse_httpStatus :: Lens.Lens' EvaluateSessionResponse Prelude.Int
+evaluateSessionResponse_httpStatus = Lens.lens (\EvaluateSessionResponse' {httpStatus} -> httpStatus) (\s@EvaluateSessionResponse' {} a -> s {httpStatus = a} :: EvaluateSessionResponse)
+
+instance Prelude.NFData EvaluateSessionResponse where
+  rnf EvaluateSessionResponse' {..} =
+    Prelude.rnf authenticationResult
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf fraudDetectionResult
+      `Prelude.seq` Prelude.rnf sessionId
+      `Prelude.seq` Prelude.rnf sessionName
+      `Prelude.seq` Prelude.rnf streamingStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/Lens.hs b/gen/Amazonka/VoiceId/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Lens.hs
@@ -0,0 +1,378 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Lens
+  ( -- * Operations
+
+    -- ** CreateDomain
+    createDomain_clientToken,
+    createDomain_description,
+    createDomain_tags,
+    createDomain_name,
+    createDomain_serverSideEncryptionConfiguration,
+    createDomainResponse_domain,
+    createDomainResponse_httpStatus,
+
+    -- ** DeleteDomain
+    deleteDomain_domainId,
+
+    -- ** DeleteFraudster
+    deleteFraudster_domainId,
+    deleteFraudster_fraudsterId,
+
+    -- ** DeleteSpeaker
+    deleteSpeaker_domainId,
+    deleteSpeaker_speakerId,
+
+    -- ** DescribeDomain
+    describeDomain_domainId,
+    describeDomainResponse_domain,
+    describeDomainResponse_httpStatus,
+
+    -- ** DescribeFraudster
+    describeFraudster_domainId,
+    describeFraudster_fraudsterId,
+    describeFraudsterResponse_fraudster,
+    describeFraudsterResponse_httpStatus,
+
+    -- ** DescribeFraudsterRegistrationJob
+    describeFraudsterRegistrationJob_domainId,
+    describeFraudsterRegistrationJob_jobId,
+    describeFraudsterRegistrationJobResponse_job,
+    describeFraudsterRegistrationJobResponse_httpStatus,
+
+    -- ** DescribeSpeaker
+    describeSpeaker_domainId,
+    describeSpeaker_speakerId,
+    describeSpeakerResponse_speaker,
+    describeSpeakerResponse_httpStatus,
+
+    -- ** DescribeSpeakerEnrollmentJob
+    describeSpeakerEnrollmentJob_domainId,
+    describeSpeakerEnrollmentJob_jobId,
+    describeSpeakerEnrollmentJobResponse_job,
+    describeSpeakerEnrollmentJobResponse_httpStatus,
+
+    -- ** EvaluateSession
+    evaluateSession_domainId,
+    evaluateSession_sessionNameOrId,
+    evaluateSessionResponse_authenticationResult,
+    evaluateSessionResponse_domainId,
+    evaluateSessionResponse_fraudDetectionResult,
+    evaluateSessionResponse_sessionId,
+    evaluateSessionResponse_sessionName,
+    evaluateSessionResponse_streamingStatus,
+    evaluateSessionResponse_httpStatus,
+
+    -- ** ListDomains
+    listDomains_maxResults,
+    listDomains_nextToken,
+    listDomainsResponse_domainSummaries,
+    listDomainsResponse_nextToken,
+    listDomainsResponse_httpStatus,
+
+    -- ** ListFraudsterRegistrationJobs
+    listFraudsterRegistrationJobs_jobStatus,
+    listFraudsterRegistrationJobs_maxResults,
+    listFraudsterRegistrationJobs_nextToken,
+    listFraudsterRegistrationJobs_domainId,
+    listFraudsterRegistrationJobsResponse_jobSummaries,
+    listFraudsterRegistrationJobsResponse_nextToken,
+    listFraudsterRegistrationJobsResponse_httpStatus,
+
+    -- ** ListSpeakerEnrollmentJobs
+    listSpeakerEnrollmentJobs_jobStatus,
+    listSpeakerEnrollmentJobs_maxResults,
+    listSpeakerEnrollmentJobs_nextToken,
+    listSpeakerEnrollmentJobs_domainId,
+    listSpeakerEnrollmentJobsResponse_jobSummaries,
+    listSpeakerEnrollmentJobsResponse_nextToken,
+    listSpeakerEnrollmentJobsResponse_httpStatus,
+
+    -- ** ListSpeakers
+    listSpeakers_maxResults,
+    listSpeakers_nextToken,
+    listSpeakers_domainId,
+    listSpeakersResponse_nextToken,
+    listSpeakersResponse_speakerSummaries,
+    listSpeakersResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** OptOutSpeaker
+    optOutSpeaker_domainId,
+    optOutSpeaker_speakerId,
+    optOutSpeakerResponse_speaker,
+    optOutSpeakerResponse_httpStatus,
+
+    -- ** StartFraudsterRegistrationJob
+    startFraudsterRegistrationJob_clientToken,
+    startFraudsterRegistrationJob_jobName,
+    startFraudsterRegistrationJob_registrationConfig,
+    startFraudsterRegistrationJob_dataAccessRoleArn,
+    startFraudsterRegistrationJob_domainId,
+    startFraudsterRegistrationJob_inputDataConfig,
+    startFraudsterRegistrationJob_outputDataConfig,
+    startFraudsterRegistrationJobResponse_job,
+    startFraudsterRegistrationJobResponse_httpStatus,
+
+    -- ** StartSpeakerEnrollmentJob
+    startSpeakerEnrollmentJob_clientToken,
+    startSpeakerEnrollmentJob_enrollmentConfig,
+    startSpeakerEnrollmentJob_jobName,
+    startSpeakerEnrollmentJob_dataAccessRoleArn,
+    startSpeakerEnrollmentJob_domainId,
+    startSpeakerEnrollmentJob_inputDataConfig,
+    startSpeakerEnrollmentJob_outputDataConfig,
+    startSpeakerEnrollmentJobResponse_job,
+    startSpeakerEnrollmentJobResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateDomain
+    updateDomain_description,
+    updateDomain_domainId,
+    updateDomain_name,
+    updateDomain_serverSideEncryptionConfiguration,
+    updateDomainResponse_domain,
+    updateDomainResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AuthenticationConfiguration
+    authenticationConfiguration_acceptanceThreshold,
+
+    -- ** AuthenticationResult
+    authenticationResult_audioAggregationEndedAt,
+    authenticationResult_audioAggregationStartedAt,
+    authenticationResult_authenticationResultId,
+    authenticationResult_configuration,
+    authenticationResult_customerSpeakerId,
+    authenticationResult_decision,
+    authenticationResult_generatedSpeakerId,
+    authenticationResult_score,
+
+    -- ** Domain
+    domain_arn,
+    domain_createdAt,
+    domain_description,
+    domain_domainId,
+    domain_domainStatus,
+    domain_name,
+    domain_serverSideEncryptionConfiguration,
+    domain_serverSideEncryptionUpdateDetails,
+    domain_updatedAt,
+
+    -- ** DomainSummary
+    domainSummary_arn,
+    domainSummary_createdAt,
+    domainSummary_description,
+    domainSummary_domainId,
+    domainSummary_domainStatus,
+    domainSummary_name,
+    domainSummary_serverSideEncryptionConfiguration,
+    domainSummary_serverSideEncryptionUpdateDetails,
+    domainSummary_updatedAt,
+
+    -- ** EnrollmentConfig
+    enrollmentConfig_existingEnrollmentAction,
+    enrollmentConfig_fraudDetectionConfig,
+
+    -- ** EnrollmentJobFraudDetectionConfig
+    enrollmentJobFraudDetectionConfig_fraudDetectionAction,
+    enrollmentJobFraudDetectionConfig_riskThreshold,
+
+    -- ** FailureDetails
+    failureDetails_message,
+    failureDetails_statusCode,
+
+    -- ** FraudDetectionConfiguration
+    fraudDetectionConfiguration_riskThreshold,
+
+    -- ** FraudDetectionResult
+    fraudDetectionResult_audioAggregationEndedAt,
+    fraudDetectionResult_audioAggregationStartedAt,
+    fraudDetectionResult_configuration,
+    fraudDetectionResult_decision,
+    fraudDetectionResult_fraudDetectionResultId,
+    fraudDetectionResult_reasons,
+    fraudDetectionResult_riskDetails,
+
+    -- ** FraudRiskDetails
+    fraudRiskDetails_knownFraudsterRisk,
+    fraudRiskDetails_voiceSpoofingRisk,
+
+    -- ** Fraudster
+    fraudster_createdAt,
+    fraudster_domainId,
+    fraudster_generatedFraudsterId,
+
+    -- ** FraudsterRegistrationJob
+    fraudsterRegistrationJob_createdAt,
+    fraudsterRegistrationJob_dataAccessRoleArn,
+    fraudsterRegistrationJob_domainId,
+    fraudsterRegistrationJob_endedAt,
+    fraudsterRegistrationJob_failureDetails,
+    fraudsterRegistrationJob_inputDataConfig,
+    fraudsterRegistrationJob_jobId,
+    fraudsterRegistrationJob_jobName,
+    fraudsterRegistrationJob_jobProgress,
+    fraudsterRegistrationJob_jobStatus,
+    fraudsterRegistrationJob_outputDataConfig,
+    fraudsterRegistrationJob_registrationConfig,
+
+    -- ** FraudsterRegistrationJobSummary
+    fraudsterRegistrationJobSummary_createdAt,
+    fraudsterRegistrationJobSummary_domainId,
+    fraudsterRegistrationJobSummary_endedAt,
+    fraudsterRegistrationJobSummary_failureDetails,
+    fraudsterRegistrationJobSummary_jobId,
+    fraudsterRegistrationJobSummary_jobName,
+    fraudsterRegistrationJobSummary_jobProgress,
+    fraudsterRegistrationJobSummary_jobStatus,
+
+    -- ** InputDataConfig
+    inputDataConfig_s3Uri,
+
+    -- ** JobProgress
+    jobProgress_percentComplete,
+
+    -- ** KnownFraudsterRisk
+    knownFraudsterRisk_generatedFraudsterId,
+    knownFraudsterRisk_riskScore,
+
+    -- ** OutputDataConfig
+    outputDataConfig_kmsKeyId,
+    outputDataConfig_s3Uri,
+
+    -- ** RegistrationConfig
+    registrationConfig_duplicateRegistrationAction,
+    registrationConfig_fraudsterSimilarityThreshold,
+
+    -- ** ServerSideEncryptionConfiguration
+    serverSideEncryptionConfiguration_kmsKeyId,
+
+    -- ** ServerSideEncryptionUpdateDetails
+    serverSideEncryptionUpdateDetails_message,
+    serverSideEncryptionUpdateDetails_oldKmsKeyId,
+    serverSideEncryptionUpdateDetails_updateStatus,
+
+    -- ** Speaker
+    speaker_createdAt,
+    speaker_customerSpeakerId,
+    speaker_domainId,
+    speaker_generatedSpeakerId,
+    speaker_lastAccessedAt,
+    speaker_status,
+    speaker_updatedAt,
+
+    -- ** SpeakerEnrollmentJob
+    speakerEnrollmentJob_createdAt,
+    speakerEnrollmentJob_dataAccessRoleArn,
+    speakerEnrollmentJob_domainId,
+    speakerEnrollmentJob_endedAt,
+    speakerEnrollmentJob_enrollmentConfig,
+    speakerEnrollmentJob_failureDetails,
+    speakerEnrollmentJob_inputDataConfig,
+    speakerEnrollmentJob_jobId,
+    speakerEnrollmentJob_jobName,
+    speakerEnrollmentJob_jobProgress,
+    speakerEnrollmentJob_jobStatus,
+    speakerEnrollmentJob_outputDataConfig,
+
+    -- ** SpeakerEnrollmentJobSummary
+    speakerEnrollmentJobSummary_createdAt,
+    speakerEnrollmentJobSummary_domainId,
+    speakerEnrollmentJobSummary_endedAt,
+    speakerEnrollmentJobSummary_failureDetails,
+    speakerEnrollmentJobSummary_jobId,
+    speakerEnrollmentJobSummary_jobName,
+    speakerEnrollmentJobSummary_jobProgress,
+    speakerEnrollmentJobSummary_jobStatus,
+
+    -- ** SpeakerSummary
+    speakerSummary_createdAt,
+    speakerSummary_customerSpeakerId,
+    speakerSummary_domainId,
+    speakerSummary_generatedSpeakerId,
+    speakerSummary_lastAccessedAt,
+    speakerSummary_status,
+    speakerSummary_updatedAt,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** VoiceSpoofingRisk
+    voiceSpoofingRisk_riskScore,
+  )
+where
+
+import Amazonka.VoiceId.CreateDomain
+import Amazonka.VoiceId.DeleteDomain
+import Amazonka.VoiceId.DeleteFraudster
+import Amazonka.VoiceId.DeleteSpeaker
+import Amazonka.VoiceId.DescribeDomain
+import Amazonka.VoiceId.DescribeFraudster
+import Amazonka.VoiceId.DescribeFraudsterRegistrationJob
+import Amazonka.VoiceId.DescribeSpeaker
+import Amazonka.VoiceId.DescribeSpeakerEnrollmentJob
+import Amazonka.VoiceId.EvaluateSession
+import Amazonka.VoiceId.ListDomains
+import Amazonka.VoiceId.ListFraudsterRegistrationJobs
+import Amazonka.VoiceId.ListSpeakerEnrollmentJobs
+import Amazonka.VoiceId.ListSpeakers
+import Amazonka.VoiceId.ListTagsForResource
+import Amazonka.VoiceId.OptOutSpeaker
+import Amazonka.VoiceId.StartFraudsterRegistrationJob
+import Amazonka.VoiceId.StartSpeakerEnrollmentJob
+import Amazonka.VoiceId.TagResource
+import Amazonka.VoiceId.Types.AuthenticationConfiguration
+import Amazonka.VoiceId.Types.AuthenticationResult
+import Amazonka.VoiceId.Types.Domain
+import Amazonka.VoiceId.Types.DomainSummary
+import Amazonka.VoiceId.Types.EnrollmentConfig
+import Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.FraudDetectionConfiguration
+import Amazonka.VoiceId.Types.FraudDetectionResult
+import Amazonka.VoiceId.Types.FraudRiskDetails
+import Amazonka.VoiceId.Types.Fraudster
+import Amazonka.VoiceId.Types.FraudsterRegistrationJob
+import Amazonka.VoiceId.Types.FraudsterRegistrationJobSummary
+import Amazonka.VoiceId.Types.InputDataConfig
+import Amazonka.VoiceId.Types.JobProgress
+import Amazonka.VoiceId.Types.KnownFraudsterRisk
+import Amazonka.VoiceId.Types.OutputDataConfig
+import Amazonka.VoiceId.Types.RegistrationConfig
+import Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+import Amazonka.VoiceId.Types.Speaker
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJob
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJobSummary
+import Amazonka.VoiceId.Types.SpeakerSummary
+import Amazonka.VoiceId.Types.Tag
+import Amazonka.VoiceId.Types.VoiceSpoofingRisk
+import Amazonka.VoiceId.UntagResource
+import Amazonka.VoiceId.UpdateDomain
diff --git a/gen/Amazonka/VoiceId/ListDomains.hs b/gen/Amazonka/VoiceId/ListDomains.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/ListDomains.hs
@@ -0,0 +1,240 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.ListDomains
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the domains in the Amazon Web Services account.
+--
+-- This operation returns paginated results.
+module Amazonka.VoiceId.ListDomains
+  ( -- * Creating a Request
+    ListDomains (..),
+    newListDomains,
+
+    -- * Request Lenses
+    listDomains_maxResults,
+    listDomains_nextToken,
+
+    -- * Destructuring the Response
+    ListDomainsResponse (..),
+    newListDomainsResponse,
+
+    -- * Response Lenses
+    listDomainsResponse_domainSummaries,
+    listDomainsResponse_nextToken,
+    listDomainsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newListDomains' smart constructor.
+data ListDomains = ListDomains'
+  { -- | The maximum number of domains to list per API call.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomains' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listDomains_maxResults' - The maximum number of domains to list per API call.
+--
+-- 'nextToken', 'listDomains_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+newListDomains ::
+  ListDomains
+newListDomains =
+  ListDomains'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of domains to list per API call.
+listDomains_maxResults :: Lens.Lens' ListDomains (Prelude.Maybe Prelude.Natural)
+listDomains_maxResults = Lens.lens (\ListDomains' {maxResults} -> maxResults) (\s@ListDomains' {} a -> s {maxResults = a} :: ListDomains)
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listDomains_nextToken :: Lens.Lens' ListDomains (Prelude.Maybe Prelude.Text)
+listDomains_nextToken = Lens.lens (\ListDomains' {nextToken} -> nextToken) (\s@ListDomains' {} a -> s {nextToken = a} :: ListDomains)
+
+instance Core.AWSPager ListDomains where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDomainsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDomainsResponse_domainSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDomains_nextToken
+          Lens..~ rs
+          Lens.^? listDomainsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDomains where
+  type AWSResponse ListDomains = ListDomainsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDomainsResponse'
+            Prelude.<$> ( x
+                            Data..?> "DomainSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDomains where
+  hashWithSalt _salt ListDomains' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDomains where
+  rnf ListDomains' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDomains where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.ListDomains" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDomains where
+  toJSON ListDomains' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDomains where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDomains where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDomainsResponse' smart constructor.
+data ListDomainsResponse = ListDomainsResponse'
+  { -- | A list containing details about each domain in the Amazon Web Services
+    -- account.
+    domainSummaries :: Prelude.Maybe [DomainSummary],
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDomainsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainSummaries', 'listDomainsResponse_domainSummaries' - A list containing details about each domain in the Amazon Web Services
+-- account.
+--
+-- 'nextToken', 'listDomainsResponse_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'httpStatus', 'listDomainsResponse_httpStatus' - The response's http status code.
+newListDomainsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDomainsResponse
+newListDomainsResponse pHttpStatus_ =
+  ListDomainsResponse'
+    { domainSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list containing details about each domain in the Amazon Web Services
+-- account.
+listDomainsResponse_domainSummaries :: Lens.Lens' ListDomainsResponse (Prelude.Maybe [DomainSummary])
+listDomainsResponse_domainSummaries = Lens.lens (\ListDomainsResponse' {domainSummaries} -> domainSummaries) (\s@ListDomainsResponse' {} a -> s {domainSummaries = a} :: ListDomainsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listDomainsResponse_nextToken :: Lens.Lens' ListDomainsResponse (Prelude.Maybe Prelude.Text)
+listDomainsResponse_nextToken = Lens.lens (\ListDomainsResponse' {nextToken} -> nextToken) (\s@ListDomainsResponse' {} a -> s {nextToken = a} :: ListDomainsResponse)
+
+-- | The response's http status code.
+listDomainsResponse_httpStatus :: Lens.Lens' ListDomainsResponse Prelude.Int
+listDomainsResponse_httpStatus = Lens.lens (\ListDomainsResponse' {httpStatus} -> httpStatus) (\s@ListDomainsResponse' {} a -> s {httpStatus = a} :: ListDomainsResponse)
+
+instance Prelude.NFData ListDomainsResponse where
+  rnf ListDomainsResponse' {..} =
+    Prelude.rnf domainSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/ListFraudsterRegistrationJobs.hs b/gen/Amazonka/VoiceId/ListFraudsterRegistrationJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/ListFraudsterRegistrationJobs.hs
@@ -0,0 +1,287 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.ListFraudsterRegistrationJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the fraudster registration jobs in the domain with the given
+-- @JobStatus@. If @JobStatus@ is not provided, this lists all fraudster
+-- registration jobs in the given domain.
+--
+-- This operation returns paginated results.
+module Amazonka.VoiceId.ListFraudsterRegistrationJobs
+  ( -- * Creating a Request
+    ListFraudsterRegistrationJobs (..),
+    newListFraudsterRegistrationJobs,
+
+    -- * Request Lenses
+    listFraudsterRegistrationJobs_jobStatus,
+    listFraudsterRegistrationJobs_maxResults,
+    listFraudsterRegistrationJobs_nextToken,
+    listFraudsterRegistrationJobs_domainId,
+
+    -- * Destructuring the Response
+    ListFraudsterRegistrationJobsResponse (..),
+    newListFraudsterRegistrationJobsResponse,
+
+    -- * Response Lenses
+    listFraudsterRegistrationJobsResponse_jobSummaries,
+    listFraudsterRegistrationJobsResponse_nextToken,
+    listFraudsterRegistrationJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newListFraudsterRegistrationJobs' smart constructor.
+data ListFraudsterRegistrationJobs = ListFraudsterRegistrationJobs'
+  { -- | Provides the status of your fraudster registration job.
+    jobStatus :: Prelude.Maybe FraudsterRegistrationJobStatus,
+    -- | The maximum number of results that are returned per call. You can use
+    -- @NextToken@ to obtain further pages of results. The default is 100; the
+    -- maximum allowed page size is also 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the domain containing the fraudster registration Jobs.
+    domainId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFraudsterRegistrationJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobStatus', 'listFraudsterRegistrationJobs_jobStatus' - Provides the status of your fraudster registration job.
+--
+-- 'maxResults', 'listFraudsterRegistrationJobs_maxResults' - The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+--
+-- 'nextToken', 'listFraudsterRegistrationJobs_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'domainId', 'listFraudsterRegistrationJobs_domainId' - The identifier of the domain containing the fraudster registration Jobs.
+newListFraudsterRegistrationJobs ::
+  -- | 'domainId'
+  Prelude.Text ->
+  ListFraudsterRegistrationJobs
+newListFraudsterRegistrationJobs pDomainId_ =
+  ListFraudsterRegistrationJobs'
+    { jobStatus =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainId = pDomainId_
+    }
+
+-- | Provides the status of your fraudster registration job.
+listFraudsterRegistrationJobs_jobStatus :: Lens.Lens' ListFraudsterRegistrationJobs (Prelude.Maybe FraudsterRegistrationJobStatus)
+listFraudsterRegistrationJobs_jobStatus = Lens.lens (\ListFraudsterRegistrationJobs' {jobStatus} -> jobStatus) (\s@ListFraudsterRegistrationJobs' {} a -> s {jobStatus = a} :: ListFraudsterRegistrationJobs)
+
+-- | The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+listFraudsterRegistrationJobs_maxResults :: Lens.Lens' ListFraudsterRegistrationJobs (Prelude.Maybe Prelude.Natural)
+listFraudsterRegistrationJobs_maxResults = Lens.lens (\ListFraudsterRegistrationJobs' {maxResults} -> maxResults) (\s@ListFraudsterRegistrationJobs' {} a -> s {maxResults = a} :: ListFraudsterRegistrationJobs)
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listFraudsterRegistrationJobs_nextToken :: Lens.Lens' ListFraudsterRegistrationJobs (Prelude.Maybe Prelude.Text)
+listFraudsterRegistrationJobs_nextToken = Lens.lens (\ListFraudsterRegistrationJobs' {nextToken} -> nextToken) (\s@ListFraudsterRegistrationJobs' {} a -> s {nextToken = a} :: ListFraudsterRegistrationJobs)
+
+-- | The identifier of the domain containing the fraudster registration Jobs.
+listFraudsterRegistrationJobs_domainId :: Lens.Lens' ListFraudsterRegistrationJobs Prelude.Text
+listFraudsterRegistrationJobs_domainId = Lens.lens (\ListFraudsterRegistrationJobs' {domainId} -> domainId) (\s@ListFraudsterRegistrationJobs' {} a -> s {domainId = a} :: ListFraudsterRegistrationJobs)
+
+instance Core.AWSPager ListFraudsterRegistrationJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listFraudsterRegistrationJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listFraudsterRegistrationJobsResponse_jobSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listFraudsterRegistrationJobs_nextToken
+          Lens..~ rs
+          Lens.^? listFraudsterRegistrationJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance
+  Core.AWSRequest
+    ListFraudsterRegistrationJobs
+  where
+  type
+    AWSResponse ListFraudsterRegistrationJobs =
+      ListFraudsterRegistrationJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListFraudsterRegistrationJobsResponse'
+            Prelude.<$> (x Data..?> "JobSummaries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListFraudsterRegistrationJobs
+  where
+  hashWithSalt _salt ListFraudsterRegistrationJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobStatus
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainId
+
+instance Prelude.NFData ListFraudsterRegistrationJobs where
+  rnf ListFraudsterRegistrationJobs' {..} =
+    Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainId
+
+instance Data.ToHeaders ListFraudsterRegistrationJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.ListFraudsterRegistrationJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListFraudsterRegistrationJobs where
+  toJSON ListFraudsterRegistrationJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobStatus" Data..=) Prelude.<$> jobStatus,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("DomainId" Data..= domainId)
+          ]
+      )
+
+instance Data.ToPath ListFraudsterRegistrationJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListFraudsterRegistrationJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListFraudsterRegistrationJobsResponse' smart constructor.
+data ListFraudsterRegistrationJobsResponse = ListFraudsterRegistrationJobsResponse'
+  { -- | A list containing details about each specified fraudster registration
+    -- job.
+    jobSummaries :: Prelude.Maybe [FraudsterRegistrationJobSummary],
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFraudsterRegistrationJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobSummaries', 'listFraudsterRegistrationJobsResponse_jobSummaries' - A list containing details about each specified fraudster registration
+-- job.
+--
+-- 'nextToken', 'listFraudsterRegistrationJobsResponse_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'httpStatus', 'listFraudsterRegistrationJobsResponse_httpStatus' - The response's http status code.
+newListFraudsterRegistrationJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListFraudsterRegistrationJobsResponse
+newListFraudsterRegistrationJobsResponse pHttpStatus_ =
+  ListFraudsterRegistrationJobsResponse'
+    { jobSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list containing details about each specified fraudster registration
+-- job.
+listFraudsterRegistrationJobsResponse_jobSummaries :: Lens.Lens' ListFraudsterRegistrationJobsResponse (Prelude.Maybe [FraudsterRegistrationJobSummary])
+listFraudsterRegistrationJobsResponse_jobSummaries = Lens.lens (\ListFraudsterRegistrationJobsResponse' {jobSummaries} -> jobSummaries) (\s@ListFraudsterRegistrationJobsResponse' {} a -> s {jobSummaries = a} :: ListFraudsterRegistrationJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listFraudsterRegistrationJobsResponse_nextToken :: Lens.Lens' ListFraudsterRegistrationJobsResponse (Prelude.Maybe Prelude.Text)
+listFraudsterRegistrationJobsResponse_nextToken = Lens.lens (\ListFraudsterRegistrationJobsResponse' {nextToken} -> nextToken) (\s@ListFraudsterRegistrationJobsResponse' {} a -> s {nextToken = a} :: ListFraudsterRegistrationJobsResponse)
+
+-- | The response's http status code.
+listFraudsterRegistrationJobsResponse_httpStatus :: Lens.Lens' ListFraudsterRegistrationJobsResponse Prelude.Int
+listFraudsterRegistrationJobsResponse_httpStatus = Lens.lens (\ListFraudsterRegistrationJobsResponse' {httpStatus} -> httpStatus) (\s@ListFraudsterRegistrationJobsResponse' {} a -> s {httpStatus = a} :: ListFraudsterRegistrationJobsResponse)
+
+instance
+  Prelude.NFData
+    ListFraudsterRegistrationJobsResponse
+  where
+  rnf ListFraudsterRegistrationJobsResponse' {..} =
+    Prelude.rnf jobSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/ListSpeakerEnrollmentJobs.hs b/gen/Amazonka/VoiceId/ListSpeakerEnrollmentJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/ListSpeakerEnrollmentJobs.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.ListSpeakerEnrollmentJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all the speaker enrollment jobs in the domain with the specified
+-- @JobStatus@. If @JobStatus@ is not provided, this lists all jobs with
+-- all possible speaker enrollment job statuses.
+--
+-- This operation returns paginated results.
+module Amazonka.VoiceId.ListSpeakerEnrollmentJobs
+  ( -- * Creating a Request
+    ListSpeakerEnrollmentJobs (..),
+    newListSpeakerEnrollmentJobs,
+
+    -- * Request Lenses
+    listSpeakerEnrollmentJobs_jobStatus,
+    listSpeakerEnrollmentJobs_maxResults,
+    listSpeakerEnrollmentJobs_nextToken,
+    listSpeakerEnrollmentJobs_domainId,
+
+    -- * Destructuring the Response
+    ListSpeakerEnrollmentJobsResponse (..),
+    newListSpeakerEnrollmentJobsResponse,
+
+    -- * Response Lenses
+    listSpeakerEnrollmentJobsResponse_jobSummaries,
+    listSpeakerEnrollmentJobsResponse_nextToken,
+    listSpeakerEnrollmentJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newListSpeakerEnrollmentJobs' smart constructor.
+data ListSpeakerEnrollmentJobs = ListSpeakerEnrollmentJobs'
+  { -- | Provides the status of your speaker enrollment Job.
+    jobStatus :: Prelude.Maybe SpeakerEnrollmentJobStatus,
+    -- | The maximum number of results that are returned per call. You can use
+    -- @NextToken@ to obtain further pages of results. The default is 100; the
+    -- maximum allowed page size is also 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the domain containing the speaker enrollment jobs.
+    domainId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSpeakerEnrollmentJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobStatus', 'listSpeakerEnrollmentJobs_jobStatus' - Provides the status of your speaker enrollment Job.
+--
+-- 'maxResults', 'listSpeakerEnrollmentJobs_maxResults' - The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+--
+-- 'nextToken', 'listSpeakerEnrollmentJobs_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'domainId', 'listSpeakerEnrollmentJobs_domainId' - The identifier of the domain containing the speaker enrollment jobs.
+newListSpeakerEnrollmentJobs ::
+  -- | 'domainId'
+  Prelude.Text ->
+  ListSpeakerEnrollmentJobs
+newListSpeakerEnrollmentJobs pDomainId_ =
+  ListSpeakerEnrollmentJobs'
+    { jobStatus =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainId = pDomainId_
+    }
+
+-- | Provides the status of your speaker enrollment Job.
+listSpeakerEnrollmentJobs_jobStatus :: Lens.Lens' ListSpeakerEnrollmentJobs (Prelude.Maybe SpeakerEnrollmentJobStatus)
+listSpeakerEnrollmentJobs_jobStatus = Lens.lens (\ListSpeakerEnrollmentJobs' {jobStatus} -> jobStatus) (\s@ListSpeakerEnrollmentJobs' {} a -> s {jobStatus = a} :: ListSpeakerEnrollmentJobs)
+
+-- | The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+listSpeakerEnrollmentJobs_maxResults :: Lens.Lens' ListSpeakerEnrollmentJobs (Prelude.Maybe Prelude.Natural)
+listSpeakerEnrollmentJobs_maxResults = Lens.lens (\ListSpeakerEnrollmentJobs' {maxResults} -> maxResults) (\s@ListSpeakerEnrollmentJobs' {} a -> s {maxResults = a} :: ListSpeakerEnrollmentJobs)
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listSpeakerEnrollmentJobs_nextToken :: Lens.Lens' ListSpeakerEnrollmentJobs (Prelude.Maybe Prelude.Text)
+listSpeakerEnrollmentJobs_nextToken = Lens.lens (\ListSpeakerEnrollmentJobs' {nextToken} -> nextToken) (\s@ListSpeakerEnrollmentJobs' {} a -> s {nextToken = a} :: ListSpeakerEnrollmentJobs)
+
+-- | The identifier of the domain containing the speaker enrollment jobs.
+listSpeakerEnrollmentJobs_domainId :: Lens.Lens' ListSpeakerEnrollmentJobs Prelude.Text
+listSpeakerEnrollmentJobs_domainId = Lens.lens (\ListSpeakerEnrollmentJobs' {domainId} -> domainId) (\s@ListSpeakerEnrollmentJobs' {} a -> s {domainId = a} :: ListSpeakerEnrollmentJobs)
+
+instance Core.AWSPager ListSpeakerEnrollmentJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSpeakerEnrollmentJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSpeakerEnrollmentJobsResponse_jobSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSpeakerEnrollmentJobs_nextToken
+          Lens..~ rs
+          Lens.^? listSpeakerEnrollmentJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSpeakerEnrollmentJobs where
+  type
+    AWSResponse ListSpeakerEnrollmentJobs =
+      ListSpeakerEnrollmentJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSpeakerEnrollmentJobsResponse'
+            Prelude.<$> (x Data..?> "JobSummaries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSpeakerEnrollmentJobs where
+  hashWithSalt _salt ListSpeakerEnrollmentJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobStatus
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainId
+
+instance Prelude.NFData ListSpeakerEnrollmentJobs where
+  rnf ListSpeakerEnrollmentJobs' {..} =
+    Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainId
+
+instance Data.ToHeaders ListSpeakerEnrollmentJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.ListSpeakerEnrollmentJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSpeakerEnrollmentJobs where
+  toJSON ListSpeakerEnrollmentJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobStatus" Data..=) Prelude.<$> jobStatus,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("DomainId" Data..= domainId)
+          ]
+      )
+
+instance Data.ToPath ListSpeakerEnrollmentJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListSpeakerEnrollmentJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSpeakerEnrollmentJobsResponse' smart constructor.
+data ListSpeakerEnrollmentJobsResponse = ListSpeakerEnrollmentJobsResponse'
+  { -- | A list containing details about each specified speaker enrollment job.
+    jobSummaries :: Prelude.Maybe [SpeakerEnrollmentJobSummary],
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSpeakerEnrollmentJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'jobSummaries', 'listSpeakerEnrollmentJobsResponse_jobSummaries' - A list containing details about each specified speaker enrollment job.
+--
+-- 'nextToken', 'listSpeakerEnrollmentJobsResponse_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'httpStatus', 'listSpeakerEnrollmentJobsResponse_httpStatus' - The response's http status code.
+newListSpeakerEnrollmentJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSpeakerEnrollmentJobsResponse
+newListSpeakerEnrollmentJobsResponse pHttpStatus_ =
+  ListSpeakerEnrollmentJobsResponse'
+    { jobSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list containing details about each specified speaker enrollment job.
+listSpeakerEnrollmentJobsResponse_jobSummaries :: Lens.Lens' ListSpeakerEnrollmentJobsResponse (Prelude.Maybe [SpeakerEnrollmentJobSummary])
+listSpeakerEnrollmentJobsResponse_jobSummaries = Lens.lens (\ListSpeakerEnrollmentJobsResponse' {jobSummaries} -> jobSummaries) (\s@ListSpeakerEnrollmentJobsResponse' {} a -> s {jobSummaries = a} :: ListSpeakerEnrollmentJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listSpeakerEnrollmentJobsResponse_nextToken :: Lens.Lens' ListSpeakerEnrollmentJobsResponse (Prelude.Maybe Prelude.Text)
+listSpeakerEnrollmentJobsResponse_nextToken = Lens.lens (\ListSpeakerEnrollmentJobsResponse' {nextToken} -> nextToken) (\s@ListSpeakerEnrollmentJobsResponse' {} a -> s {nextToken = a} :: ListSpeakerEnrollmentJobsResponse)
+
+-- | The response's http status code.
+listSpeakerEnrollmentJobsResponse_httpStatus :: Lens.Lens' ListSpeakerEnrollmentJobsResponse Prelude.Int
+listSpeakerEnrollmentJobsResponse_httpStatus = Lens.lens (\ListSpeakerEnrollmentJobsResponse' {httpStatus} -> httpStatus) (\s@ListSpeakerEnrollmentJobsResponse' {} a -> s {httpStatus = a} :: ListSpeakerEnrollmentJobsResponse)
+
+instance
+  Prelude.NFData
+    ListSpeakerEnrollmentJobsResponse
+  where
+  rnf ListSpeakerEnrollmentJobsResponse' {..} =
+    Prelude.rnf jobSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/ListSpeakers.hs b/gen/Amazonka/VoiceId/ListSpeakers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/ListSpeakers.hs
@@ -0,0 +1,260 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.ListSpeakers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all speakers in a specified domain.
+--
+-- This operation returns paginated results.
+module Amazonka.VoiceId.ListSpeakers
+  ( -- * Creating a Request
+    ListSpeakers (..),
+    newListSpeakers,
+
+    -- * Request Lenses
+    listSpeakers_maxResults,
+    listSpeakers_nextToken,
+    listSpeakers_domainId,
+
+    -- * Destructuring the Response
+    ListSpeakersResponse (..),
+    newListSpeakersResponse,
+
+    -- * Response Lenses
+    listSpeakersResponse_nextToken,
+    listSpeakersResponse_speakerSummaries,
+    listSpeakersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newListSpeakers' smart constructor.
+data ListSpeakers = ListSpeakers'
+  { -- | The maximum number of results that are returned per call. You can use
+    -- @NextToken@ to obtain further pages of results. The default is 100; the
+    -- maximum allowed page size is also 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the domain.
+    domainId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSpeakers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listSpeakers_maxResults' - The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+--
+-- 'nextToken', 'listSpeakers_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'domainId', 'listSpeakers_domainId' - The identifier of the domain.
+newListSpeakers ::
+  -- | 'domainId'
+  Prelude.Text ->
+  ListSpeakers
+newListSpeakers pDomainId_ =
+  ListSpeakers'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      domainId = pDomainId_
+    }
+
+-- | The maximum number of results that are returned per call. You can use
+-- @NextToken@ to obtain further pages of results. The default is 100; the
+-- maximum allowed page size is also 100.
+listSpeakers_maxResults :: Lens.Lens' ListSpeakers (Prelude.Maybe Prelude.Natural)
+listSpeakers_maxResults = Lens.lens (\ListSpeakers' {maxResults} -> maxResults) (\s@ListSpeakers' {} a -> s {maxResults = a} :: ListSpeakers)
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listSpeakers_nextToken :: Lens.Lens' ListSpeakers (Prelude.Maybe Prelude.Text)
+listSpeakers_nextToken = Lens.lens (\ListSpeakers' {nextToken} -> nextToken) (\s@ListSpeakers' {} a -> s {nextToken = a} :: ListSpeakers)
+
+-- | The identifier of the domain.
+listSpeakers_domainId :: Lens.Lens' ListSpeakers Prelude.Text
+listSpeakers_domainId = Lens.lens (\ListSpeakers' {domainId} -> domainId) (\s@ListSpeakers' {} a -> s {domainId = a} :: ListSpeakers)
+
+instance Core.AWSPager ListSpeakers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSpeakersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSpeakersResponse_speakerSummaries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSpeakers_nextToken
+          Lens..~ rs
+          Lens.^? listSpeakersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSpeakers where
+  type AWSResponse ListSpeakers = ListSpeakersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSpeakersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "SpeakerSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSpeakers where
+  hashWithSalt _salt ListSpeakers' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` domainId
+
+instance Prelude.NFData ListSpeakers where
+  rnf ListSpeakers' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf domainId
+
+instance Data.ToHeaders ListSpeakers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.ListSpeakers" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSpeakers where
+  toJSON ListSpeakers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            Prelude.Just ("DomainId" Data..= domainId)
+          ]
+      )
+
+instance Data.ToPath ListSpeakers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListSpeakers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSpeakersResponse' smart constructor.
+data ListSpeakersResponse = ListSpeakersResponse'
+  { -- | If @NextToken@ is returned, there are more results available. The value
+    -- of @NextToken@ is a unique pagination token for each page. Make the call
+    -- again using the returned token to retrieve the next page. Keep all other
+    -- arguments unchanged. Each pagination token expires after 24 hours.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list containing details about each speaker in the Amazon Web Services
+    -- account.
+    speakerSummaries :: Prelude.Maybe [SpeakerSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSpeakersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listSpeakersResponse_nextToken' - If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+--
+-- 'speakerSummaries', 'listSpeakersResponse_speakerSummaries' - A list containing details about each speaker in the Amazon Web Services
+-- account.
+--
+-- 'httpStatus', 'listSpeakersResponse_httpStatus' - The response's http status code.
+newListSpeakersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSpeakersResponse
+newListSpeakersResponse pHttpStatus_ =
+  ListSpeakersResponse'
+    { nextToken = Prelude.Nothing,
+      speakerSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @NextToken@ is returned, there are more results available. The value
+-- of @NextToken@ is a unique pagination token for each page. Make the call
+-- again using the returned token to retrieve the next page. Keep all other
+-- arguments unchanged. Each pagination token expires after 24 hours.
+listSpeakersResponse_nextToken :: Lens.Lens' ListSpeakersResponse (Prelude.Maybe Prelude.Text)
+listSpeakersResponse_nextToken = Lens.lens (\ListSpeakersResponse' {nextToken} -> nextToken) (\s@ListSpeakersResponse' {} a -> s {nextToken = a} :: ListSpeakersResponse)
+
+-- | A list containing details about each speaker in the Amazon Web Services
+-- account.
+listSpeakersResponse_speakerSummaries :: Lens.Lens' ListSpeakersResponse (Prelude.Maybe [SpeakerSummary])
+listSpeakersResponse_speakerSummaries = Lens.lens (\ListSpeakersResponse' {speakerSummaries} -> speakerSummaries) (\s@ListSpeakersResponse' {} a -> s {speakerSummaries = a} :: ListSpeakersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSpeakersResponse_httpStatus :: Lens.Lens' ListSpeakersResponse Prelude.Int
+listSpeakersResponse_httpStatus = Lens.lens (\ListSpeakersResponse' {httpStatus} -> httpStatus) (\s@ListSpeakersResponse' {} a -> s {httpStatus = a} :: ListSpeakersResponse)
+
+instance Prelude.NFData ListSpeakersResponse where
+  rnf ListSpeakersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf speakerSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/ListTagsForResource.hs b/gen/Amazonka/VoiceId/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/ListTagsForResource.hs
@@ -0,0 +1,172 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all tags associated with a specified Voice ID resource.
+module Amazonka.VoiceId.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The Amazon Resource Name (ARN) of the Voice ID resource for which you
+    -- want to list the tags.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The Amazon Resource Name (ARN) of the Voice ID resource for which you
+-- want to list the tags.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the Voice ID resource for which you
+-- want to list the tags.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "Tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ResourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The list of tags associated with the specified resource.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The list of tags associated with the specified resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of tags associated with the specified resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/OptOutSpeaker.hs b/gen/Amazonka/VoiceId/OptOutSpeaker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/OptOutSpeaker.hs
@@ -0,0 +1,191 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.OptOutSpeaker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Opts out a speaker from Voice ID. A speaker can be opted out regardless
+-- of whether or not they already exist in Voice ID. If they don\'t yet
+-- exist, a new speaker is created in an opted out state. If they already
+-- exist, their existing status is overridden and they are opted out.
+-- Enrollment and evaluation authentication requests are rejected for opted
+-- out speakers, and opted out speakers have no voice embeddings stored in
+-- Voice ID.
+module Amazonka.VoiceId.OptOutSpeaker
+  ( -- * Creating a Request
+    OptOutSpeaker (..),
+    newOptOutSpeaker,
+
+    -- * Request Lenses
+    optOutSpeaker_domainId,
+    optOutSpeaker_speakerId,
+
+    -- * Destructuring the Response
+    OptOutSpeakerResponse (..),
+    newOptOutSpeakerResponse,
+
+    -- * Response Lenses
+    optOutSpeakerResponse_speaker,
+    optOutSpeakerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newOptOutSpeaker' smart constructor.
+data OptOutSpeaker = OptOutSpeaker'
+  { -- | The identifier of the domain containing the speaker.
+    domainId :: Prelude.Text,
+    -- | The identifier of the speaker you want opted-out.
+    speakerId :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptOutSpeaker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domainId', 'optOutSpeaker_domainId' - The identifier of the domain containing the speaker.
+--
+-- 'speakerId', 'optOutSpeaker_speakerId' - The identifier of the speaker you want opted-out.
+newOptOutSpeaker ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'speakerId'
+  Prelude.Text ->
+  OptOutSpeaker
+newOptOutSpeaker pDomainId_ pSpeakerId_ =
+  OptOutSpeaker'
+    { domainId = pDomainId_,
+      speakerId = Data._Sensitive Lens.# pSpeakerId_
+    }
+
+-- | The identifier of the domain containing the speaker.
+optOutSpeaker_domainId :: Lens.Lens' OptOutSpeaker Prelude.Text
+optOutSpeaker_domainId = Lens.lens (\OptOutSpeaker' {domainId} -> domainId) (\s@OptOutSpeaker' {} a -> s {domainId = a} :: OptOutSpeaker)
+
+-- | The identifier of the speaker you want opted-out.
+optOutSpeaker_speakerId :: Lens.Lens' OptOutSpeaker Prelude.Text
+optOutSpeaker_speakerId = Lens.lens (\OptOutSpeaker' {speakerId} -> speakerId) (\s@OptOutSpeaker' {} a -> s {speakerId = a} :: OptOutSpeaker) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest OptOutSpeaker where
+  type
+    AWSResponse OptOutSpeaker =
+      OptOutSpeakerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          OptOutSpeakerResponse'
+            Prelude.<$> (x Data..?> "Speaker")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable OptOutSpeaker where
+  hashWithSalt _salt OptOutSpeaker' {..} =
+    _salt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` speakerId
+
+instance Prelude.NFData OptOutSpeaker where
+  rnf OptOutSpeaker' {..} =
+    Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf speakerId
+
+instance Data.ToHeaders OptOutSpeaker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.OptOutSpeaker" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON OptOutSpeaker where
+  toJSON OptOutSpeaker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("SpeakerId" Data..= speakerId)
+          ]
+      )
+
+instance Data.ToPath OptOutSpeaker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery OptOutSpeaker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newOptOutSpeakerResponse' smart constructor.
+data OptOutSpeakerResponse = OptOutSpeakerResponse'
+  { -- | Details about the opted-out speaker.
+    speaker :: Prelude.Maybe Speaker,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptOutSpeakerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'speaker', 'optOutSpeakerResponse_speaker' - Details about the opted-out speaker.
+--
+-- 'httpStatus', 'optOutSpeakerResponse_httpStatus' - The response's http status code.
+newOptOutSpeakerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  OptOutSpeakerResponse
+newOptOutSpeakerResponse pHttpStatus_ =
+  OptOutSpeakerResponse'
+    { speaker = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details about the opted-out speaker.
+optOutSpeakerResponse_speaker :: Lens.Lens' OptOutSpeakerResponse (Prelude.Maybe Speaker)
+optOutSpeakerResponse_speaker = Lens.lens (\OptOutSpeakerResponse' {speaker} -> speaker) (\s@OptOutSpeakerResponse' {} a -> s {speaker = a} :: OptOutSpeakerResponse)
+
+-- | The response's http status code.
+optOutSpeakerResponse_httpStatus :: Lens.Lens' OptOutSpeakerResponse Prelude.Int
+optOutSpeakerResponse_httpStatus = Lens.lens (\OptOutSpeakerResponse' {httpStatus} -> httpStatus) (\s@OptOutSpeakerResponse' {} a -> s {httpStatus = a} :: OptOutSpeakerResponse)
+
+instance Prelude.NFData OptOutSpeakerResponse where
+  rnf OptOutSpeakerResponse' {..} =
+    Prelude.rnf speaker
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/StartFraudsterRegistrationJob.hs b/gen/Amazonka/VoiceId/StartFraudsterRegistrationJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/StartFraudsterRegistrationJob.hs
@@ -0,0 +1,308 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.StartFraudsterRegistrationJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a new batch fraudster registration job using provided details.
+module Amazonka.VoiceId.StartFraudsterRegistrationJob
+  ( -- * Creating a Request
+    StartFraudsterRegistrationJob (..),
+    newStartFraudsterRegistrationJob,
+
+    -- * Request Lenses
+    startFraudsterRegistrationJob_clientToken,
+    startFraudsterRegistrationJob_jobName,
+    startFraudsterRegistrationJob_registrationConfig,
+    startFraudsterRegistrationJob_dataAccessRoleArn,
+    startFraudsterRegistrationJob_domainId,
+    startFraudsterRegistrationJob_inputDataConfig,
+    startFraudsterRegistrationJob_outputDataConfig,
+
+    -- * Destructuring the Response
+    StartFraudsterRegistrationJobResponse (..),
+    newStartFraudsterRegistrationJobResponse,
+
+    -- * Response Lenses
+    startFraudsterRegistrationJobResponse_job,
+    startFraudsterRegistrationJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newStartFraudsterRegistrationJob' smart constructor.
+data StartFraudsterRegistrationJob = StartFraudsterRegistrationJob'
+  { -- | The idempotency token for starting a new fraudster registration job. If
+    -- not provided, Amazon Web Services SDK populates this field.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the new fraudster registration job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The registration config containing details such as the action to take
+    -- when a duplicate fraudster is detected, and the similarity threshold to
+    -- use for detecting a duplicate fraudster.
+    registrationConfig :: Prelude.Maybe RegistrationConfig,
+    -- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+    -- to access customer\'s buckets to read the input manifest file and write
+    -- the Job output file. Refer to the
+    -- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-fraudster-watchlist.html Create and edit a fraudster watchlist>
+    -- documentation for the permissions needed in this role.
+    dataAccessRoleArn :: Prelude.Text,
+    -- | The identifier of the domain containing the fraudster registration job
+    -- and in which the fraudsters are registered.
+    domainId :: Prelude.Text,
+    -- | The input data config containing an S3 URI for the input manifest file
+    -- that contains the list of fraudster registration requests.
+    inputDataConfig :: InputDataConfig,
+    -- | The output data config containing the S3 location where Voice ID writes
+    -- the job output file; you must also include a KMS key ID to encrypt the
+    -- file.
+    outputDataConfig :: OutputDataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartFraudsterRegistrationJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'startFraudsterRegistrationJob_clientToken' - The idempotency token for starting a new fraudster registration job. If
+-- not provided, Amazon Web Services SDK populates this field.
+--
+-- 'jobName', 'startFraudsterRegistrationJob_jobName' - The name of the new fraudster registration job.
+--
+-- 'registrationConfig', 'startFraudsterRegistrationJob_registrationConfig' - The registration config containing details such as the action to take
+-- when a duplicate fraudster is detected, and the similarity threshold to
+-- use for detecting a duplicate fraudster.
+--
+-- 'dataAccessRoleArn', 'startFraudsterRegistrationJob_dataAccessRoleArn' - The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the Job output file. Refer to the
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-fraudster-watchlist.html Create and edit a fraudster watchlist>
+-- documentation for the permissions needed in this role.
+--
+-- 'domainId', 'startFraudsterRegistrationJob_domainId' - The identifier of the domain containing the fraudster registration job
+-- and in which the fraudsters are registered.
+--
+-- 'inputDataConfig', 'startFraudsterRegistrationJob_inputDataConfig' - The input data config containing an S3 URI for the input manifest file
+-- that contains the list of fraudster registration requests.
+--
+-- 'outputDataConfig', 'startFraudsterRegistrationJob_outputDataConfig' - The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+newStartFraudsterRegistrationJob ::
+  -- | 'dataAccessRoleArn'
+  Prelude.Text ->
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'inputDataConfig'
+  InputDataConfig ->
+  -- | 'outputDataConfig'
+  OutputDataConfig ->
+  StartFraudsterRegistrationJob
+newStartFraudsterRegistrationJob
+  pDataAccessRoleArn_
+  pDomainId_
+  pInputDataConfig_
+  pOutputDataConfig_ =
+    StartFraudsterRegistrationJob'
+      { clientToken =
+          Prelude.Nothing,
+        jobName = Prelude.Nothing,
+        registrationConfig = Prelude.Nothing,
+        dataAccessRoleArn = pDataAccessRoleArn_,
+        domainId = pDomainId_,
+        inputDataConfig = pInputDataConfig_,
+        outputDataConfig = pOutputDataConfig_
+      }
+
+-- | The idempotency token for starting a new fraudster registration job. If
+-- not provided, Amazon Web Services SDK populates this field.
+startFraudsterRegistrationJob_clientToken :: Lens.Lens' StartFraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+startFraudsterRegistrationJob_clientToken = Lens.lens (\StartFraudsterRegistrationJob' {clientToken} -> clientToken) (\s@StartFraudsterRegistrationJob' {} a -> s {clientToken = a} :: StartFraudsterRegistrationJob)
+
+-- | The name of the new fraudster registration job.
+startFraudsterRegistrationJob_jobName :: Lens.Lens' StartFraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+startFraudsterRegistrationJob_jobName = Lens.lens (\StartFraudsterRegistrationJob' {jobName} -> jobName) (\s@StartFraudsterRegistrationJob' {} a -> s {jobName = a} :: StartFraudsterRegistrationJob) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The registration config containing details such as the action to take
+-- when a duplicate fraudster is detected, and the similarity threshold to
+-- use for detecting a duplicate fraudster.
+startFraudsterRegistrationJob_registrationConfig :: Lens.Lens' StartFraudsterRegistrationJob (Prelude.Maybe RegistrationConfig)
+startFraudsterRegistrationJob_registrationConfig = Lens.lens (\StartFraudsterRegistrationJob' {registrationConfig} -> registrationConfig) (\s@StartFraudsterRegistrationJob' {} a -> s {registrationConfig = a} :: StartFraudsterRegistrationJob)
+
+-- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the Job output file. Refer to the
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-fraudster-watchlist.html Create and edit a fraudster watchlist>
+-- documentation for the permissions needed in this role.
+startFraudsterRegistrationJob_dataAccessRoleArn :: Lens.Lens' StartFraudsterRegistrationJob Prelude.Text
+startFraudsterRegistrationJob_dataAccessRoleArn = Lens.lens (\StartFraudsterRegistrationJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@StartFraudsterRegistrationJob' {} a -> s {dataAccessRoleArn = a} :: StartFraudsterRegistrationJob)
+
+-- | The identifier of the domain containing the fraudster registration job
+-- and in which the fraudsters are registered.
+startFraudsterRegistrationJob_domainId :: Lens.Lens' StartFraudsterRegistrationJob Prelude.Text
+startFraudsterRegistrationJob_domainId = Lens.lens (\StartFraudsterRegistrationJob' {domainId} -> domainId) (\s@StartFraudsterRegistrationJob' {} a -> s {domainId = a} :: StartFraudsterRegistrationJob)
+
+-- | The input data config containing an S3 URI for the input manifest file
+-- that contains the list of fraudster registration requests.
+startFraudsterRegistrationJob_inputDataConfig :: Lens.Lens' StartFraudsterRegistrationJob InputDataConfig
+startFraudsterRegistrationJob_inputDataConfig = Lens.lens (\StartFraudsterRegistrationJob' {inputDataConfig} -> inputDataConfig) (\s@StartFraudsterRegistrationJob' {} a -> s {inputDataConfig = a} :: StartFraudsterRegistrationJob)
+
+-- | The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+startFraudsterRegistrationJob_outputDataConfig :: Lens.Lens' StartFraudsterRegistrationJob OutputDataConfig
+startFraudsterRegistrationJob_outputDataConfig = Lens.lens (\StartFraudsterRegistrationJob' {outputDataConfig} -> outputDataConfig) (\s@StartFraudsterRegistrationJob' {} a -> s {outputDataConfig = a} :: StartFraudsterRegistrationJob)
+
+instance
+  Core.AWSRequest
+    StartFraudsterRegistrationJob
+  where
+  type
+    AWSResponse StartFraudsterRegistrationJob =
+      StartFraudsterRegistrationJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartFraudsterRegistrationJobResponse'
+            Prelude.<$> (x Data..?> "Job")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    StartFraudsterRegistrationJob
+  where
+  hashWithSalt _salt StartFraudsterRegistrationJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` registrationConfig
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` inputDataConfig
+      `Prelude.hashWithSalt` outputDataConfig
+
+instance Prelude.NFData StartFraudsterRegistrationJob where
+  rnf StartFraudsterRegistrationJob' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf registrationConfig
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf outputDataConfig
+
+instance Data.ToHeaders StartFraudsterRegistrationJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.StartFraudsterRegistrationJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartFraudsterRegistrationJob where
+  toJSON StartFraudsterRegistrationJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("JobName" Data..=) Prelude.<$> jobName,
+            ("RegistrationConfig" Data..=)
+              Prelude.<$> registrationConfig,
+            Prelude.Just
+              ("DataAccessRoleArn" Data..= dataAccessRoleArn),
+            Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just
+              ("InputDataConfig" Data..= inputDataConfig),
+            Prelude.Just
+              ("OutputDataConfig" Data..= outputDataConfig)
+          ]
+      )
+
+instance Data.ToPath StartFraudsterRegistrationJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartFraudsterRegistrationJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartFraudsterRegistrationJobResponse' smart constructor.
+data StartFraudsterRegistrationJobResponse = StartFraudsterRegistrationJobResponse'
+  { -- | Details about the started fraudster registration job.
+    job :: Prelude.Maybe FraudsterRegistrationJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartFraudsterRegistrationJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'job', 'startFraudsterRegistrationJobResponse_job' - Details about the started fraudster registration job.
+--
+-- 'httpStatus', 'startFraudsterRegistrationJobResponse_httpStatus' - The response's http status code.
+newStartFraudsterRegistrationJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartFraudsterRegistrationJobResponse
+newStartFraudsterRegistrationJobResponse pHttpStatus_ =
+  StartFraudsterRegistrationJobResponse'
+    { job =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details about the started fraudster registration job.
+startFraudsterRegistrationJobResponse_job :: Lens.Lens' StartFraudsterRegistrationJobResponse (Prelude.Maybe FraudsterRegistrationJob)
+startFraudsterRegistrationJobResponse_job = Lens.lens (\StartFraudsterRegistrationJobResponse' {job} -> job) (\s@StartFraudsterRegistrationJobResponse' {} a -> s {job = a} :: StartFraudsterRegistrationJobResponse)
+
+-- | The response's http status code.
+startFraudsterRegistrationJobResponse_httpStatus :: Lens.Lens' StartFraudsterRegistrationJobResponse Prelude.Int
+startFraudsterRegistrationJobResponse_httpStatus = Lens.lens (\StartFraudsterRegistrationJobResponse' {httpStatus} -> httpStatus) (\s@StartFraudsterRegistrationJobResponse' {} a -> s {httpStatus = a} :: StartFraudsterRegistrationJobResponse)
+
+instance
+  Prelude.NFData
+    StartFraudsterRegistrationJobResponse
+  where
+  rnf StartFraudsterRegistrationJobResponse' {..} =
+    Prelude.rnf job
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/StartSpeakerEnrollmentJob.hs b/gen/Amazonka/VoiceId/StartSpeakerEnrollmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/StartSpeakerEnrollmentJob.hs
@@ -0,0 +1,302 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.StartSpeakerEnrollmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a new batch speaker enrollment job using specified details.
+module Amazonka.VoiceId.StartSpeakerEnrollmentJob
+  ( -- * Creating a Request
+    StartSpeakerEnrollmentJob (..),
+    newStartSpeakerEnrollmentJob,
+
+    -- * Request Lenses
+    startSpeakerEnrollmentJob_clientToken,
+    startSpeakerEnrollmentJob_enrollmentConfig,
+    startSpeakerEnrollmentJob_jobName,
+    startSpeakerEnrollmentJob_dataAccessRoleArn,
+    startSpeakerEnrollmentJob_domainId,
+    startSpeakerEnrollmentJob_inputDataConfig,
+    startSpeakerEnrollmentJob_outputDataConfig,
+
+    -- * Destructuring the Response
+    StartSpeakerEnrollmentJobResponse (..),
+    newStartSpeakerEnrollmentJobResponse,
+
+    -- * Response Lenses
+    startSpeakerEnrollmentJobResponse_job,
+    startSpeakerEnrollmentJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newStartSpeakerEnrollmentJob' smart constructor.
+data StartSpeakerEnrollmentJob = StartSpeakerEnrollmentJob'
+  { -- | The idempotency token for starting a new speaker enrollment Job. If not
+    -- provided, Amazon Web Services SDK populates this field.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The enrollment config that contains details such as the action to take
+    -- when a speaker is already enrolled in Voice ID or when a speaker is
+    -- identified as a fraudster.
+    enrollmentConfig :: Prelude.Maybe EnrollmentConfig,
+    -- | A name for your speaker enrollment job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+    -- to access customer\'s buckets to read the input manifest file and write
+    -- the job output file. Refer to
+    -- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-batch-enrollment.html Batch enrollment using audio data from prior calls>
+    -- for the permissions needed in this role.
+    dataAccessRoleArn :: Prelude.Text,
+    -- | The identifier of the domain that contains the speaker enrollment job
+    -- and in which the speakers are enrolled.
+    domainId :: Prelude.Text,
+    -- | The input data config containing the S3 location for the input manifest
+    -- file that contains the list of speaker enrollment requests.
+    inputDataConfig :: InputDataConfig,
+    -- | The output data config containing the S3 location where Voice ID writes
+    -- the job output file; you must also include a KMS key ID to encrypt the
+    -- file.
+    outputDataConfig :: OutputDataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartSpeakerEnrollmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'clientToken', 'startSpeakerEnrollmentJob_clientToken' - The idempotency token for starting a new speaker enrollment Job. If not
+-- provided, Amazon Web Services SDK populates this field.
+--
+-- 'enrollmentConfig', 'startSpeakerEnrollmentJob_enrollmentConfig' - The enrollment config that contains details such as the action to take
+-- when a speaker is already enrolled in Voice ID or when a speaker is
+-- identified as a fraudster.
+--
+-- 'jobName', 'startSpeakerEnrollmentJob_jobName' - A name for your speaker enrollment job.
+--
+-- 'dataAccessRoleArn', 'startSpeakerEnrollmentJob_dataAccessRoleArn' - The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-batch-enrollment.html Batch enrollment using audio data from prior calls>
+-- for the permissions needed in this role.
+--
+-- 'domainId', 'startSpeakerEnrollmentJob_domainId' - The identifier of the domain that contains the speaker enrollment job
+-- and in which the speakers are enrolled.
+--
+-- 'inputDataConfig', 'startSpeakerEnrollmentJob_inputDataConfig' - The input data config containing the S3 location for the input manifest
+-- file that contains the list of speaker enrollment requests.
+--
+-- 'outputDataConfig', 'startSpeakerEnrollmentJob_outputDataConfig' - The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+newStartSpeakerEnrollmentJob ::
+  -- | 'dataAccessRoleArn'
+  Prelude.Text ->
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'inputDataConfig'
+  InputDataConfig ->
+  -- | 'outputDataConfig'
+  OutputDataConfig ->
+  StartSpeakerEnrollmentJob
+newStartSpeakerEnrollmentJob
+  pDataAccessRoleArn_
+  pDomainId_
+  pInputDataConfig_
+  pOutputDataConfig_ =
+    StartSpeakerEnrollmentJob'
+      { clientToken =
+          Prelude.Nothing,
+        enrollmentConfig = Prelude.Nothing,
+        jobName = Prelude.Nothing,
+        dataAccessRoleArn = pDataAccessRoleArn_,
+        domainId = pDomainId_,
+        inputDataConfig = pInputDataConfig_,
+        outputDataConfig = pOutputDataConfig_
+      }
+
+-- | The idempotency token for starting a new speaker enrollment Job. If not
+-- provided, Amazon Web Services SDK populates this field.
+startSpeakerEnrollmentJob_clientToken :: Lens.Lens' StartSpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+startSpeakerEnrollmentJob_clientToken = Lens.lens (\StartSpeakerEnrollmentJob' {clientToken} -> clientToken) (\s@StartSpeakerEnrollmentJob' {} a -> s {clientToken = a} :: StartSpeakerEnrollmentJob)
+
+-- | The enrollment config that contains details such as the action to take
+-- when a speaker is already enrolled in Voice ID or when a speaker is
+-- identified as a fraudster.
+startSpeakerEnrollmentJob_enrollmentConfig :: Lens.Lens' StartSpeakerEnrollmentJob (Prelude.Maybe EnrollmentConfig)
+startSpeakerEnrollmentJob_enrollmentConfig = Lens.lens (\StartSpeakerEnrollmentJob' {enrollmentConfig} -> enrollmentConfig) (\s@StartSpeakerEnrollmentJob' {} a -> s {enrollmentConfig = a} :: StartSpeakerEnrollmentJob)
+
+-- | A name for your speaker enrollment job.
+startSpeakerEnrollmentJob_jobName :: Lens.Lens' StartSpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+startSpeakerEnrollmentJob_jobName = Lens.lens (\StartSpeakerEnrollmentJob' {jobName} -> jobName) (\s@StartSpeakerEnrollmentJob' {} a -> s {jobName = a} :: StartSpeakerEnrollmentJob) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/voiceid-batch-enrollment.html Batch enrollment using audio data from prior calls>
+-- for the permissions needed in this role.
+startSpeakerEnrollmentJob_dataAccessRoleArn :: Lens.Lens' StartSpeakerEnrollmentJob Prelude.Text
+startSpeakerEnrollmentJob_dataAccessRoleArn = Lens.lens (\StartSpeakerEnrollmentJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@StartSpeakerEnrollmentJob' {} a -> s {dataAccessRoleArn = a} :: StartSpeakerEnrollmentJob)
+
+-- | The identifier of the domain that contains the speaker enrollment job
+-- and in which the speakers are enrolled.
+startSpeakerEnrollmentJob_domainId :: Lens.Lens' StartSpeakerEnrollmentJob Prelude.Text
+startSpeakerEnrollmentJob_domainId = Lens.lens (\StartSpeakerEnrollmentJob' {domainId} -> domainId) (\s@StartSpeakerEnrollmentJob' {} a -> s {domainId = a} :: StartSpeakerEnrollmentJob)
+
+-- | The input data config containing the S3 location for the input manifest
+-- file that contains the list of speaker enrollment requests.
+startSpeakerEnrollmentJob_inputDataConfig :: Lens.Lens' StartSpeakerEnrollmentJob InputDataConfig
+startSpeakerEnrollmentJob_inputDataConfig = Lens.lens (\StartSpeakerEnrollmentJob' {inputDataConfig} -> inputDataConfig) (\s@StartSpeakerEnrollmentJob' {} a -> s {inputDataConfig = a} :: StartSpeakerEnrollmentJob)
+
+-- | The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+startSpeakerEnrollmentJob_outputDataConfig :: Lens.Lens' StartSpeakerEnrollmentJob OutputDataConfig
+startSpeakerEnrollmentJob_outputDataConfig = Lens.lens (\StartSpeakerEnrollmentJob' {outputDataConfig} -> outputDataConfig) (\s@StartSpeakerEnrollmentJob' {} a -> s {outputDataConfig = a} :: StartSpeakerEnrollmentJob)
+
+instance Core.AWSRequest StartSpeakerEnrollmentJob where
+  type
+    AWSResponse StartSpeakerEnrollmentJob =
+      StartSpeakerEnrollmentJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartSpeakerEnrollmentJobResponse'
+            Prelude.<$> (x Data..?> "Job")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartSpeakerEnrollmentJob where
+  hashWithSalt _salt StartSpeakerEnrollmentJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` enrollmentConfig
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` inputDataConfig
+      `Prelude.hashWithSalt` outputDataConfig
+
+instance Prelude.NFData StartSpeakerEnrollmentJob where
+  rnf StartSpeakerEnrollmentJob' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf enrollmentConfig
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf outputDataConfig
+
+instance Data.ToHeaders StartSpeakerEnrollmentJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "VoiceID.StartSpeakerEnrollmentJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartSpeakerEnrollmentJob where
+  toJSON StartSpeakerEnrollmentJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ClientToken" Data..=) Prelude.<$> clientToken,
+            ("EnrollmentConfig" Data..=)
+              Prelude.<$> enrollmentConfig,
+            ("JobName" Data..=) Prelude.<$> jobName,
+            Prelude.Just
+              ("DataAccessRoleArn" Data..= dataAccessRoleArn),
+            Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just
+              ("InputDataConfig" Data..= inputDataConfig),
+            Prelude.Just
+              ("OutputDataConfig" Data..= outputDataConfig)
+          ]
+      )
+
+instance Data.ToPath StartSpeakerEnrollmentJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartSpeakerEnrollmentJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartSpeakerEnrollmentJobResponse' smart constructor.
+data StartSpeakerEnrollmentJobResponse = StartSpeakerEnrollmentJobResponse'
+  { -- | Details about the started speaker enrollment job.
+    job :: Prelude.Maybe SpeakerEnrollmentJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartSpeakerEnrollmentJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'job', 'startSpeakerEnrollmentJobResponse_job' - Details about the started speaker enrollment job.
+--
+-- 'httpStatus', 'startSpeakerEnrollmentJobResponse_httpStatus' - The response's http status code.
+newStartSpeakerEnrollmentJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartSpeakerEnrollmentJobResponse
+newStartSpeakerEnrollmentJobResponse pHttpStatus_ =
+  StartSpeakerEnrollmentJobResponse'
+    { job =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details about the started speaker enrollment job.
+startSpeakerEnrollmentJobResponse_job :: Lens.Lens' StartSpeakerEnrollmentJobResponse (Prelude.Maybe SpeakerEnrollmentJob)
+startSpeakerEnrollmentJobResponse_job = Lens.lens (\StartSpeakerEnrollmentJobResponse' {job} -> job) (\s@StartSpeakerEnrollmentJobResponse' {} a -> s {job = a} :: StartSpeakerEnrollmentJobResponse)
+
+-- | The response's http status code.
+startSpeakerEnrollmentJobResponse_httpStatus :: Lens.Lens' StartSpeakerEnrollmentJobResponse Prelude.Int
+startSpeakerEnrollmentJobResponse_httpStatus = Lens.lens (\StartSpeakerEnrollmentJobResponse' {httpStatus} -> httpStatus) (\s@StartSpeakerEnrollmentJobResponse' {} a -> s {httpStatus = a} :: StartSpeakerEnrollmentJobResponse)
+
+instance
+  Prelude.NFData
+    StartSpeakerEnrollmentJobResponse
+  where
+  rnf StartSpeakerEnrollmentJobResponse' {..} =
+    Prelude.rnf job
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/TagResource.hs b/gen/Amazonka/VoiceId/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/TagResource.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Tags a Voice ID resource with the provided list of tags.
+module Amazonka.VoiceId.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the Voice ID resource you want to tag.
+    resourceArn :: Prelude.Text,
+    -- | The list of tags to assign to the specified resource.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The Amazon Resource Name (ARN) of the Voice ID resource you want to tag.
+--
+-- 'tags', 'tagResource_tags' - The list of tags to assign to the specified resource.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the Voice ID resource you want to tag.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The list of tags to assign to the specified resource.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.TagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("Tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/Types.hs b/gen/Amazonka/VoiceId/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types.hs
@@ -0,0 +1,455 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * AuthenticationDecision
+    AuthenticationDecision (..),
+
+    -- * DomainStatus
+    DomainStatus (..),
+
+    -- * DuplicateRegistrationAction
+    DuplicateRegistrationAction (..),
+
+    -- * ExistingEnrollmentAction
+    ExistingEnrollmentAction (..),
+
+    -- * FraudDetectionAction
+    FraudDetectionAction (..),
+
+    -- * FraudDetectionDecision
+    FraudDetectionDecision (..),
+
+    -- * FraudDetectionReason
+    FraudDetectionReason (..),
+
+    -- * FraudsterRegistrationJobStatus
+    FraudsterRegistrationJobStatus (..),
+
+    -- * ServerSideEncryptionUpdateStatus
+    ServerSideEncryptionUpdateStatus (..),
+
+    -- * SpeakerEnrollmentJobStatus
+    SpeakerEnrollmentJobStatus (..),
+
+    -- * SpeakerStatus
+    SpeakerStatus (..),
+
+    -- * StreamingStatus
+    StreamingStatus (..),
+
+    -- * AuthenticationConfiguration
+    AuthenticationConfiguration (..),
+    newAuthenticationConfiguration,
+    authenticationConfiguration_acceptanceThreshold,
+
+    -- * AuthenticationResult
+    AuthenticationResult (..),
+    newAuthenticationResult,
+    authenticationResult_audioAggregationEndedAt,
+    authenticationResult_audioAggregationStartedAt,
+    authenticationResult_authenticationResultId,
+    authenticationResult_configuration,
+    authenticationResult_customerSpeakerId,
+    authenticationResult_decision,
+    authenticationResult_generatedSpeakerId,
+    authenticationResult_score,
+
+    -- * Domain
+    Domain (..),
+    newDomain,
+    domain_arn,
+    domain_createdAt,
+    domain_description,
+    domain_domainId,
+    domain_domainStatus,
+    domain_name,
+    domain_serverSideEncryptionConfiguration,
+    domain_serverSideEncryptionUpdateDetails,
+    domain_updatedAt,
+
+    -- * DomainSummary
+    DomainSummary (..),
+    newDomainSummary,
+    domainSummary_arn,
+    domainSummary_createdAt,
+    domainSummary_description,
+    domainSummary_domainId,
+    domainSummary_domainStatus,
+    domainSummary_name,
+    domainSummary_serverSideEncryptionConfiguration,
+    domainSummary_serverSideEncryptionUpdateDetails,
+    domainSummary_updatedAt,
+
+    -- * EnrollmentConfig
+    EnrollmentConfig (..),
+    newEnrollmentConfig,
+    enrollmentConfig_existingEnrollmentAction,
+    enrollmentConfig_fraudDetectionConfig,
+
+    -- * EnrollmentJobFraudDetectionConfig
+    EnrollmentJobFraudDetectionConfig (..),
+    newEnrollmentJobFraudDetectionConfig,
+    enrollmentJobFraudDetectionConfig_fraudDetectionAction,
+    enrollmentJobFraudDetectionConfig_riskThreshold,
+
+    -- * FailureDetails
+    FailureDetails (..),
+    newFailureDetails,
+    failureDetails_message,
+    failureDetails_statusCode,
+
+    -- * FraudDetectionConfiguration
+    FraudDetectionConfiguration (..),
+    newFraudDetectionConfiguration,
+    fraudDetectionConfiguration_riskThreshold,
+
+    -- * FraudDetectionResult
+    FraudDetectionResult (..),
+    newFraudDetectionResult,
+    fraudDetectionResult_audioAggregationEndedAt,
+    fraudDetectionResult_audioAggregationStartedAt,
+    fraudDetectionResult_configuration,
+    fraudDetectionResult_decision,
+    fraudDetectionResult_fraudDetectionResultId,
+    fraudDetectionResult_reasons,
+    fraudDetectionResult_riskDetails,
+
+    -- * FraudRiskDetails
+    FraudRiskDetails (..),
+    newFraudRiskDetails,
+    fraudRiskDetails_knownFraudsterRisk,
+    fraudRiskDetails_voiceSpoofingRisk,
+
+    -- * Fraudster
+    Fraudster (..),
+    newFraudster,
+    fraudster_createdAt,
+    fraudster_domainId,
+    fraudster_generatedFraudsterId,
+
+    -- * FraudsterRegistrationJob
+    FraudsterRegistrationJob (..),
+    newFraudsterRegistrationJob,
+    fraudsterRegistrationJob_createdAt,
+    fraudsterRegistrationJob_dataAccessRoleArn,
+    fraudsterRegistrationJob_domainId,
+    fraudsterRegistrationJob_endedAt,
+    fraudsterRegistrationJob_failureDetails,
+    fraudsterRegistrationJob_inputDataConfig,
+    fraudsterRegistrationJob_jobId,
+    fraudsterRegistrationJob_jobName,
+    fraudsterRegistrationJob_jobProgress,
+    fraudsterRegistrationJob_jobStatus,
+    fraudsterRegistrationJob_outputDataConfig,
+    fraudsterRegistrationJob_registrationConfig,
+
+    -- * FraudsterRegistrationJobSummary
+    FraudsterRegistrationJobSummary (..),
+    newFraudsterRegistrationJobSummary,
+    fraudsterRegistrationJobSummary_createdAt,
+    fraudsterRegistrationJobSummary_domainId,
+    fraudsterRegistrationJobSummary_endedAt,
+    fraudsterRegistrationJobSummary_failureDetails,
+    fraudsterRegistrationJobSummary_jobId,
+    fraudsterRegistrationJobSummary_jobName,
+    fraudsterRegistrationJobSummary_jobProgress,
+    fraudsterRegistrationJobSummary_jobStatus,
+
+    -- * InputDataConfig
+    InputDataConfig (..),
+    newInputDataConfig,
+    inputDataConfig_s3Uri,
+
+    -- * JobProgress
+    JobProgress (..),
+    newJobProgress,
+    jobProgress_percentComplete,
+
+    -- * KnownFraudsterRisk
+    KnownFraudsterRisk (..),
+    newKnownFraudsterRisk,
+    knownFraudsterRisk_generatedFraudsterId,
+    knownFraudsterRisk_riskScore,
+
+    -- * OutputDataConfig
+    OutputDataConfig (..),
+    newOutputDataConfig,
+    outputDataConfig_kmsKeyId,
+    outputDataConfig_s3Uri,
+
+    -- * RegistrationConfig
+    RegistrationConfig (..),
+    newRegistrationConfig,
+    registrationConfig_duplicateRegistrationAction,
+    registrationConfig_fraudsterSimilarityThreshold,
+
+    -- * ServerSideEncryptionConfiguration
+    ServerSideEncryptionConfiguration (..),
+    newServerSideEncryptionConfiguration,
+    serverSideEncryptionConfiguration_kmsKeyId,
+
+    -- * ServerSideEncryptionUpdateDetails
+    ServerSideEncryptionUpdateDetails (..),
+    newServerSideEncryptionUpdateDetails,
+    serverSideEncryptionUpdateDetails_message,
+    serverSideEncryptionUpdateDetails_oldKmsKeyId,
+    serverSideEncryptionUpdateDetails_updateStatus,
+
+    -- * Speaker
+    Speaker (..),
+    newSpeaker,
+    speaker_createdAt,
+    speaker_customerSpeakerId,
+    speaker_domainId,
+    speaker_generatedSpeakerId,
+    speaker_lastAccessedAt,
+    speaker_status,
+    speaker_updatedAt,
+
+    -- * SpeakerEnrollmentJob
+    SpeakerEnrollmentJob (..),
+    newSpeakerEnrollmentJob,
+    speakerEnrollmentJob_createdAt,
+    speakerEnrollmentJob_dataAccessRoleArn,
+    speakerEnrollmentJob_domainId,
+    speakerEnrollmentJob_endedAt,
+    speakerEnrollmentJob_enrollmentConfig,
+    speakerEnrollmentJob_failureDetails,
+    speakerEnrollmentJob_inputDataConfig,
+    speakerEnrollmentJob_jobId,
+    speakerEnrollmentJob_jobName,
+    speakerEnrollmentJob_jobProgress,
+    speakerEnrollmentJob_jobStatus,
+    speakerEnrollmentJob_outputDataConfig,
+
+    -- * SpeakerEnrollmentJobSummary
+    SpeakerEnrollmentJobSummary (..),
+    newSpeakerEnrollmentJobSummary,
+    speakerEnrollmentJobSummary_createdAt,
+    speakerEnrollmentJobSummary_domainId,
+    speakerEnrollmentJobSummary_endedAt,
+    speakerEnrollmentJobSummary_failureDetails,
+    speakerEnrollmentJobSummary_jobId,
+    speakerEnrollmentJobSummary_jobName,
+    speakerEnrollmentJobSummary_jobProgress,
+    speakerEnrollmentJobSummary_jobStatus,
+
+    -- * SpeakerSummary
+    SpeakerSummary (..),
+    newSpeakerSummary,
+    speakerSummary_createdAt,
+    speakerSummary_customerSpeakerId,
+    speakerSummary_domainId,
+    speakerSummary_generatedSpeakerId,
+    speakerSummary_lastAccessedAt,
+    speakerSummary_status,
+    speakerSummary_updatedAt,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * VoiceSpoofingRisk
+    VoiceSpoofingRisk (..),
+    newVoiceSpoofingRisk,
+    voiceSpoofingRisk_riskScore,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+import Amazonka.VoiceId.Types.AuthenticationConfiguration
+import Amazonka.VoiceId.Types.AuthenticationDecision
+import Amazonka.VoiceId.Types.AuthenticationResult
+import Amazonka.VoiceId.Types.Domain
+import Amazonka.VoiceId.Types.DomainStatus
+import Amazonka.VoiceId.Types.DomainSummary
+import Amazonka.VoiceId.Types.DuplicateRegistrationAction
+import Amazonka.VoiceId.Types.EnrollmentConfig
+import Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig
+import Amazonka.VoiceId.Types.ExistingEnrollmentAction
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.FraudDetectionAction
+import Amazonka.VoiceId.Types.FraudDetectionConfiguration
+import Amazonka.VoiceId.Types.FraudDetectionDecision
+import Amazonka.VoiceId.Types.FraudDetectionReason
+import Amazonka.VoiceId.Types.FraudDetectionResult
+import Amazonka.VoiceId.Types.FraudRiskDetails
+import Amazonka.VoiceId.Types.Fraudster
+import Amazonka.VoiceId.Types.FraudsterRegistrationJob
+import Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+import Amazonka.VoiceId.Types.FraudsterRegistrationJobSummary
+import Amazonka.VoiceId.Types.InputDataConfig
+import Amazonka.VoiceId.Types.JobProgress
+import Amazonka.VoiceId.Types.KnownFraudsterRisk
+import Amazonka.VoiceId.Types.OutputDataConfig
+import Amazonka.VoiceId.Types.RegistrationConfig
+import Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateStatus
+import Amazonka.VoiceId.Types.Speaker
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJob
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJobSummary
+import Amazonka.VoiceId.Types.SpeakerStatus
+import Amazonka.VoiceId.Types.SpeakerSummary
+import Amazonka.VoiceId.Types.StreamingStatus
+import Amazonka.VoiceId.Types.Tag
+import Amazonka.VoiceId.Types.VoiceSpoofingRisk
+
+-- | API version @2021-09-27@ of the Amazon Voice ID SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "VoiceId",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "voiceid",
+      Core.signingName = "voiceid",
+      Core.version = "2021-09-27",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "VoiceId",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | You do not have sufficient permissions to perform this action. Check the
+-- error message and try again.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+
+-- | The request failed due to a conflict. Check the @ConflictType@ and error
+-- message for more details.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | The request failed due to an unknown error on the server side.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+
+-- | The specified resource cannot be found. Check the @ResourceType@ and
+-- error message for more details.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The request exceeded the service quota. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-service-limits.html#voiceid-quotas Voice ID Service Quotas>
+-- and try your request again.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+
+-- | The request was denied due to request throttling. Please slow down your
+-- request rate. Refer to
+-- <https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-service-limits.html##voiceid-api-quotas Amazon Connect Voice ID Service API throttling quotas>
+-- and try your request again.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+
+-- | The request failed one or more validations; check the error message for
+-- more details.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
diff --git a/gen/Amazonka/VoiceId/Types/AuthenticationConfiguration.hs b/gen/Amazonka/VoiceId/Types/AuthenticationConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/AuthenticationConfiguration.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.AuthenticationConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.AuthenticationConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration used to authenticate a speaker during a session.
+--
+-- /See:/ 'newAuthenticationConfiguration' smart constructor.
+data AuthenticationConfiguration = AuthenticationConfiguration'
+  { -- | The minimum threshold needed to successfully authenticate a speaker.
+    acceptanceThreshold :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthenticationConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'acceptanceThreshold', 'authenticationConfiguration_acceptanceThreshold' - The minimum threshold needed to successfully authenticate a speaker.
+newAuthenticationConfiguration ::
+  -- | 'acceptanceThreshold'
+  Prelude.Natural ->
+  AuthenticationConfiguration
+newAuthenticationConfiguration pAcceptanceThreshold_ =
+  AuthenticationConfiguration'
+    { acceptanceThreshold =
+        pAcceptanceThreshold_
+    }
+
+-- | The minimum threshold needed to successfully authenticate a speaker.
+authenticationConfiguration_acceptanceThreshold :: Lens.Lens' AuthenticationConfiguration Prelude.Natural
+authenticationConfiguration_acceptanceThreshold = Lens.lens (\AuthenticationConfiguration' {acceptanceThreshold} -> acceptanceThreshold) (\s@AuthenticationConfiguration' {} a -> s {acceptanceThreshold = a} :: AuthenticationConfiguration)
+
+instance Data.FromJSON AuthenticationConfiguration where
+  parseJSON =
+    Data.withObject
+      "AuthenticationConfiguration"
+      ( \x ->
+          AuthenticationConfiguration'
+            Prelude.<$> (x Data..: "AcceptanceThreshold")
+      )
+
+instance Prelude.Hashable AuthenticationConfiguration where
+  hashWithSalt _salt AuthenticationConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` acceptanceThreshold
+
+instance Prelude.NFData AuthenticationConfiguration where
+  rnf AuthenticationConfiguration' {..} =
+    Prelude.rnf acceptanceThreshold
diff --git a/gen/Amazonka/VoiceId/Types/AuthenticationDecision.hs b/gen/Amazonka/VoiceId/Types/AuthenticationDecision.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/AuthenticationDecision.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.AuthenticationDecision
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.AuthenticationDecision
+  ( AuthenticationDecision
+      ( ..,
+        AuthenticationDecision_ACCEPT,
+        AuthenticationDecision_NOT_ENOUGH_SPEECH,
+        AuthenticationDecision_REJECT,
+        AuthenticationDecision_SPEAKER_EXPIRED,
+        AuthenticationDecision_SPEAKER_ID_NOT_PROVIDED,
+        AuthenticationDecision_SPEAKER_NOT_ENROLLED,
+        AuthenticationDecision_SPEAKER_OPTED_OUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype AuthenticationDecision = AuthenticationDecision'
+  { fromAuthenticationDecision ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern AuthenticationDecision_ACCEPT :: AuthenticationDecision
+pattern AuthenticationDecision_ACCEPT = AuthenticationDecision' "ACCEPT"
+
+pattern AuthenticationDecision_NOT_ENOUGH_SPEECH :: AuthenticationDecision
+pattern AuthenticationDecision_NOT_ENOUGH_SPEECH = AuthenticationDecision' "NOT_ENOUGH_SPEECH"
+
+pattern AuthenticationDecision_REJECT :: AuthenticationDecision
+pattern AuthenticationDecision_REJECT = AuthenticationDecision' "REJECT"
+
+pattern AuthenticationDecision_SPEAKER_EXPIRED :: AuthenticationDecision
+pattern AuthenticationDecision_SPEAKER_EXPIRED = AuthenticationDecision' "SPEAKER_EXPIRED"
+
+pattern AuthenticationDecision_SPEAKER_ID_NOT_PROVIDED :: AuthenticationDecision
+pattern AuthenticationDecision_SPEAKER_ID_NOT_PROVIDED = AuthenticationDecision' "SPEAKER_ID_NOT_PROVIDED"
+
+pattern AuthenticationDecision_SPEAKER_NOT_ENROLLED :: AuthenticationDecision
+pattern AuthenticationDecision_SPEAKER_NOT_ENROLLED = AuthenticationDecision' "SPEAKER_NOT_ENROLLED"
+
+pattern AuthenticationDecision_SPEAKER_OPTED_OUT :: AuthenticationDecision
+pattern AuthenticationDecision_SPEAKER_OPTED_OUT = AuthenticationDecision' "SPEAKER_OPTED_OUT"
+
+{-# COMPLETE
+  AuthenticationDecision_ACCEPT,
+  AuthenticationDecision_NOT_ENOUGH_SPEECH,
+  AuthenticationDecision_REJECT,
+  AuthenticationDecision_SPEAKER_EXPIRED,
+  AuthenticationDecision_SPEAKER_ID_NOT_PROVIDED,
+  AuthenticationDecision_SPEAKER_NOT_ENROLLED,
+  AuthenticationDecision_SPEAKER_OPTED_OUT,
+  AuthenticationDecision'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/AuthenticationResult.hs b/gen/Amazonka/VoiceId/Types/AuthenticationResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/AuthenticationResult.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.AuthenticationResult
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.AuthenticationResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.AuthenticationConfiguration
+import Amazonka.VoiceId.Types.AuthenticationDecision
+
+-- | The authentication result produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+--
+-- /See:/ 'newAuthenticationResult' smart constructor.
+data AuthenticationResult = AuthenticationResult'
+  { -- | A timestamp indicating when audio aggregation ended for this
+    -- authentication result.
+    audioAggregationEndedAt :: Prelude.Maybe Data.POSIX,
+    -- | A timestamp indicating when audio aggregation started for this
+    -- authentication result.
+    audioAggregationStartedAt :: Prelude.Maybe Data.POSIX,
+    -- | The unique identifier for this authentication result. Because there can
+    -- be multiple authentications for a given session, this field helps to
+    -- identify if the returned result is from a previous streaming activity or
+    -- a new result. Note that in absence of any new streaming activity,
+    -- @AcceptanceThreshold@ changes, or @SpeakerId@ changes, Voice ID always
+    -- returns cached Authentication Result for this API.
+    authenticationResultId :: Prelude.Maybe Prelude.Text,
+    -- | The @AuthenticationConfiguration@ used to generate this authentication
+    -- result.
+    configuration :: Prelude.Maybe AuthenticationConfiguration,
+    -- | The client-provided identifier for the speaker whose authentication
+    -- result is produced. Only present if a @SpeakerId@ is provided for the
+    -- session.
+    customerSpeakerId :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The authentication decision produced by Voice ID, processed against the
+    -- current session state and streamed audio of the speaker.
+    decision :: Prelude.Maybe AuthenticationDecision,
+    -- | The service-generated identifier for the speaker whose authentication
+    -- result is produced.
+    generatedSpeakerId :: Prelude.Maybe Prelude.Text,
+    -- | The authentication score for the speaker whose authentication result is
+    -- produced. This value is only present if the authentication decision is
+    -- either @ACCEPT@ or @REJECT@.
+    score :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AuthenticationResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'audioAggregationEndedAt', 'authenticationResult_audioAggregationEndedAt' - A timestamp indicating when audio aggregation ended for this
+-- authentication result.
+--
+-- 'audioAggregationStartedAt', 'authenticationResult_audioAggregationStartedAt' - A timestamp indicating when audio aggregation started for this
+-- authentication result.
+--
+-- 'authenticationResultId', 'authenticationResult_authenticationResultId' - The unique identifier for this authentication result. Because there can
+-- be multiple authentications for a given session, this field helps to
+-- identify if the returned result is from a previous streaming activity or
+-- a new result. Note that in absence of any new streaming activity,
+-- @AcceptanceThreshold@ changes, or @SpeakerId@ changes, Voice ID always
+-- returns cached Authentication Result for this API.
+--
+-- 'configuration', 'authenticationResult_configuration' - The @AuthenticationConfiguration@ used to generate this authentication
+-- result.
+--
+-- 'customerSpeakerId', 'authenticationResult_customerSpeakerId' - The client-provided identifier for the speaker whose authentication
+-- result is produced. Only present if a @SpeakerId@ is provided for the
+-- session.
+--
+-- 'decision', 'authenticationResult_decision' - The authentication decision produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+--
+-- 'generatedSpeakerId', 'authenticationResult_generatedSpeakerId' - The service-generated identifier for the speaker whose authentication
+-- result is produced.
+--
+-- 'score', 'authenticationResult_score' - The authentication score for the speaker whose authentication result is
+-- produced. This value is only present if the authentication decision is
+-- either @ACCEPT@ or @REJECT@.
+newAuthenticationResult ::
+  AuthenticationResult
+newAuthenticationResult =
+  AuthenticationResult'
+    { audioAggregationEndedAt =
+        Prelude.Nothing,
+      audioAggregationStartedAt = Prelude.Nothing,
+      authenticationResultId = Prelude.Nothing,
+      configuration = Prelude.Nothing,
+      customerSpeakerId = Prelude.Nothing,
+      decision = Prelude.Nothing,
+      generatedSpeakerId = Prelude.Nothing,
+      score = Prelude.Nothing
+    }
+
+-- | A timestamp indicating when audio aggregation ended for this
+-- authentication result.
+authenticationResult_audioAggregationEndedAt :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.UTCTime)
+authenticationResult_audioAggregationEndedAt = Lens.lens (\AuthenticationResult' {audioAggregationEndedAt} -> audioAggregationEndedAt) (\s@AuthenticationResult' {} a -> s {audioAggregationEndedAt = a} :: AuthenticationResult) Prelude.. Lens.mapping Data._Time
+
+-- | A timestamp indicating when audio aggregation started for this
+-- authentication result.
+authenticationResult_audioAggregationStartedAt :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.UTCTime)
+authenticationResult_audioAggregationStartedAt = Lens.lens (\AuthenticationResult' {audioAggregationStartedAt} -> audioAggregationStartedAt) (\s@AuthenticationResult' {} a -> s {audioAggregationStartedAt = a} :: AuthenticationResult) Prelude.. Lens.mapping Data._Time
+
+-- | The unique identifier for this authentication result. Because there can
+-- be multiple authentications for a given session, this field helps to
+-- identify if the returned result is from a previous streaming activity or
+-- a new result. Note that in absence of any new streaming activity,
+-- @AcceptanceThreshold@ changes, or @SpeakerId@ changes, Voice ID always
+-- returns cached Authentication Result for this API.
+authenticationResult_authenticationResultId :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.Text)
+authenticationResult_authenticationResultId = Lens.lens (\AuthenticationResult' {authenticationResultId} -> authenticationResultId) (\s@AuthenticationResult' {} a -> s {authenticationResultId = a} :: AuthenticationResult)
+
+-- | The @AuthenticationConfiguration@ used to generate this authentication
+-- result.
+authenticationResult_configuration :: Lens.Lens' AuthenticationResult (Prelude.Maybe AuthenticationConfiguration)
+authenticationResult_configuration = Lens.lens (\AuthenticationResult' {configuration} -> configuration) (\s@AuthenticationResult' {} a -> s {configuration = a} :: AuthenticationResult)
+
+-- | The client-provided identifier for the speaker whose authentication
+-- result is produced. Only present if a @SpeakerId@ is provided for the
+-- session.
+authenticationResult_customerSpeakerId :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.Text)
+authenticationResult_customerSpeakerId = Lens.lens (\AuthenticationResult' {customerSpeakerId} -> customerSpeakerId) (\s@AuthenticationResult' {} a -> s {customerSpeakerId = a} :: AuthenticationResult) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The authentication decision produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+authenticationResult_decision :: Lens.Lens' AuthenticationResult (Prelude.Maybe AuthenticationDecision)
+authenticationResult_decision = Lens.lens (\AuthenticationResult' {decision} -> decision) (\s@AuthenticationResult' {} a -> s {decision = a} :: AuthenticationResult)
+
+-- | The service-generated identifier for the speaker whose authentication
+-- result is produced.
+authenticationResult_generatedSpeakerId :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.Text)
+authenticationResult_generatedSpeakerId = Lens.lens (\AuthenticationResult' {generatedSpeakerId} -> generatedSpeakerId) (\s@AuthenticationResult' {} a -> s {generatedSpeakerId = a} :: AuthenticationResult)
+
+-- | The authentication score for the speaker whose authentication result is
+-- produced. This value is only present if the authentication decision is
+-- either @ACCEPT@ or @REJECT@.
+authenticationResult_score :: Lens.Lens' AuthenticationResult (Prelude.Maybe Prelude.Natural)
+authenticationResult_score = Lens.lens (\AuthenticationResult' {score} -> score) (\s@AuthenticationResult' {} a -> s {score = a} :: AuthenticationResult)
+
+instance Data.FromJSON AuthenticationResult where
+  parseJSON =
+    Data.withObject
+      "AuthenticationResult"
+      ( \x ->
+          AuthenticationResult'
+            Prelude.<$> (x Data..:? "AudioAggregationEndedAt")
+            Prelude.<*> (x Data..:? "AudioAggregationStartedAt")
+            Prelude.<*> (x Data..:? "AuthenticationResultId")
+            Prelude.<*> (x Data..:? "Configuration")
+            Prelude.<*> (x Data..:? "CustomerSpeakerId")
+            Prelude.<*> (x Data..:? "Decision")
+            Prelude.<*> (x Data..:? "GeneratedSpeakerId")
+            Prelude.<*> (x Data..:? "Score")
+      )
+
+instance Prelude.Hashable AuthenticationResult where
+  hashWithSalt _salt AuthenticationResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` audioAggregationEndedAt
+      `Prelude.hashWithSalt` audioAggregationStartedAt
+      `Prelude.hashWithSalt` authenticationResultId
+      `Prelude.hashWithSalt` configuration
+      `Prelude.hashWithSalt` customerSpeakerId
+      `Prelude.hashWithSalt` decision
+      `Prelude.hashWithSalt` generatedSpeakerId
+      `Prelude.hashWithSalt` score
+
+instance Prelude.NFData AuthenticationResult where
+  rnf AuthenticationResult' {..} =
+    Prelude.rnf audioAggregationEndedAt
+      `Prelude.seq` Prelude.rnf audioAggregationStartedAt
+      `Prelude.seq` Prelude.rnf authenticationResultId
+      `Prelude.seq` Prelude.rnf configuration
+      `Prelude.seq` Prelude.rnf customerSpeakerId
+      `Prelude.seq` Prelude.rnf decision
+      `Prelude.seq` Prelude.rnf generatedSpeakerId
+      `Prelude.seq` Prelude.rnf score
diff --git a/gen/Amazonka/VoiceId/Types/Domain.hs b/gen/Amazonka/VoiceId/Types/Domain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/Domain.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.Domain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.Domain where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.DomainStatus
+import Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+
+-- | Contains all the information about a domain.
+--
+-- /See:/ 'newDomain' smart constructor.
+data Domain = Domain'
+  { -- | The Amazon Resource Name (ARN) for the domain.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp at which the domain is created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The client-provided description of the domain.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The service-generated identifier for the domain.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the domain.
+    domainStatus :: Prelude.Maybe DomainStatus,
+    -- | The client-provided name for the domain.
+    name :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The server-side encryption configuration containing the KMS key
+    -- identifier you want Voice ID to use to encrypt your data.
+    serverSideEncryptionConfiguration :: Prelude.Maybe ServerSideEncryptionConfiguration,
+    -- | Details about the most recent server-side encryption configuration
+    -- update. When the server-side encryption configuration is changed,
+    -- dependency on the old KMS key is removed through an asynchronous
+    -- process. When this update is complete, the domain\'s data can only be
+    -- accessed using the new KMS key.
+    serverSideEncryptionUpdateDetails :: Prelude.Maybe ServerSideEncryptionUpdateDetails,
+    -- | The timestamp showing the domain\'s last update.
+    updatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Domain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'domain_arn' - The Amazon Resource Name (ARN) for the domain.
+--
+-- 'createdAt', 'domain_createdAt' - The timestamp at which the domain is created.
+--
+-- 'description', 'domain_description' - The client-provided description of the domain.
+--
+-- 'domainId', 'domain_domainId' - The service-generated identifier for the domain.
+--
+-- 'domainStatus', 'domain_domainStatus' - The current status of the domain.
+--
+-- 'name', 'domain_name' - The client-provided name for the domain.
+--
+-- 'serverSideEncryptionConfiguration', 'domain_serverSideEncryptionConfiguration' - The server-side encryption configuration containing the KMS key
+-- identifier you want Voice ID to use to encrypt your data.
+--
+-- 'serverSideEncryptionUpdateDetails', 'domain_serverSideEncryptionUpdateDetails' - Details about the most recent server-side encryption configuration
+-- update. When the server-side encryption configuration is changed,
+-- dependency on the old KMS key is removed through an asynchronous
+-- process. When this update is complete, the domain\'s data can only be
+-- accessed using the new KMS key.
+--
+-- 'updatedAt', 'domain_updatedAt' - The timestamp showing the domain\'s last update.
+newDomain ::
+  Domain
+newDomain =
+  Domain'
+    { arn = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      description = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      domainStatus = Prelude.Nothing,
+      name = Prelude.Nothing,
+      serverSideEncryptionConfiguration = Prelude.Nothing,
+      serverSideEncryptionUpdateDetails = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) for the domain.
+domain_arn :: Lens.Lens' Domain (Prelude.Maybe Prelude.Text)
+domain_arn = Lens.lens (\Domain' {arn} -> arn) (\s@Domain' {} a -> s {arn = a} :: Domain)
+
+-- | The timestamp at which the domain is created.
+domain_createdAt :: Lens.Lens' Domain (Prelude.Maybe Prelude.UTCTime)
+domain_createdAt = Lens.lens (\Domain' {createdAt} -> createdAt) (\s@Domain' {} a -> s {createdAt = a} :: Domain) Prelude.. Lens.mapping Data._Time
+
+-- | The client-provided description of the domain.
+domain_description :: Lens.Lens' Domain (Prelude.Maybe Prelude.Text)
+domain_description = Lens.lens (\Domain' {description} -> description) (\s@Domain' {} a -> s {description = a} :: Domain) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The service-generated identifier for the domain.
+domain_domainId :: Lens.Lens' Domain (Prelude.Maybe Prelude.Text)
+domain_domainId = Lens.lens (\Domain' {domainId} -> domainId) (\s@Domain' {} a -> s {domainId = a} :: Domain)
+
+-- | The current status of the domain.
+domain_domainStatus :: Lens.Lens' Domain (Prelude.Maybe DomainStatus)
+domain_domainStatus = Lens.lens (\Domain' {domainStatus} -> domainStatus) (\s@Domain' {} a -> s {domainStatus = a} :: Domain)
+
+-- | The client-provided name for the domain.
+domain_name :: Lens.Lens' Domain (Prelude.Maybe Prelude.Text)
+domain_name = Lens.lens (\Domain' {name} -> name) (\s@Domain' {} a -> s {name = a} :: Domain) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The server-side encryption configuration containing the KMS key
+-- identifier you want Voice ID to use to encrypt your data.
+domain_serverSideEncryptionConfiguration :: Lens.Lens' Domain (Prelude.Maybe ServerSideEncryptionConfiguration)
+domain_serverSideEncryptionConfiguration = Lens.lens (\Domain' {serverSideEncryptionConfiguration} -> serverSideEncryptionConfiguration) (\s@Domain' {} a -> s {serverSideEncryptionConfiguration = a} :: Domain)
+
+-- | Details about the most recent server-side encryption configuration
+-- update. When the server-side encryption configuration is changed,
+-- dependency on the old KMS key is removed through an asynchronous
+-- process. When this update is complete, the domain\'s data can only be
+-- accessed using the new KMS key.
+domain_serverSideEncryptionUpdateDetails :: Lens.Lens' Domain (Prelude.Maybe ServerSideEncryptionUpdateDetails)
+domain_serverSideEncryptionUpdateDetails = Lens.lens (\Domain' {serverSideEncryptionUpdateDetails} -> serverSideEncryptionUpdateDetails) (\s@Domain' {} a -> s {serverSideEncryptionUpdateDetails = a} :: Domain)
+
+-- | The timestamp showing the domain\'s last update.
+domain_updatedAt :: Lens.Lens' Domain (Prelude.Maybe Prelude.UTCTime)
+domain_updatedAt = Lens.lens (\Domain' {updatedAt} -> updatedAt) (\s@Domain' {} a -> s {updatedAt = a} :: Domain) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON Domain where
+  parseJSON =
+    Data.withObject
+      "Domain"
+      ( \x ->
+          Domain'
+            Prelude.<$> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "DomainStatus")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "ServerSideEncryptionConfiguration")
+            Prelude.<*> (x Data..:? "ServerSideEncryptionUpdateDetails")
+            Prelude.<*> (x Data..:? "UpdatedAt")
+      )
+
+instance Prelude.Hashable Domain where
+  hashWithSalt _salt Domain' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` domainStatus
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` serverSideEncryptionConfiguration
+      `Prelude.hashWithSalt` serverSideEncryptionUpdateDetails
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData Domain where
+  rnf Domain' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf domainStatus
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf serverSideEncryptionConfiguration
+      `Prelude.seq` Prelude.rnf serverSideEncryptionUpdateDetails
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/VoiceId/Types/DomainStatus.hs b/gen/Amazonka/VoiceId/Types/DomainStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/DomainStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.DomainStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.DomainStatus
+  ( DomainStatus
+      ( ..,
+        DomainStatus_ACTIVE,
+        DomainStatus_PENDING,
+        DomainStatus_SUSPENDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DomainStatus = DomainStatus'
+  { fromDomainStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DomainStatus_ACTIVE :: DomainStatus
+pattern DomainStatus_ACTIVE = DomainStatus' "ACTIVE"
+
+pattern DomainStatus_PENDING :: DomainStatus
+pattern DomainStatus_PENDING = DomainStatus' "PENDING"
+
+pattern DomainStatus_SUSPENDED :: DomainStatus
+pattern DomainStatus_SUSPENDED = DomainStatus' "SUSPENDED"
+
+{-# COMPLETE
+  DomainStatus_ACTIVE,
+  DomainStatus_PENDING,
+  DomainStatus_SUSPENDED,
+  DomainStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/DomainSummary.hs b/gen/Amazonka/VoiceId/Types/DomainSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/DomainSummary.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.DomainSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.DomainSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.DomainStatus
+import Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+
+-- | Contains a summary of information about a domain.
+--
+-- /See:/ 'newDomainSummary' smart constructor.
+data DomainSummary = DomainSummary'
+  { -- | The Amazon Resource Name (ARN) for the domain.
+    arn :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp showing when the domain is created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The client-provided description of the domain.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The service-generated identifier for the domain.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the domain.
+    domainStatus :: Prelude.Maybe DomainStatus,
+    -- | The client-provided name for the domain.
+    name :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The server-side encryption configuration containing the KMS key
+    -- identifier you want Voice ID to use to encrypt your data.
+    serverSideEncryptionConfiguration :: Prelude.Maybe ServerSideEncryptionConfiguration,
+    -- | Details about the most recent server-side encryption configuration
+    -- update. When the server-side encryption configuration is changed,
+    -- dependency on the old KMS key is removed through an asynchronous
+    -- process. When this update is complete, the domain\'s data can only be
+    -- accessed using the new KMS key.
+    serverSideEncryptionUpdateDetails :: Prelude.Maybe ServerSideEncryptionUpdateDetails,
+    -- | The timestamp showing the domain\'s last update.
+    updatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DomainSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'arn', 'domainSummary_arn' - The Amazon Resource Name (ARN) for the domain.
+--
+-- 'createdAt', 'domainSummary_createdAt' - The timestamp showing when the domain is created.
+--
+-- 'description', 'domainSummary_description' - The client-provided description of the domain.
+--
+-- 'domainId', 'domainSummary_domainId' - The service-generated identifier for the domain.
+--
+-- 'domainStatus', 'domainSummary_domainStatus' - The current status of the domain.
+--
+-- 'name', 'domainSummary_name' - The client-provided name for the domain.
+--
+-- 'serverSideEncryptionConfiguration', 'domainSummary_serverSideEncryptionConfiguration' - The server-side encryption configuration containing the KMS key
+-- identifier you want Voice ID to use to encrypt your data.
+--
+-- 'serverSideEncryptionUpdateDetails', 'domainSummary_serverSideEncryptionUpdateDetails' - Details about the most recent server-side encryption configuration
+-- update. When the server-side encryption configuration is changed,
+-- dependency on the old KMS key is removed through an asynchronous
+-- process. When this update is complete, the domain\'s data can only be
+-- accessed using the new KMS key.
+--
+-- 'updatedAt', 'domainSummary_updatedAt' - The timestamp showing the domain\'s last update.
+newDomainSummary ::
+  DomainSummary
+newDomainSummary =
+  DomainSummary'
+    { arn = Prelude.Nothing,
+      createdAt = Prelude.Nothing,
+      description = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      domainStatus = Prelude.Nothing,
+      name = Prelude.Nothing,
+      serverSideEncryptionConfiguration = Prelude.Nothing,
+      serverSideEncryptionUpdateDetails = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) for the domain.
+domainSummary_arn :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.Text)
+domainSummary_arn = Lens.lens (\DomainSummary' {arn} -> arn) (\s@DomainSummary' {} a -> s {arn = a} :: DomainSummary)
+
+-- | The timestamp showing when the domain is created.
+domainSummary_createdAt :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.UTCTime)
+domainSummary_createdAt = Lens.lens (\DomainSummary' {createdAt} -> createdAt) (\s@DomainSummary' {} a -> s {createdAt = a} :: DomainSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The client-provided description of the domain.
+domainSummary_description :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.Text)
+domainSummary_description = Lens.lens (\DomainSummary' {description} -> description) (\s@DomainSummary' {} a -> s {description = a} :: DomainSummary) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The service-generated identifier for the domain.
+domainSummary_domainId :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.Text)
+domainSummary_domainId = Lens.lens (\DomainSummary' {domainId} -> domainId) (\s@DomainSummary' {} a -> s {domainId = a} :: DomainSummary)
+
+-- | The current status of the domain.
+domainSummary_domainStatus :: Lens.Lens' DomainSummary (Prelude.Maybe DomainStatus)
+domainSummary_domainStatus = Lens.lens (\DomainSummary' {domainStatus} -> domainStatus) (\s@DomainSummary' {} a -> s {domainStatus = a} :: DomainSummary)
+
+-- | The client-provided name for the domain.
+domainSummary_name :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.Text)
+domainSummary_name = Lens.lens (\DomainSummary' {name} -> name) (\s@DomainSummary' {} a -> s {name = a} :: DomainSummary) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The server-side encryption configuration containing the KMS key
+-- identifier you want Voice ID to use to encrypt your data.
+domainSummary_serverSideEncryptionConfiguration :: Lens.Lens' DomainSummary (Prelude.Maybe ServerSideEncryptionConfiguration)
+domainSummary_serverSideEncryptionConfiguration = Lens.lens (\DomainSummary' {serverSideEncryptionConfiguration} -> serverSideEncryptionConfiguration) (\s@DomainSummary' {} a -> s {serverSideEncryptionConfiguration = a} :: DomainSummary)
+
+-- | Details about the most recent server-side encryption configuration
+-- update. When the server-side encryption configuration is changed,
+-- dependency on the old KMS key is removed through an asynchronous
+-- process. When this update is complete, the domain\'s data can only be
+-- accessed using the new KMS key.
+domainSummary_serverSideEncryptionUpdateDetails :: Lens.Lens' DomainSummary (Prelude.Maybe ServerSideEncryptionUpdateDetails)
+domainSummary_serverSideEncryptionUpdateDetails = Lens.lens (\DomainSummary' {serverSideEncryptionUpdateDetails} -> serverSideEncryptionUpdateDetails) (\s@DomainSummary' {} a -> s {serverSideEncryptionUpdateDetails = a} :: DomainSummary)
+
+-- | The timestamp showing the domain\'s last update.
+domainSummary_updatedAt :: Lens.Lens' DomainSummary (Prelude.Maybe Prelude.UTCTime)
+domainSummary_updatedAt = Lens.lens (\DomainSummary' {updatedAt} -> updatedAt) (\s@DomainSummary' {} a -> s {updatedAt = a} :: DomainSummary) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON DomainSummary where
+  parseJSON =
+    Data.withObject
+      "DomainSummary"
+      ( \x ->
+          DomainSummary'
+            Prelude.<$> (x Data..:? "Arn")
+            Prelude.<*> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "DomainStatus")
+            Prelude.<*> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "ServerSideEncryptionConfiguration")
+            Prelude.<*> (x Data..:? "ServerSideEncryptionUpdateDetails")
+            Prelude.<*> (x Data..:? "UpdatedAt")
+      )
+
+instance Prelude.Hashable DomainSummary where
+  hashWithSalt _salt DomainSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` arn
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` domainStatus
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` serverSideEncryptionConfiguration
+      `Prelude.hashWithSalt` serverSideEncryptionUpdateDetails
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData DomainSummary where
+  rnf DomainSummary' {..} =
+    Prelude.rnf arn
+      `Prelude.seq` Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf domainStatus
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf serverSideEncryptionConfiguration
+      `Prelude.seq` Prelude.rnf serverSideEncryptionUpdateDetails
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/VoiceId/Types/DuplicateRegistrationAction.hs b/gen/Amazonka/VoiceId/Types/DuplicateRegistrationAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/DuplicateRegistrationAction.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.DuplicateRegistrationAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.DuplicateRegistrationAction
+  ( DuplicateRegistrationAction
+      ( ..,
+        DuplicateRegistrationAction_REGISTER_AS_NEW,
+        DuplicateRegistrationAction_SKIP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DuplicateRegistrationAction = DuplicateRegistrationAction'
+  { fromDuplicateRegistrationAction ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern DuplicateRegistrationAction_REGISTER_AS_NEW :: DuplicateRegistrationAction
+pattern DuplicateRegistrationAction_REGISTER_AS_NEW = DuplicateRegistrationAction' "REGISTER_AS_NEW"
+
+pattern DuplicateRegistrationAction_SKIP :: DuplicateRegistrationAction
+pattern DuplicateRegistrationAction_SKIP = DuplicateRegistrationAction' "SKIP"
+
+{-# COMPLETE
+  DuplicateRegistrationAction_REGISTER_AS_NEW,
+  DuplicateRegistrationAction_SKIP,
+  DuplicateRegistrationAction'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/EnrollmentConfig.hs b/gen/Amazonka/VoiceId/Types/EnrollmentConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/EnrollmentConfig.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.EnrollmentConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.EnrollmentConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig
+import Amazonka.VoiceId.Types.ExistingEnrollmentAction
+
+-- | Contains configurations defining enrollment behavior for the batch job.
+--
+-- /See:/ 'newEnrollmentConfig' smart constructor.
+data EnrollmentConfig = EnrollmentConfig'
+  { -- | The action to take when the specified speaker is already enrolled in the
+    -- specified domain. The default value is @SKIP@, which skips the
+    -- enrollment for the existing speaker. Setting the value to @OVERWRITE@
+    -- replaces the existing voice prints and enrollment audio stored for that
+    -- speaker with new data generated from the latest audio.
+    existingEnrollmentAction :: Prelude.Maybe ExistingEnrollmentAction,
+    -- | The fraud detection configuration to use for the speaker enrollment job.
+    fraudDetectionConfig :: Prelude.Maybe EnrollmentJobFraudDetectionConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EnrollmentConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'existingEnrollmentAction', 'enrollmentConfig_existingEnrollmentAction' - The action to take when the specified speaker is already enrolled in the
+-- specified domain. The default value is @SKIP@, which skips the
+-- enrollment for the existing speaker. Setting the value to @OVERWRITE@
+-- replaces the existing voice prints and enrollment audio stored for that
+-- speaker with new data generated from the latest audio.
+--
+-- 'fraudDetectionConfig', 'enrollmentConfig_fraudDetectionConfig' - The fraud detection configuration to use for the speaker enrollment job.
+newEnrollmentConfig ::
+  EnrollmentConfig
+newEnrollmentConfig =
+  EnrollmentConfig'
+    { existingEnrollmentAction =
+        Prelude.Nothing,
+      fraudDetectionConfig = Prelude.Nothing
+    }
+
+-- | The action to take when the specified speaker is already enrolled in the
+-- specified domain. The default value is @SKIP@, which skips the
+-- enrollment for the existing speaker. Setting the value to @OVERWRITE@
+-- replaces the existing voice prints and enrollment audio stored for that
+-- speaker with new data generated from the latest audio.
+enrollmentConfig_existingEnrollmentAction :: Lens.Lens' EnrollmentConfig (Prelude.Maybe ExistingEnrollmentAction)
+enrollmentConfig_existingEnrollmentAction = Lens.lens (\EnrollmentConfig' {existingEnrollmentAction} -> existingEnrollmentAction) (\s@EnrollmentConfig' {} a -> s {existingEnrollmentAction = a} :: EnrollmentConfig)
+
+-- | The fraud detection configuration to use for the speaker enrollment job.
+enrollmentConfig_fraudDetectionConfig :: Lens.Lens' EnrollmentConfig (Prelude.Maybe EnrollmentJobFraudDetectionConfig)
+enrollmentConfig_fraudDetectionConfig = Lens.lens (\EnrollmentConfig' {fraudDetectionConfig} -> fraudDetectionConfig) (\s@EnrollmentConfig' {} a -> s {fraudDetectionConfig = a} :: EnrollmentConfig)
+
+instance Data.FromJSON EnrollmentConfig where
+  parseJSON =
+    Data.withObject
+      "EnrollmentConfig"
+      ( \x ->
+          EnrollmentConfig'
+            Prelude.<$> (x Data..:? "ExistingEnrollmentAction")
+            Prelude.<*> (x Data..:? "FraudDetectionConfig")
+      )
+
+instance Prelude.Hashable EnrollmentConfig where
+  hashWithSalt _salt EnrollmentConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` existingEnrollmentAction
+      `Prelude.hashWithSalt` fraudDetectionConfig
+
+instance Prelude.NFData EnrollmentConfig where
+  rnf EnrollmentConfig' {..} =
+    Prelude.rnf existingEnrollmentAction
+      `Prelude.seq` Prelude.rnf fraudDetectionConfig
+
+instance Data.ToJSON EnrollmentConfig where
+  toJSON EnrollmentConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ExistingEnrollmentAction" Data..=)
+              Prelude.<$> existingEnrollmentAction,
+            ("FraudDetectionConfig" Data..=)
+              Prelude.<$> fraudDetectionConfig
+          ]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/EnrollmentJobFraudDetectionConfig.hs b/gen/Amazonka/VoiceId/Types/EnrollmentJobFraudDetectionConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/EnrollmentJobFraudDetectionConfig.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.EnrollmentJobFraudDetectionConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.FraudDetectionAction
+
+-- | The configuration defining the action to take when a speaker is flagged
+-- by the fraud detection system during a batch speaker enrollment job, and
+-- the risk threshold to use for identification.
+--
+-- /See:/ 'newEnrollmentJobFraudDetectionConfig' smart constructor.
+data EnrollmentJobFraudDetectionConfig = EnrollmentJobFraudDetectionConfig'
+  { -- | The action to take when the given speaker is flagged by the fraud
+    -- detection system. The default value is @FAIL@, which fails the speaker
+    -- enrollment. Changing this value to @IGNORE@ results in the speaker being
+    -- enrolled even if they are flagged by the fraud detection system.
+    fraudDetectionAction :: Prelude.Maybe FraudDetectionAction,
+    -- | Threshold value for determining whether the speaker is a high risk to be
+    -- fraudulent. If the detected risk score calculated by Voice ID is greater
+    -- than or equal to the threshold, the speaker is considered a fraudster.
+    riskThreshold :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EnrollmentJobFraudDetectionConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'fraudDetectionAction', 'enrollmentJobFraudDetectionConfig_fraudDetectionAction' - The action to take when the given speaker is flagged by the fraud
+-- detection system. The default value is @FAIL@, which fails the speaker
+-- enrollment. Changing this value to @IGNORE@ results in the speaker being
+-- enrolled even if they are flagged by the fraud detection system.
+--
+-- 'riskThreshold', 'enrollmentJobFraudDetectionConfig_riskThreshold' - Threshold value for determining whether the speaker is a high risk to be
+-- fraudulent. If the detected risk score calculated by Voice ID is greater
+-- than or equal to the threshold, the speaker is considered a fraudster.
+newEnrollmentJobFraudDetectionConfig ::
+  EnrollmentJobFraudDetectionConfig
+newEnrollmentJobFraudDetectionConfig =
+  EnrollmentJobFraudDetectionConfig'
+    { fraudDetectionAction =
+        Prelude.Nothing,
+      riskThreshold = Prelude.Nothing
+    }
+
+-- | The action to take when the given speaker is flagged by the fraud
+-- detection system. The default value is @FAIL@, which fails the speaker
+-- enrollment. Changing this value to @IGNORE@ results in the speaker being
+-- enrolled even if they are flagged by the fraud detection system.
+enrollmentJobFraudDetectionConfig_fraudDetectionAction :: Lens.Lens' EnrollmentJobFraudDetectionConfig (Prelude.Maybe FraudDetectionAction)
+enrollmentJobFraudDetectionConfig_fraudDetectionAction = Lens.lens (\EnrollmentJobFraudDetectionConfig' {fraudDetectionAction} -> fraudDetectionAction) (\s@EnrollmentJobFraudDetectionConfig' {} a -> s {fraudDetectionAction = a} :: EnrollmentJobFraudDetectionConfig)
+
+-- | Threshold value for determining whether the speaker is a high risk to be
+-- fraudulent. If the detected risk score calculated by Voice ID is greater
+-- than or equal to the threshold, the speaker is considered a fraudster.
+enrollmentJobFraudDetectionConfig_riskThreshold :: Lens.Lens' EnrollmentJobFraudDetectionConfig (Prelude.Maybe Prelude.Natural)
+enrollmentJobFraudDetectionConfig_riskThreshold = Lens.lens (\EnrollmentJobFraudDetectionConfig' {riskThreshold} -> riskThreshold) (\s@EnrollmentJobFraudDetectionConfig' {} a -> s {riskThreshold = a} :: EnrollmentJobFraudDetectionConfig)
+
+instance
+  Data.FromJSON
+    EnrollmentJobFraudDetectionConfig
+  where
+  parseJSON =
+    Data.withObject
+      "EnrollmentJobFraudDetectionConfig"
+      ( \x ->
+          EnrollmentJobFraudDetectionConfig'
+            Prelude.<$> (x Data..:? "FraudDetectionAction")
+            Prelude.<*> (x Data..:? "RiskThreshold")
+      )
+
+instance
+  Prelude.Hashable
+    EnrollmentJobFraudDetectionConfig
+  where
+  hashWithSalt
+    _salt
+    EnrollmentJobFraudDetectionConfig' {..} =
+      _salt
+        `Prelude.hashWithSalt` fraudDetectionAction
+        `Prelude.hashWithSalt` riskThreshold
+
+instance
+  Prelude.NFData
+    EnrollmentJobFraudDetectionConfig
+  where
+  rnf EnrollmentJobFraudDetectionConfig' {..} =
+    Prelude.rnf fraudDetectionAction
+      `Prelude.seq` Prelude.rnf riskThreshold
+
+instance
+  Data.ToJSON
+    EnrollmentJobFraudDetectionConfig
+  where
+  toJSON EnrollmentJobFraudDetectionConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("FraudDetectionAction" Data..=)
+              Prelude.<$> fraudDetectionAction,
+            ("RiskThreshold" Data..=) Prelude.<$> riskThreshold
+          ]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/ExistingEnrollmentAction.hs b/gen/Amazonka/VoiceId/Types/ExistingEnrollmentAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/ExistingEnrollmentAction.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.ExistingEnrollmentAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.ExistingEnrollmentAction
+  ( ExistingEnrollmentAction
+      ( ..,
+        ExistingEnrollmentAction_OVERWRITE,
+        ExistingEnrollmentAction_SKIP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ExistingEnrollmentAction = ExistingEnrollmentAction'
+  { fromExistingEnrollmentAction ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ExistingEnrollmentAction_OVERWRITE :: ExistingEnrollmentAction
+pattern ExistingEnrollmentAction_OVERWRITE = ExistingEnrollmentAction' "OVERWRITE"
+
+pattern ExistingEnrollmentAction_SKIP :: ExistingEnrollmentAction
+pattern ExistingEnrollmentAction_SKIP = ExistingEnrollmentAction' "SKIP"
+
+{-# COMPLETE
+  ExistingEnrollmentAction_OVERWRITE,
+  ExistingEnrollmentAction_SKIP,
+  ExistingEnrollmentAction'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/FailureDetails.hs b/gen/Amazonka/VoiceId/Types/FailureDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FailureDetails.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FailureDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FailureDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains error details for a failed batch job.
+--
+-- /See:/ 'newFailureDetails' smart constructor.
+data FailureDetails = FailureDetails'
+  { -- | A description of the error that caused the batch job failure.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | An HTTP status code representing the nature of the error.
+    statusCode :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FailureDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'failureDetails_message' - A description of the error that caused the batch job failure.
+--
+-- 'statusCode', 'failureDetails_statusCode' - An HTTP status code representing the nature of the error.
+newFailureDetails ::
+  FailureDetails
+newFailureDetails =
+  FailureDetails'
+    { message = Prelude.Nothing,
+      statusCode = Prelude.Nothing
+    }
+
+-- | A description of the error that caused the batch job failure.
+failureDetails_message :: Lens.Lens' FailureDetails (Prelude.Maybe Prelude.Text)
+failureDetails_message = Lens.lens (\FailureDetails' {message} -> message) (\s@FailureDetails' {} a -> s {message = a} :: FailureDetails)
+
+-- | An HTTP status code representing the nature of the error.
+failureDetails_statusCode :: Lens.Lens' FailureDetails (Prelude.Maybe Prelude.Int)
+failureDetails_statusCode = Lens.lens (\FailureDetails' {statusCode} -> statusCode) (\s@FailureDetails' {} a -> s {statusCode = a} :: FailureDetails)
+
+instance Data.FromJSON FailureDetails where
+  parseJSON =
+    Data.withObject
+      "FailureDetails"
+      ( \x ->
+          FailureDetails'
+            Prelude.<$> (x Data..:? "Message")
+            Prelude.<*> (x Data..:? "StatusCode")
+      )
+
+instance Prelude.Hashable FailureDetails where
+  hashWithSalt _salt FailureDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` message
+      `Prelude.hashWithSalt` statusCode
+
+instance Prelude.NFData FailureDetails where
+  rnf FailureDetails' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf statusCode
diff --git a/gen/Amazonka/VoiceId/Types/FraudDetectionAction.hs b/gen/Amazonka/VoiceId/Types/FraudDetectionAction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudDetectionAction.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudDetectionAction
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudDetectionAction
+  ( FraudDetectionAction
+      ( ..,
+        FraudDetectionAction_FAIL,
+        FraudDetectionAction_IGNORE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FraudDetectionAction = FraudDetectionAction'
+  { fromFraudDetectionAction ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern FraudDetectionAction_FAIL :: FraudDetectionAction
+pattern FraudDetectionAction_FAIL = FraudDetectionAction' "FAIL"
+
+pattern FraudDetectionAction_IGNORE :: FraudDetectionAction
+pattern FraudDetectionAction_IGNORE = FraudDetectionAction' "IGNORE"
+
+{-# COMPLETE
+  FraudDetectionAction_FAIL,
+  FraudDetectionAction_IGNORE,
+  FraudDetectionAction'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/FraudDetectionConfiguration.hs b/gen/Amazonka/VoiceId/Types/FraudDetectionConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudDetectionConfiguration.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudDetectionConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudDetectionConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration used for performing fraud detection over a speaker
+-- during a session.
+--
+-- /See:/ 'newFraudDetectionConfiguration' smart constructor.
+data FraudDetectionConfiguration = FraudDetectionConfiguration'
+  { -- | Threshold value for determining whether the speaker is a fraudster. If
+    -- the detected risk score calculated by Voice ID is higher than the
+    -- threshold, the speaker is considered a fraudster.
+    riskThreshold :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FraudDetectionConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'riskThreshold', 'fraudDetectionConfiguration_riskThreshold' - Threshold value for determining whether the speaker is a fraudster. If
+-- the detected risk score calculated by Voice ID is higher than the
+-- threshold, the speaker is considered a fraudster.
+newFraudDetectionConfiguration ::
+  -- | 'riskThreshold'
+  Prelude.Natural ->
+  FraudDetectionConfiguration
+newFraudDetectionConfiguration pRiskThreshold_ =
+  FraudDetectionConfiguration'
+    { riskThreshold =
+        pRiskThreshold_
+    }
+
+-- | Threshold value for determining whether the speaker is a fraudster. If
+-- the detected risk score calculated by Voice ID is higher than the
+-- threshold, the speaker is considered a fraudster.
+fraudDetectionConfiguration_riskThreshold :: Lens.Lens' FraudDetectionConfiguration Prelude.Natural
+fraudDetectionConfiguration_riskThreshold = Lens.lens (\FraudDetectionConfiguration' {riskThreshold} -> riskThreshold) (\s@FraudDetectionConfiguration' {} a -> s {riskThreshold = a} :: FraudDetectionConfiguration)
+
+instance Data.FromJSON FraudDetectionConfiguration where
+  parseJSON =
+    Data.withObject
+      "FraudDetectionConfiguration"
+      ( \x ->
+          FraudDetectionConfiguration'
+            Prelude.<$> (x Data..: "RiskThreshold")
+      )
+
+instance Prelude.Hashable FraudDetectionConfiguration where
+  hashWithSalt _salt FraudDetectionConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` riskThreshold
+
+instance Prelude.NFData FraudDetectionConfiguration where
+  rnf FraudDetectionConfiguration' {..} =
+    Prelude.rnf riskThreshold
diff --git a/gen/Amazonka/VoiceId/Types/FraudDetectionDecision.hs b/gen/Amazonka/VoiceId/Types/FraudDetectionDecision.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudDetectionDecision.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudDetectionDecision
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudDetectionDecision
+  ( FraudDetectionDecision
+      ( ..,
+        FraudDetectionDecision_HIGH_RISK,
+        FraudDetectionDecision_LOW_RISK,
+        FraudDetectionDecision_NOT_ENOUGH_SPEECH
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FraudDetectionDecision = FraudDetectionDecision'
+  { fromFraudDetectionDecision ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern FraudDetectionDecision_HIGH_RISK :: FraudDetectionDecision
+pattern FraudDetectionDecision_HIGH_RISK = FraudDetectionDecision' "HIGH_RISK"
+
+pattern FraudDetectionDecision_LOW_RISK :: FraudDetectionDecision
+pattern FraudDetectionDecision_LOW_RISK = FraudDetectionDecision' "LOW_RISK"
+
+pattern FraudDetectionDecision_NOT_ENOUGH_SPEECH :: FraudDetectionDecision
+pattern FraudDetectionDecision_NOT_ENOUGH_SPEECH = FraudDetectionDecision' "NOT_ENOUGH_SPEECH"
+
+{-# COMPLETE
+  FraudDetectionDecision_HIGH_RISK,
+  FraudDetectionDecision_LOW_RISK,
+  FraudDetectionDecision_NOT_ENOUGH_SPEECH,
+  FraudDetectionDecision'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/FraudDetectionReason.hs b/gen/Amazonka/VoiceId/Types/FraudDetectionReason.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudDetectionReason.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudDetectionReason
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudDetectionReason
+  ( FraudDetectionReason
+      ( ..,
+        FraudDetectionReason_KNOWN_FRAUDSTER,
+        FraudDetectionReason_VOICE_SPOOFING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FraudDetectionReason = FraudDetectionReason'
+  { fromFraudDetectionReason ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern FraudDetectionReason_KNOWN_FRAUDSTER :: FraudDetectionReason
+pattern FraudDetectionReason_KNOWN_FRAUDSTER = FraudDetectionReason' "KNOWN_FRAUDSTER"
+
+pattern FraudDetectionReason_VOICE_SPOOFING :: FraudDetectionReason
+pattern FraudDetectionReason_VOICE_SPOOFING = FraudDetectionReason' "VOICE_SPOOFING"
+
+{-# COMPLETE
+  FraudDetectionReason_KNOWN_FRAUDSTER,
+  FraudDetectionReason_VOICE_SPOOFING,
+  FraudDetectionReason'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/FraudDetectionResult.hs b/gen/Amazonka/VoiceId/Types/FraudDetectionResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudDetectionResult.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudDetectionResult
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudDetectionResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.FraudDetectionConfiguration
+import Amazonka.VoiceId.Types.FraudDetectionDecision
+import Amazonka.VoiceId.Types.FraudDetectionReason
+import Amazonka.VoiceId.Types.FraudRiskDetails
+
+-- | The fraud detection result produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+--
+-- /See:/ 'newFraudDetectionResult' smart constructor.
+data FraudDetectionResult = FraudDetectionResult'
+  { -- | A timestamp indicating when audio aggregation ended for this fraud
+    -- detection result.
+    audioAggregationEndedAt :: Prelude.Maybe Data.POSIX,
+    -- | A timestamp indicating when audio aggregation started for this fraud
+    -- detection result.
+    audioAggregationStartedAt :: Prelude.Maybe Data.POSIX,
+    -- | The @FraudDetectionConfiguration@ used to generate this fraud detection
+    -- result.
+    configuration :: Prelude.Maybe FraudDetectionConfiguration,
+    -- | The fraud detection decision produced by Voice ID, processed against the
+    -- current session state and streamed audio of the speaker.
+    decision :: Prelude.Maybe FraudDetectionDecision,
+    -- | The unique identifier for this fraud detection result. Given there can
+    -- be multiple fraud detections for a given session, this field helps in
+    -- identifying if the returned result is from previous streaming activity
+    -- or a new result. Note that in the absence of any new streaming activity
+    -- or risk threshold changes, Voice ID always returns cached Fraud
+    -- Detection result for this API.
+    fraudDetectionResultId :: Prelude.Maybe Prelude.Text,
+    -- | The reason speaker was flagged by the fraud detection system. This is
+    -- only be populated if fraud detection Decision is @HIGH_RISK@, and the
+    -- following possible values: @KNOWN_FRAUDSTER@ and @VOICE_SPOOFING@.
+    reasons :: Prelude.Maybe [FraudDetectionReason],
+    -- | Details about each risk analyzed for this speaker. Currently, this
+    -- contains KnownFraudsterRisk and VoiceSpoofingRisk details.
+    riskDetails :: Prelude.Maybe FraudRiskDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FraudDetectionResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'audioAggregationEndedAt', 'fraudDetectionResult_audioAggregationEndedAt' - A timestamp indicating when audio aggregation ended for this fraud
+-- detection result.
+--
+-- 'audioAggregationStartedAt', 'fraudDetectionResult_audioAggregationStartedAt' - A timestamp indicating when audio aggregation started for this fraud
+-- detection result.
+--
+-- 'configuration', 'fraudDetectionResult_configuration' - The @FraudDetectionConfiguration@ used to generate this fraud detection
+-- result.
+--
+-- 'decision', 'fraudDetectionResult_decision' - The fraud detection decision produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+--
+-- 'fraudDetectionResultId', 'fraudDetectionResult_fraudDetectionResultId' - The unique identifier for this fraud detection result. Given there can
+-- be multiple fraud detections for a given session, this field helps in
+-- identifying if the returned result is from previous streaming activity
+-- or a new result. Note that in the absence of any new streaming activity
+-- or risk threshold changes, Voice ID always returns cached Fraud
+-- Detection result for this API.
+--
+-- 'reasons', 'fraudDetectionResult_reasons' - The reason speaker was flagged by the fraud detection system. This is
+-- only be populated if fraud detection Decision is @HIGH_RISK@, and the
+-- following possible values: @KNOWN_FRAUDSTER@ and @VOICE_SPOOFING@.
+--
+-- 'riskDetails', 'fraudDetectionResult_riskDetails' - Details about each risk analyzed for this speaker. Currently, this
+-- contains KnownFraudsterRisk and VoiceSpoofingRisk details.
+newFraudDetectionResult ::
+  FraudDetectionResult
+newFraudDetectionResult =
+  FraudDetectionResult'
+    { audioAggregationEndedAt =
+        Prelude.Nothing,
+      audioAggregationStartedAt = Prelude.Nothing,
+      configuration = Prelude.Nothing,
+      decision = Prelude.Nothing,
+      fraudDetectionResultId = Prelude.Nothing,
+      reasons = Prelude.Nothing,
+      riskDetails = Prelude.Nothing
+    }
+
+-- | A timestamp indicating when audio aggregation ended for this fraud
+-- detection result.
+fraudDetectionResult_audioAggregationEndedAt :: Lens.Lens' FraudDetectionResult (Prelude.Maybe Prelude.UTCTime)
+fraudDetectionResult_audioAggregationEndedAt = Lens.lens (\FraudDetectionResult' {audioAggregationEndedAt} -> audioAggregationEndedAt) (\s@FraudDetectionResult' {} a -> s {audioAggregationEndedAt = a} :: FraudDetectionResult) Prelude.. Lens.mapping Data._Time
+
+-- | A timestamp indicating when audio aggregation started for this fraud
+-- detection result.
+fraudDetectionResult_audioAggregationStartedAt :: Lens.Lens' FraudDetectionResult (Prelude.Maybe Prelude.UTCTime)
+fraudDetectionResult_audioAggregationStartedAt = Lens.lens (\FraudDetectionResult' {audioAggregationStartedAt} -> audioAggregationStartedAt) (\s@FraudDetectionResult' {} a -> s {audioAggregationStartedAt = a} :: FraudDetectionResult) Prelude.. Lens.mapping Data._Time
+
+-- | The @FraudDetectionConfiguration@ used to generate this fraud detection
+-- result.
+fraudDetectionResult_configuration :: Lens.Lens' FraudDetectionResult (Prelude.Maybe FraudDetectionConfiguration)
+fraudDetectionResult_configuration = Lens.lens (\FraudDetectionResult' {configuration} -> configuration) (\s@FraudDetectionResult' {} a -> s {configuration = a} :: FraudDetectionResult)
+
+-- | The fraud detection decision produced by Voice ID, processed against the
+-- current session state and streamed audio of the speaker.
+fraudDetectionResult_decision :: Lens.Lens' FraudDetectionResult (Prelude.Maybe FraudDetectionDecision)
+fraudDetectionResult_decision = Lens.lens (\FraudDetectionResult' {decision} -> decision) (\s@FraudDetectionResult' {} a -> s {decision = a} :: FraudDetectionResult)
+
+-- | The unique identifier for this fraud detection result. Given there can
+-- be multiple fraud detections for a given session, this field helps in
+-- identifying if the returned result is from previous streaming activity
+-- or a new result. Note that in the absence of any new streaming activity
+-- or risk threshold changes, Voice ID always returns cached Fraud
+-- Detection result for this API.
+fraudDetectionResult_fraudDetectionResultId :: Lens.Lens' FraudDetectionResult (Prelude.Maybe Prelude.Text)
+fraudDetectionResult_fraudDetectionResultId = Lens.lens (\FraudDetectionResult' {fraudDetectionResultId} -> fraudDetectionResultId) (\s@FraudDetectionResult' {} a -> s {fraudDetectionResultId = a} :: FraudDetectionResult)
+
+-- | The reason speaker was flagged by the fraud detection system. This is
+-- only be populated if fraud detection Decision is @HIGH_RISK@, and the
+-- following possible values: @KNOWN_FRAUDSTER@ and @VOICE_SPOOFING@.
+fraudDetectionResult_reasons :: Lens.Lens' FraudDetectionResult (Prelude.Maybe [FraudDetectionReason])
+fraudDetectionResult_reasons = Lens.lens (\FraudDetectionResult' {reasons} -> reasons) (\s@FraudDetectionResult' {} a -> s {reasons = a} :: FraudDetectionResult) Prelude.. Lens.mapping Lens.coerced
+
+-- | Details about each risk analyzed for this speaker. Currently, this
+-- contains KnownFraudsterRisk and VoiceSpoofingRisk details.
+fraudDetectionResult_riskDetails :: Lens.Lens' FraudDetectionResult (Prelude.Maybe FraudRiskDetails)
+fraudDetectionResult_riskDetails = Lens.lens (\FraudDetectionResult' {riskDetails} -> riskDetails) (\s@FraudDetectionResult' {} a -> s {riskDetails = a} :: FraudDetectionResult)
+
+instance Data.FromJSON FraudDetectionResult where
+  parseJSON =
+    Data.withObject
+      "FraudDetectionResult"
+      ( \x ->
+          FraudDetectionResult'
+            Prelude.<$> (x Data..:? "AudioAggregationEndedAt")
+            Prelude.<*> (x Data..:? "AudioAggregationStartedAt")
+            Prelude.<*> (x Data..:? "Configuration")
+            Prelude.<*> (x Data..:? "Decision")
+            Prelude.<*> (x Data..:? "FraudDetectionResultId")
+            Prelude.<*> (x Data..:? "Reasons" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "RiskDetails")
+      )
+
+instance Prelude.Hashable FraudDetectionResult where
+  hashWithSalt _salt FraudDetectionResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` audioAggregationEndedAt
+      `Prelude.hashWithSalt` audioAggregationStartedAt
+      `Prelude.hashWithSalt` configuration
+      `Prelude.hashWithSalt` decision
+      `Prelude.hashWithSalt` fraudDetectionResultId
+      `Prelude.hashWithSalt` reasons
+      `Prelude.hashWithSalt` riskDetails
+
+instance Prelude.NFData FraudDetectionResult where
+  rnf FraudDetectionResult' {..} =
+    Prelude.rnf audioAggregationEndedAt
+      `Prelude.seq` Prelude.rnf audioAggregationStartedAt
+      `Prelude.seq` Prelude.rnf configuration
+      `Prelude.seq` Prelude.rnf decision
+      `Prelude.seq` Prelude.rnf fraudDetectionResultId
+      `Prelude.seq` Prelude.rnf reasons
+      `Prelude.seq` Prelude.rnf riskDetails
diff --git a/gen/Amazonka/VoiceId/Types/FraudRiskDetails.hs b/gen/Amazonka/VoiceId/Types/FraudRiskDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudRiskDetails.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudRiskDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudRiskDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.KnownFraudsterRisk
+import Amazonka.VoiceId.Types.VoiceSpoofingRisk
+
+-- | Details regarding various fraud risk analyses performed against the
+-- current session state and streamed audio of the speaker.
+--
+-- /See:/ 'newFraudRiskDetails' smart constructor.
+data FraudRiskDetails = FraudRiskDetails'
+  { -- | The details resulting from \'Known Fraudster Risk\' analysis of the
+    -- speaker.
+    knownFraudsterRisk :: KnownFraudsterRisk,
+    -- | The details resulting from \'Voice Spoofing Risk\' analysis of the
+    -- speaker.
+    voiceSpoofingRisk :: VoiceSpoofingRisk
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FraudRiskDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'knownFraudsterRisk', 'fraudRiskDetails_knownFraudsterRisk' - The details resulting from \'Known Fraudster Risk\' analysis of the
+-- speaker.
+--
+-- 'voiceSpoofingRisk', 'fraudRiskDetails_voiceSpoofingRisk' - The details resulting from \'Voice Spoofing Risk\' analysis of the
+-- speaker.
+newFraudRiskDetails ::
+  -- | 'knownFraudsterRisk'
+  KnownFraudsterRisk ->
+  -- | 'voiceSpoofingRisk'
+  VoiceSpoofingRisk ->
+  FraudRiskDetails
+newFraudRiskDetails
+  pKnownFraudsterRisk_
+  pVoiceSpoofingRisk_ =
+    FraudRiskDetails'
+      { knownFraudsterRisk =
+          pKnownFraudsterRisk_,
+        voiceSpoofingRisk = pVoiceSpoofingRisk_
+      }
+
+-- | The details resulting from \'Known Fraudster Risk\' analysis of the
+-- speaker.
+fraudRiskDetails_knownFraudsterRisk :: Lens.Lens' FraudRiskDetails KnownFraudsterRisk
+fraudRiskDetails_knownFraudsterRisk = Lens.lens (\FraudRiskDetails' {knownFraudsterRisk} -> knownFraudsterRisk) (\s@FraudRiskDetails' {} a -> s {knownFraudsterRisk = a} :: FraudRiskDetails)
+
+-- | The details resulting from \'Voice Spoofing Risk\' analysis of the
+-- speaker.
+fraudRiskDetails_voiceSpoofingRisk :: Lens.Lens' FraudRiskDetails VoiceSpoofingRisk
+fraudRiskDetails_voiceSpoofingRisk = Lens.lens (\FraudRiskDetails' {voiceSpoofingRisk} -> voiceSpoofingRisk) (\s@FraudRiskDetails' {} a -> s {voiceSpoofingRisk = a} :: FraudRiskDetails)
+
+instance Data.FromJSON FraudRiskDetails where
+  parseJSON =
+    Data.withObject
+      "FraudRiskDetails"
+      ( \x ->
+          FraudRiskDetails'
+            Prelude.<$> (x Data..: "KnownFraudsterRisk")
+            Prelude.<*> (x Data..: "VoiceSpoofingRisk")
+      )
+
+instance Prelude.Hashable FraudRiskDetails where
+  hashWithSalt _salt FraudRiskDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` knownFraudsterRisk
+      `Prelude.hashWithSalt` voiceSpoofingRisk
+
+instance Prelude.NFData FraudRiskDetails where
+  rnf FraudRiskDetails' {..} =
+    Prelude.rnf knownFraudsterRisk
+      `Prelude.seq` Prelude.rnf voiceSpoofingRisk
diff --git a/gen/Amazonka/VoiceId/Types/Fraudster.hs b/gen/Amazonka/VoiceId/Types/Fraudster.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/Fraudster.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.Fraudster
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.Fraudster where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains all the information about a fraudster.
+--
+-- /See:/ 'newFraudster' smart constructor.
+data Fraudster = Fraudster'
+  { -- | The timestamp when Voice ID identified the fraudster.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The identifier for the domain containing the fraudster.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | The service-generated identifier for the fraudster.
+    generatedFraudsterId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Fraudster' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'fraudster_createdAt' - The timestamp when Voice ID identified the fraudster.
+--
+-- 'domainId', 'fraudster_domainId' - The identifier for the domain containing the fraudster.
+--
+-- 'generatedFraudsterId', 'fraudster_generatedFraudsterId' - The service-generated identifier for the fraudster.
+newFraudster ::
+  Fraudster
+newFraudster =
+  Fraudster'
+    { createdAt = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      generatedFraudsterId = Prelude.Nothing
+    }
+
+-- | The timestamp when Voice ID identified the fraudster.
+fraudster_createdAt :: Lens.Lens' Fraudster (Prelude.Maybe Prelude.UTCTime)
+fraudster_createdAt = Lens.lens (\Fraudster' {createdAt} -> createdAt) (\s@Fraudster' {} a -> s {createdAt = a} :: Fraudster) Prelude.. Lens.mapping Data._Time
+
+-- | The identifier for the domain containing the fraudster.
+fraudster_domainId :: Lens.Lens' Fraudster (Prelude.Maybe Prelude.Text)
+fraudster_domainId = Lens.lens (\Fraudster' {domainId} -> domainId) (\s@Fraudster' {} a -> s {domainId = a} :: Fraudster)
+
+-- | The service-generated identifier for the fraudster.
+fraudster_generatedFraudsterId :: Lens.Lens' Fraudster (Prelude.Maybe Prelude.Text)
+fraudster_generatedFraudsterId = Lens.lens (\Fraudster' {generatedFraudsterId} -> generatedFraudsterId) (\s@Fraudster' {} a -> s {generatedFraudsterId = a} :: Fraudster)
+
+instance Data.FromJSON Fraudster where
+  parseJSON =
+    Data.withObject
+      "Fraudster"
+      ( \x ->
+          Fraudster'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "GeneratedFraudsterId")
+      )
+
+instance Prelude.Hashable Fraudster where
+  hashWithSalt _salt Fraudster' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` generatedFraudsterId
+
+instance Prelude.NFData Fraudster where
+  rnf Fraudster' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf generatedFraudsterId
diff --git a/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJob.hs b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJob.hs
@@ -0,0 +1,247 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudsterRegistrationJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudsterRegistrationJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+import Amazonka.VoiceId.Types.InputDataConfig
+import Amazonka.VoiceId.Types.JobProgress
+import Amazonka.VoiceId.Types.OutputDataConfig
+import Amazonka.VoiceId.Types.RegistrationConfig
+
+-- | Contains all the information about a fraudster registration job.
+--
+-- /See:/ 'newFraudsterRegistrationJob' smart constructor.
+data FraudsterRegistrationJob = FraudsterRegistrationJob'
+  { -- | A timestamp showing the creation time of the fraudster registration job.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+    -- to access customer\'s buckets to read the input manifest file and write
+    -- the job output file.
+    dataAccessRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the domain containing the fraudster registration job.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp showing when the fraudster registration job ended.
+    endedAt :: Prelude.Maybe Data.POSIX,
+    -- | Contains details that are populated when an entire batch job fails. In
+    -- cases of individual registration job failures, the batch job as a whole
+    -- doesn\'t fail; it is completed with a @JobStatus@ of
+    -- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+    -- individual registration requests that failed.
+    failureDetails :: Prelude.Maybe FailureDetails,
+    -- | The input data config containing an S3 URI for the input manifest file
+    -- that contains the list of fraudster registration job requests.
+    inputDataConfig :: Prelude.Maybe InputDataConfig,
+    -- | The service-generated identifier for the fraudster registration job.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The client-provided name for the fraudster registration job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Shows the completed percentage of registration requests listed in the
+    -- input file.
+    jobProgress :: Prelude.Maybe JobProgress,
+    -- | The current status of the fraudster registration job.
+    jobStatus :: Prelude.Maybe FraudsterRegistrationJobStatus,
+    -- | The output data config containing the S3 location where you want Voice
+    -- ID to write your job output file; you must also include a KMS key ID in
+    -- order to encrypt the file.
+    outputDataConfig :: Prelude.Maybe OutputDataConfig,
+    -- | The registration config containing details such as the action to take
+    -- when a duplicate fraudster is detected, and the similarity threshold to
+    -- use for detecting a duplicate fraudster.
+    registrationConfig :: Prelude.Maybe RegistrationConfig
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FraudsterRegistrationJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'fraudsterRegistrationJob_createdAt' - A timestamp showing the creation time of the fraudster registration job.
+--
+-- 'dataAccessRoleArn', 'fraudsterRegistrationJob_dataAccessRoleArn' - The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file.
+--
+-- 'domainId', 'fraudsterRegistrationJob_domainId' - The identifier of the domain containing the fraudster registration job.
+--
+-- 'endedAt', 'fraudsterRegistrationJob_endedAt' - A timestamp showing when the fraudster registration job ended.
+--
+-- 'failureDetails', 'fraudsterRegistrationJob_failureDetails' - Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+--
+-- 'inputDataConfig', 'fraudsterRegistrationJob_inputDataConfig' - The input data config containing an S3 URI for the input manifest file
+-- that contains the list of fraudster registration job requests.
+--
+-- 'jobId', 'fraudsterRegistrationJob_jobId' - The service-generated identifier for the fraudster registration job.
+--
+-- 'jobName', 'fraudsterRegistrationJob_jobName' - The client-provided name for the fraudster registration job.
+--
+-- 'jobProgress', 'fraudsterRegistrationJob_jobProgress' - Shows the completed percentage of registration requests listed in the
+-- input file.
+--
+-- 'jobStatus', 'fraudsterRegistrationJob_jobStatus' - The current status of the fraudster registration job.
+--
+-- 'outputDataConfig', 'fraudsterRegistrationJob_outputDataConfig' - The output data config containing the S3 location where you want Voice
+-- ID to write your job output file; you must also include a KMS key ID in
+-- order to encrypt the file.
+--
+-- 'registrationConfig', 'fraudsterRegistrationJob_registrationConfig' - The registration config containing details such as the action to take
+-- when a duplicate fraudster is detected, and the similarity threshold to
+-- use for detecting a duplicate fraudster.
+newFraudsterRegistrationJob ::
+  FraudsterRegistrationJob
+newFraudsterRegistrationJob =
+  FraudsterRegistrationJob'
+    { createdAt =
+        Prelude.Nothing,
+      dataAccessRoleArn = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      endedAt = Prelude.Nothing,
+      failureDetails = Prelude.Nothing,
+      inputDataConfig = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobProgress = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      outputDataConfig = Prelude.Nothing,
+      registrationConfig = Prelude.Nothing
+    }
+
+-- | A timestamp showing the creation time of the fraudster registration job.
+fraudsterRegistrationJob_createdAt :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.UTCTime)
+fraudsterRegistrationJob_createdAt = Lens.lens (\FraudsterRegistrationJob' {createdAt} -> createdAt) (\s@FraudsterRegistrationJob' {} a -> s {createdAt = a} :: FraudsterRegistrationJob) Prelude.. Lens.mapping Data._Time
+
+-- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file.
+fraudsterRegistrationJob_dataAccessRoleArn :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJob_dataAccessRoleArn = Lens.lens (\FraudsterRegistrationJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@FraudsterRegistrationJob' {} a -> s {dataAccessRoleArn = a} :: FraudsterRegistrationJob)
+
+-- | The identifier of the domain containing the fraudster registration job.
+fraudsterRegistrationJob_domainId :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJob_domainId = Lens.lens (\FraudsterRegistrationJob' {domainId} -> domainId) (\s@FraudsterRegistrationJob' {} a -> s {domainId = a} :: FraudsterRegistrationJob)
+
+-- | A timestamp showing when the fraudster registration job ended.
+fraudsterRegistrationJob_endedAt :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.UTCTime)
+fraudsterRegistrationJob_endedAt = Lens.lens (\FraudsterRegistrationJob' {endedAt} -> endedAt) (\s@FraudsterRegistrationJob' {} a -> s {endedAt = a} :: FraudsterRegistrationJob) Prelude.. Lens.mapping Data._Time
+
+-- | Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+fraudsterRegistrationJob_failureDetails :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe FailureDetails)
+fraudsterRegistrationJob_failureDetails = Lens.lens (\FraudsterRegistrationJob' {failureDetails} -> failureDetails) (\s@FraudsterRegistrationJob' {} a -> s {failureDetails = a} :: FraudsterRegistrationJob)
+
+-- | The input data config containing an S3 URI for the input manifest file
+-- that contains the list of fraudster registration job requests.
+fraudsterRegistrationJob_inputDataConfig :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe InputDataConfig)
+fraudsterRegistrationJob_inputDataConfig = Lens.lens (\FraudsterRegistrationJob' {inputDataConfig} -> inputDataConfig) (\s@FraudsterRegistrationJob' {} a -> s {inputDataConfig = a} :: FraudsterRegistrationJob)
+
+-- | The service-generated identifier for the fraudster registration job.
+fraudsterRegistrationJob_jobId :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJob_jobId = Lens.lens (\FraudsterRegistrationJob' {jobId} -> jobId) (\s@FraudsterRegistrationJob' {} a -> s {jobId = a} :: FraudsterRegistrationJob)
+
+-- | The client-provided name for the fraudster registration job.
+fraudsterRegistrationJob_jobName :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJob_jobName = Lens.lens (\FraudsterRegistrationJob' {jobName} -> jobName) (\s@FraudsterRegistrationJob' {} a -> s {jobName = a} :: FraudsterRegistrationJob) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Shows the completed percentage of registration requests listed in the
+-- input file.
+fraudsterRegistrationJob_jobProgress :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe JobProgress)
+fraudsterRegistrationJob_jobProgress = Lens.lens (\FraudsterRegistrationJob' {jobProgress} -> jobProgress) (\s@FraudsterRegistrationJob' {} a -> s {jobProgress = a} :: FraudsterRegistrationJob)
+
+-- | The current status of the fraudster registration job.
+fraudsterRegistrationJob_jobStatus :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe FraudsterRegistrationJobStatus)
+fraudsterRegistrationJob_jobStatus = Lens.lens (\FraudsterRegistrationJob' {jobStatus} -> jobStatus) (\s@FraudsterRegistrationJob' {} a -> s {jobStatus = a} :: FraudsterRegistrationJob)
+
+-- | The output data config containing the S3 location where you want Voice
+-- ID to write your job output file; you must also include a KMS key ID in
+-- order to encrypt the file.
+fraudsterRegistrationJob_outputDataConfig :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe OutputDataConfig)
+fraudsterRegistrationJob_outputDataConfig = Lens.lens (\FraudsterRegistrationJob' {outputDataConfig} -> outputDataConfig) (\s@FraudsterRegistrationJob' {} a -> s {outputDataConfig = a} :: FraudsterRegistrationJob)
+
+-- | The registration config containing details such as the action to take
+-- when a duplicate fraudster is detected, and the similarity threshold to
+-- use for detecting a duplicate fraudster.
+fraudsterRegistrationJob_registrationConfig :: Lens.Lens' FraudsterRegistrationJob (Prelude.Maybe RegistrationConfig)
+fraudsterRegistrationJob_registrationConfig = Lens.lens (\FraudsterRegistrationJob' {registrationConfig} -> registrationConfig) (\s@FraudsterRegistrationJob' {} a -> s {registrationConfig = a} :: FraudsterRegistrationJob)
+
+instance Data.FromJSON FraudsterRegistrationJob where
+  parseJSON =
+    Data.withObject
+      "FraudsterRegistrationJob"
+      ( \x ->
+          FraudsterRegistrationJob'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "DataAccessRoleArn")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "EndedAt")
+            Prelude.<*> (x Data..:? "FailureDetails")
+            Prelude.<*> (x Data..:? "InputDataConfig")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "JobProgress")
+            Prelude.<*> (x Data..:? "JobStatus")
+            Prelude.<*> (x Data..:? "OutputDataConfig")
+            Prelude.<*> (x Data..:? "RegistrationConfig")
+      )
+
+instance Prelude.Hashable FraudsterRegistrationJob where
+  hashWithSalt _salt FraudsterRegistrationJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` endedAt
+      `Prelude.hashWithSalt` failureDetails
+      `Prelude.hashWithSalt` inputDataConfig
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobProgress
+      `Prelude.hashWithSalt` jobStatus
+      `Prelude.hashWithSalt` outputDataConfig
+      `Prelude.hashWithSalt` registrationConfig
+
+instance Prelude.NFData FraudsterRegistrationJob where
+  rnf FraudsterRegistrationJob' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf endedAt
+      `Prelude.seq` Prelude.rnf failureDetails
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobProgress
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf outputDataConfig
+      `Prelude.seq` Prelude.rnf registrationConfig
diff --git a/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobStatus.hs b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+  ( FraudsterRegistrationJobStatus
+      ( ..,
+        FraudsterRegistrationJobStatus_COMPLETED,
+        FraudsterRegistrationJobStatus_COMPLETED_WITH_ERRORS,
+        FraudsterRegistrationJobStatus_FAILED,
+        FraudsterRegistrationJobStatus_IN_PROGRESS,
+        FraudsterRegistrationJobStatus_SUBMITTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype FraudsterRegistrationJobStatus = FraudsterRegistrationJobStatus'
+  { fromFraudsterRegistrationJobStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern FraudsterRegistrationJobStatus_COMPLETED :: FraudsterRegistrationJobStatus
+pattern FraudsterRegistrationJobStatus_COMPLETED = FraudsterRegistrationJobStatus' "COMPLETED"
+
+pattern FraudsterRegistrationJobStatus_COMPLETED_WITH_ERRORS :: FraudsterRegistrationJobStatus
+pattern FraudsterRegistrationJobStatus_COMPLETED_WITH_ERRORS = FraudsterRegistrationJobStatus' "COMPLETED_WITH_ERRORS"
+
+pattern FraudsterRegistrationJobStatus_FAILED :: FraudsterRegistrationJobStatus
+pattern FraudsterRegistrationJobStatus_FAILED = FraudsterRegistrationJobStatus' "FAILED"
+
+pattern FraudsterRegistrationJobStatus_IN_PROGRESS :: FraudsterRegistrationJobStatus
+pattern FraudsterRegistrationJobStatus_IN_PROGRESS = FraudsterRegistrationJobStatus' "IN_PROGRESS"
+
+pattern FraudsterRegistrationJobStatus_SUBMITTED :: FraudsterRegistrationJobStatus
+pattern FraudsterRegistrationJobStatus_SUBMITTED = FraudsterRegistrationJobStatus' "SUBMITTED"
+
+{-# COMPLETE
+  FraudsterRegistrationJobStatus_COMPLETED,
+  FraudsterRegistrationJobStatus_COMPLETED_WITH_ERRORS,
+  FraudsterRegistrationJobStatus_FAILED,
+  FraudsterRegistrationJobStatus_IN_PROGRESS,
+  FraudsterRegistrationJobStatus_SUBMITTED,
+  FraudsterRegistrationJobStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobSummary.hs b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/FraudsterRegistrationJobSummary.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.FraudsterRegistrationJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.FraudsterRegistrationJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.FraudsterRegistrationJobStatus
+import Amazonka.VoiceId.Types.JobProgress
+
+-- | Contains a summary of information about a fraudster registration job.
+--
+-- /See:/ 'newFraudsterRegistrationJobSummary' smart constructor.
+data FraudsterRegistrationJobSummary = FraudsterRegistrationJobSummary'
+  { -- | A timestamp showing when the fraudster registration job is created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The identifier of the domain containing the fraudster registration job.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp showing when the fraudster registration job ended.
+    endedAt :: Prelude.Maybe Data.POSIX,
+    -- | Contains details that are populated when an entire batch job fails. In
+    -- cases of individual registration job failures, the batch job as a whole
+    -- doesn\'t fail; it is completed with a @JobStatus@ of
+    -- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+    -- individual registration requests that failed.
+    failureDetails :: Prelude.Maybe FailureDetails,
+    -- | The service-generated identifier for the fraudster registration job.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The client-provided name for the fraudster registration job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Shows the completed percentage of registration requests listed in the
+    -- input file.
+    jobProgress :: Prelude.Maybe JobProgress,
+    -- | The current status of the fraudster registration job.
+    jobStatus :: Prelude.Maybe FraudsterRegistrationJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FraudsterRegistrationJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'fraudsterRegistrationJobSummary_createdAt' - A timestamp showing when the fraudster registration job is created.
+--
+-- 'domainId', 'fraudsterRegistrationJobSummary_domainId' - The identifier of the domain containing the fraudster registration job.
+--
+-- 'endedAt', 'fraudsterRegistrationJobSummary_endedAt' - A timestamp showing when the fraudster registration job ended.
+--
+-- 'failureDetails', 'fraudsterRegistrationJobSummary_failureDetails' - Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+--
+-- 'jobId', 'fraudsterRegistrationJobSummary_jobId' - The service-generated identifier for the fraudster registration job.
+--
+-- 'jobName', 'fraudsterRegistrationJobSummary_jobName' - The client-provided name for the fraudster registration job.
+--
+-- 'jobProgress', 'fraudsterRegistrationJobSummary_jobProgress' - Shows the completed percentage of registration requests listed in the
+-- input file.
+--
+-- 'jobStatus', 'fraudsterRegistrationJobSummary_jobStatus' - The current status of the fraudster registration job.
+newFraudsterRegistrationJobSummary ::
+  FraudsterRegistrationJobSummary
+newFraudsterRegistrationJobSummary =
+  FraudsterRegistrationJobSummary'
+    { createdAt =
+        Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      endedAt = Prelude.Nothing,
+      failureDetails = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobProgress = Prelude.Nothing,
+      jobStatus = Prelude.Nothing
+    }
+
+-- | A timestamp showing when the fraudster registration job is created.
+fraudsterRegistrationJobSummary_createdAt :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe Prelude.UTCTime)
+fraudsterRegistrationJobSummary_createdAt = Lens.lens (\FraudsterRegistrationJobSummary' {createdAt} -> createdAt) (\s@FraudsterRegistrationJobSummary' {} a -> s {createdAt = a} :: FraudsterRegistrationJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The identifier of the domain containing the fraudster registration job.
+fraudsterRegistrationJobSummary_domainId :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJobSummary_domainId = Lens.lens (\FraudsterRegistrationJobSummary' {domainId} -> domainId) (\s@FraudsterRegistrationJobSummary' {} a -> s {domainId = a} :: FraudsterRegistrationJobSummary)
+
+-- | A timestamp showing when the fraudster registration job ended.
+fraudsterRegistrationJobSummary_endedAt :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe Prelude.UTCTime)
+fraudsterRegistrationJobSummary_endedAt = Lens.lens (\FraudsterRegistrationJobSummary' {endedAt} -> endedAt) (\s@FraudsterRegistrationJobSummary' {} a -> s {endedAt = a} :: FraudsterRegistrationJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+fraudsterRegistrationJobSummary_failureDetails :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe FailureDetails)
+fraudsterRegistrationJobSummary_failureDetails = Lens.lens (\FraudsterRegistrationJobSummary' {failureDetails} -> failureDetails) (\s@FraudsterRegistrationJobSummary' {} a -> s {failureDetails = a} :: FraudsterRegistrationJobSummary)
+
+-- | The service-generated identifier for the fraudster registration job.
+fraudsterRegistrationJobSummary_jobId :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJobSummary_jobId = Lens.lens (\FraudsterRegistrationJobSummary' {jobId} -> jobId) (\s@FraudsterRegistrationJobSummary' {} a -> s {jobId = a} :: FraudsterRegistrationJobSummary)
+
+-- | The client-provided name for the fraudster registration job.
+fraudsterRegistrationJobSummary_jobName :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe Prelude.Text)
+fraudsterRegistrationJobSummary_jobName = Lens.lens (\FraudsterRegistrationJobSummary' {jobName} -> jobName) (\s@FraudsterRegistrationJobSummary' {} a -> s {jobName = a} :: FraudsterRegistrationJobSummary) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Shows the completed percentage of registration requests listed in the
+-- input file.
+fraudsterRegistrationJobSummary_jobProgress :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe JobProgress)
+fraudsterRegistrationJobSummary_jobProgress = Lens.lens (\FraudsterRegistrationJobSummary' {jobProgress} -> jobProgress) (\s@FraudsterRegistrationJobSummary' {} a -> s {jobProgress = a} :: FraudsterRegistrationJobSummary)
+
+-- | The current status of the fraudster registration job.
+fraudsterRegistrationJobSummary_jobStatus :: Lens.Lens' FraudsterRegistrationJobSummary (Prelude.Maybe FraudsterRegistrationJobStatus)
+fraudsterRegistrationJobSummary_jobStatus = Lens.lens (\FraudsterRegistrationJobSummary' {jobStatus} -> jobStatus) (\s@FraudsterRegistrationJobSummary' {} a -> s {jobStatus = a} :: FraudsterRegistrationJobSummary)
+
+instance
+  Data.FromJSON
+    FraudsterRegistrationJobSummary
+  where
+  parseJSON =
+    Data.withObject
+      "FraudsterRegistrationJobSummary"
+      ( \x ->
+          FraudsterRegistrationJobSummary'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "EndedAt")
+            Prelude.<*> (x Data..:? "FailureDetails")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "JobProgress")
+            Prelude.<*> (x Data..:? "JobStatus")
+      )
+
+instance
+  Prelude.Hashable
+    FraudsterRegistrationJobSummary
+  where
+  hashWithSalt
+    _salt
+    FraudsterRegistrationJobSummary' {..} =
+      _salt
+        `Prelude.hashWithSalt` createdAt
+        `Prelude.hashWithSalt` domainId
+        `Prelude.hashWithSalt` endedAt
+        `Prelude.hashWithSalt` failureDetails
+        `Prelude.hashWithSalt` jobId
+        `Prelude.hashWithSalt` jobName
+        `Prelude.hashWithSalt` jobProgress
+        `Prelude.hashWithSalt` jobStatus
+
+instance
+  Prelude.NFData
+    FraudsterRegistrationJobSummary
+  where
+  rnf FraudsterRegistrationJobSummary' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf endedAt
+      `Prelude.seq` Prelude.rnf failureDetails
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobProgress
+      `Prelude.seq` Prelude.rnf jobStatus
diff --git a/gen/Amazonka/VoiceId/Types/InputDataConfig.hs b/gen/Amazonka/VoiceId/Types/InputDataConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/InputDataConfig.hs
@@ -0,0 +1,79 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.InputDataConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.InputDataConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration containing input file information for a batch job.
+--
+-- /See:/ 'newInputDataConfig' smart constructor.
+data InputDataConfig = InputDataConfig'
+  { -- | The S3 location for the input manifest file that contains the list of
+    -- individual enrollment or registration job requests.
+    s3Uri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InputDataConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3Uri', 'inputDataConfig_s3Uri' - The S3 location for the input manifest file that contains the list of
+-- individual enrollment or registration job requests.
+newInputDataConfig ::
+  -- | 's3Uri'
+  Prelude.Text ->
+  InputDataConfig
+newInputDataConfig pS3Uri_ =
+  InputDataConfig' {s3Uri = pS3Uri_}
+
+-- | The S3 location for the input manifest file that contains the list of
+-- individual enrollment or registration job requests.
+inputDataConfig_s3Uri :: Lens.Lens' InputDataConfig Prelude.Text
+inputDataConfig_s3Uri = Lens.lens (\InputDataConfig' {s3Uri} -> s3Uri) (\s@InputDataConfig' {} a -> s {s3Uri = a} :: InputDataConfig)
+
+instance Data.FromJSON InputDataConfig where
+  parseJSON =
+    Data.withObject
+      "InputDataConfig"
+      ( \x ->
+          InputDataConfig' Prelude.<$> (x Data..: "S3Uri")
+      )
+
+instance Prelude.Hashable InputDataConfig where
+  hashWithSalt _salt InputDataConfig' {..} =
+    _salt `Prelude.hashWithSalt` s3Uri
+
+instance Prelude.NFData InputDataConfig where
+  rnf InputDataConfig' {..} = Prelude.rnf s3Uri
+
+instance Data.ToJSON InputDataConfig where
+  toJSON InputDataConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("S3Uri" Data..= s3Uri)]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/JobProgress.hs b/gen/Amazonka/VoiceId/Types/JobProgress.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/JobProgress.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.JobProgress
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.JobProgress where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Indicates the completion progress for a batch job.
+--
+-- /See:/ 'newJobProgress' smart constructor.
+data JobProgress = JobProgress'
+  { -- | Shows the completed percentage of enrollment or registration requests
+    -- listed in the input file.
+    percentComplete :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobProgress' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'percentComplete', 'jobProgress_percentComplete' - Shows the completed percentage of enrollment or registration requests
+-- listed in the input file.
+newJobProgress ::
+  JobProgress
+newJobProgress =
+  JobProgress' {percentComplete = Prelude.Nothing}
+
+-- | Shows the completed percentage of enrollment or registration requests
+-- listed in the input file.
+jobProgress_percentComplete :: Lens.Lens' JobProgress (Prelude.Maybe Prelude.Natural)
+jobProgress_percentComplete = Lens.lens (\JobProgress' {percentComplete} -> percentComplete) (\s@JobProgress' {} a -> s {percentComplete = a} :: JobProgress)
+
+instance Data.FromJSON JobProgress where
+  parseJSON =
+    Data.withObject
+      "JobProgress"
+      ( \x ->
+          JobProgress'
+            Prelude.<$> (x Data..:? "PercentComplete")
+      )
+
+instance Prelude.Hashable JobProgress where
+  hashWithSalt _salt JobProgress' {..} =
+    _salt `Prelude.hashWithSalt` percentComplete
+
+instance Prelude.NFData JobProgress where
+  rnf JobProgress' {..} = Prelude.rnf percentComplete
diff --git a/gen/Amazonka/VoiceId/Types/KnownFraudsterRisk.hs b/gen/Amazonka/VoiceId/Types/KnownFraudsterRisk.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/KnownFraudsterRisk.hs
@@ -0,0 +1,94 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.KnownFraudsterRisk
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.KnownFraudsterRisk where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains details produced as a result of performing known fraudster risk
+-- analysis on a speaker.
+--
+-- /See:/ 'newKnownFraudsterRisk' smart constructor.
+data KnownFraudsterRisk = KnownFraudsterRisk'
+  { -- | The identifier of the fraudster that is the closest match to the
+    -- speaker. If there are no fraudsters registered in a given domain, or if
+    -- there are no fraudsters with a non-zero RiskScore, this value is @null@.
+    generatedFraudsterId :: Prelude.Maybe Prelude.Text,
+    -- | The score indicating the likelihood the speaker is a known fraudster.
+    riskScore :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'KnownFraudsterRisk' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'generatedFraudsterId', 'knownFraudsterRisk_generatedFraudsterId' - The identifier of the fraudster that is the closest match to the
+-- speaker. If there are no fraudsters registered in a given domain, or if
+-- there are no fraudsters with a non-zero RiskScore, this value is @null@.
+--
+-- 'riskScore', 'knownFraudsterRisk_riskScore' - The score indicating the likelihood the speaker is a known fraudster.
+newKnownFraudsterRisk ::
+  -- | 'riskScore'
+  Prelude.Natural ->
+  KnownFraudsterRisk
+newKnownFraudsterRisk pRiskScore_ =
+  KnownFraudsterRisk'
+    { generatedFraudsterId =
+        Prelude.Nothing,
+      riskScore = pRiskScore_
+    }
+
+-- | The identifier of the fraudster that is the closest match to the
+-- speaker. If there are no fraudsters registered in a given domain, or if
+-- there are no fraudsters with a non-zero RiskScore, this value is @null@.
+knownFraudsterRisk_generatedFraudsterId :: Lens.Lens' KnownFraudsterRisk (Prelude.Maybe Prelude.Text)
+knownFraudsterRisk_generatedFraudsterId = Lens.lens (\KnownFraudsterRisk' {generatedFraudsterId} -> generatedFraudsterId) (\s@KnownFraudsterRisk' {} a -> s {generatedFraudsterId = a} :: KnownFraudsterRisk)
+
+-- | The score indicating the likelihood the speaker is a known fraudster.
+knownFraudsterRisk_riskScore :: Lens.Lens' KnownFraudsterRisk Prelude.Natural
+knownFraudsterRisk_riskScore = Lens.lens (\KnownFraudsterRisk' {riskScore} -> riskScore) (\s@KnownFraudsterRisk' {} a -> s {riskScore = a} :: KnownFraudsterRisk)
+
+instance Data.FromJSON KnownFraudsterRisk where
+  parseJSON =
+    Data.withObject
+      "KnownFraudsterRisk"
+      ( \x ->
+          KnownFraudsterRisk'
+            Prelude.<$> (x Data..:? "GeneratedFraudsterId")
+            Prelude.<*> (x Data..: "RiskScore")
+      )
+
+instance Prelude.Hashable KnownFraudsterRisk where
+  hashWithSalt _salt KnownFraudsterRisk' {..} =
+    _salt
+      `Prelude.hashWithSalt` generatedFraudsterId
+      `Prelude.hashWithSalt` riskScore
+
+instance Prelude.NFData KnownFraudsterRisk where
+  rnf KnownFraudsterRisk' {..} =
+    Prelude.rnf generatedFraudsterId
+      `Prelude.seq` Prelude.rnf riskScore
diff --git a/gen/Amazonka/VoiceId/Types/OutputDataConfig.hs b/gen/Amazonka/VoiceId/Types/OutputDataConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/OutputDataConfig.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.OutputDataConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.OutputDataConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration containing output file information for a batch job.
+--
+-- /See:/ 'newOutputDataConfig' smart constructor.
+data OutputDataConfig = OutputDataConfig'
+  { -- | The identifier of the KMS key you want Voice ID to use to encrypt the
+    -- output file of a speaker enrollment job\/fraudster registration job.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The S3 path of the folder where Voice ID writes the job output file. It
+    -- has a @*.out@ extension. For example, if the input file name is
+    -- @input-file.json@ and the output folder path is
+    -- @s3:\/\/output-bucket\/output-folder@, the full output file path is
+    -- @s3:\/\/output-bucket\/output-folder\/job-Id\/input-file.json.out@.
+    s3Uri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutputDataConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'outputDataConfig_kmsKeyId' - The identifier of the KMS key you want Voice ID to use to encrypt the
+-- output file of a speaker enrollment job\/fraudster registration job.
+--
+-- 's3Uri', 'outputDataConfig_s3Uri' - The S3 path of the folder where Voice ID writes the job output file. It
+-- has a @*.out@ extension. For example, if the input file name is
+-- @input-file.json@ and the output folder path is
+-- @s3:\/\/output-bucket\/output-folder@, the full output file path is
+-- @s3:\/\/output-bucket\/output-folder\/job-Id\/input-file.json.out@.
+newOutputDataConfig ::
+  -- | 's3Uri'
+  Prelude.Text ->
+  OutputDataConfig
+newOutputDataConfig pS3Uri_ =
+  OutputDataConfig'
+    { kmsKeyId = Prelude.Nothing,
+      s3Uri = pS3Uri_
+    }
+
+-- | The identifier of the KMS key you want Voice ID to use to encrypt the
+-- output file of a speaker enrollment job\/fraudster registration job.
+outputDataConfig_kmsKeyId :: Lens.Lens' OutputDataConfig (Prelude.Maybe Prelude.Text)
+outputDataConfig_kmsKeyId = Lens.lens (\OutputDataConfig' {kmsKeyId} -> kmsKeyId) (\s@OutputDataConfig' {} a -> s {kmsKeyId = a} :: OutputDataConfig)
+
+-- | The S3 path of the folder where Voice ID writes the job output file. It
+-- has a @*.out@ extension. For example, if the input file name is
+-- @input-file.json@ and the output folder path is
+-- @s3:\/\/output-bucket\/output-folder@, the full output file path is
+-- @s3:\/\/output-bucket\/output-folder\/job-Id\/input-file.json.out@.
+outputDataConfig_s3Uri :: Lens.Lens' OutputDataConfig Prelude.Text
+outputDataConfig_s3Uri = Lens.lens (\OutputDataConfig' {s3Uri} -> s3Uri) (\s@OutputDataConfig' {} a -> s {s3Uri = a} :: OutputDataConfig)
+
+instance Data.FromJSON OutputDataConfig where
+  parseJSON =
+    Data.withObject
+      "OutputDataConfig"
+      ( \x ->
+          OutputDataConfig'
+            Prelude.<$> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..: "S3Uri")
+      )
+
+instance Prelude.Hashable OutputDataConfig where
+  hashWithSalt _salt OutputDataConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` s3Uri
+
+instance Prelude.NFData OutputDataConfig where
+  rnf OutputDataConfig' {..} =
+    Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf s3Uri
+
+instance Data.ToJSON OutputDataConfig where
+  toJSON OutputDataConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            Prelude.Just ("S3Uri" Data..= s3Uri)
+          ]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/RegistrationConfig.hs b/gen/Amazonka/VoiceId/Types/RegistrationConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/RegistrationConfig.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.RegistrationConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.RegistrationConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.DuplicateRegistrationAction
+
+-- | The configuration defining the action to take when a duplicate fraudster
+-- is detected, and the similarity threshold to use for detecting a
+-- duplicate fraudster during a batch fraudster registration job.
+--
+-- /See:/ 'newRegistrationConfig' smart constructor.
+data RegistrationConfig = RegistrationConfig'
+  { -- | The action to take when a fraudster is identified as a duplicate. The
+    -- default action is @SKIP@, which skips registering the duplicate
+    -- fraudster. Setting the value to @REGISTER_AS_NEW@ always registers a new
+    -- fraudster into the specified domain.
+    duplicateRegistrationAction :: Prelude.Maybe DuplicateRegistrationAction,
+    -- | The minimum similarity score between the new and old fraudsters in order
+    -- to consider the new fraudster a duplicate.
+    fraudsterSimilarityThreshold :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RegistrationConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'duplicateRegistrationAction', 'registrationConfig_duplicateRegistrationAction' - The action to take when a fraudster is identified as a duplicate. The
+-- default action is @SKIP@, which skips registering the duplicate
+-- fraudster. Setting the value to @REGISTER_AS_NEW@ always registers a new
+-- fraudster into the specified domain.
+--
+-- 'fraudsterSimilarityThreshold', 'registrationConfig_fraudsterSimilarityThreshold' - The minimum similarity score between the new and old fraudsters in order
+-- to consider the new fraudster a duplicate.
+newRegistrationConfig ::
+  RegistrationConfig
+newRegistrationConfig =
+  RegistrationConfig'
+    { duplicateRegistrationAction =
+        Prelude.Nothing,
+      fraudsterSimilarityThreshold = Prelude.Nothing
+    }
+
+-- | The action to take when a fraudster is identified as a duplicate. The
+-- default action is @SKIP@, which skips registering the duplicate
+-- fraudster. Setting the value to @REGISTER_AS_NEW@ always registers a new
+-- fraudster into the specified domain.
+registrationConfig_duplicateRegistrationAction :: Lens.Lens' RegistrationConfig (Prelude.Maybe DuplicateRegistrationAction)
+registrationConfig_duplicateRegistrationAction = Lens.lens (\RegistrationConfig' {duplicateRegistrationAction} -> duplicateRegistrationAction) (\s@RegistrationConfig' {} a -> s {duplicateRegistrationAction = a} :: RegistrationConfig)
+
+-- | The minimum similarity score between the new and old fraudsters in order
+-- to consider the new fraudster a duplicate.
+registrationConfig_fraudsterSimilarityThreshold :: Lens.Lens' RegistrationConfig (Prelude.Maybe Prelude.Natural)
+registrationConfig_fraudsterSimilarityThreshold = Lens.lens (\RegistrationConfig' {fraudsterSimilarityThreshold} -> fraudsterSimilarityThreshold) (\s@RegistrationConfig' {} a -> s {fraudsterSimilarityThreshold = a} :: RegistrationConfig)
+
+instance Data.FromJSON RegistrationConfig where
+  parseJSON =
+    Data.withObject
+      "RegistrationConfig"
+      ( \x ->
+          RegistrationConfig'
+            Prelude.<$> (x Data..:? "DuplicateRegistrationAction")
+            Prelude.<*> (x Data..:? "FraudsterSimilarityThreshold")
+      )
+
+instance Prelude.Hashable RegistrationConfig where
+  hashWithSalt _salt RegistrationConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` duplicateRegistrationAction
+      `Prelude.hashWithSalt` fraudsterSimilarityThreshold
+
+instance Prelude.NFData RegistrationConfig where
+  rnf RegistrationConfig' {..} =
+    Prelude.rnf duplicateRegistrationAction
+      `Prelude.seq` Prelude.rnf fraudsterSimilarityThreshold
+
+instance Data.ToJSON RegistrationConfig where
+  toJSON RegistrationConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DuplicateRegistrationAction" Data..=)
+              Prelude.<$> duplicateRegistrationAction,
+            ("FraudsterSimilarityThreshold" Data..=)
+              Prelude.<$> fraudsterSimilarityThreshold
+          ]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/ServerSideEncryptionConfiguration.hs b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionConfiguration.hs
@@ -0,0 +1,99 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.ServerSideEncryptionConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration containing information about the customer managed key
+-- used for encrypting customer data.
+--
+-- /See:/ 'newServerSideEncryptionConfiguration' smart constructor.
+data ServerSideEncryptionConfiguration = ServerSideEncryptionConfiguration'
+  { -- | The identifier of the KMS key to use to encrypt data stored by Voice ID.
+    -- Voice ID doesn\'t support asymmetric customer managed keys.
+    kmsKeyId :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServerSideEncryptionConfiguration' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyId', 'serverSideEncryptionConfiguration_kmsKeyId' - The identifier of the KMS key to use to encrypt data stored by Voice ID.
+-- Voice ID doesn\'t support asymmetric customer managed keys.
+newServerSideEncryptionConfiguration ::
+  -- | 'kmsKeyId'
+  Prelude.Text ->
+  ServerSideEncryptionConfiguration
+newServerSideEncryptionConfiguration pKmsKeyId_ =
+  ServerSideEncryptionConfiguration'
+    { kmsKeyId =
+        pKmsKeyId_
+    }
+
+-- | The identifier of the KMS key to use to encrypt data stored by Voice ID.
+-- Voice ID doesn\'t support asymmetric customer managed keys.
+serverSideEncryptionConfiguration_kmsKeyId :: Lens.Lens' ServerSideEncryptionConfiguration Prelude.Text
+serverSideEncryptionConfiguration_kmsKeyId = Lens.lens (\ServerSideEncryptionConfiguration' {kmsKeyId} -> kmsKeyId) (\s@ServerSideEncryptionConfiguration' {} a -> s {kmsKeyId = a} :: ServerSideEncryptionConfiguration)
+
+instance
+  Data.FromJSON
+    ServerSideEncryptionConfiguration
+  where
+  parseJSON =
+    Data.withObject
+      "ServerSideEncryptionConfiguration"
+      ( \x ->
+          ServerSideEncryptionConfiguration'
+            Prelude.<$> (x Data..: "KmsKeyId")
+      )
+
+instance
+  Prelude.Hashable
+    ServerSideEncryptionConfiguration
+  where
+  hashWithSalt
+    _salt
+    ServerSideEncryptionConfiguration' {..} =
+      _salt `Prelude.hashWithSalt` kmsKeyId
+
+instance
+  Prelude.NFData
+    ServerSideEncryptionConfiguration
+  where
+  rnf ServerSideEncryptionConfiguration' {..} =
+    Prelude.rnf kmsKeyId
+
+instance
+  Data.ToJSON
+    ServerSideEncryptionConfiguration
+  where
+  toJSON ServerSideEncryptionConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("KmsKeyId" Data..= kmsKeyId)]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateDetails.hs b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateDetails.hs
@@ -0,0 +1,134 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.ServerSideEncryptionUpdateDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.ServerSideEncryptionUpdateStatus
+
+-- | Details about the most recent server-side encryption configuration
+-- update. When the server-side encryption configuration is changed,
+-- dependency on the old KMS key is removed through an asynchronous
+-- process. When this update is complete, the domain’s data can only be
+-- accessed using the new KMS key.
+--
+-- /See:/ 'newServerSideEncryptionUpdateDetails' smart constructor.
+data ServerSideEncryptionUpdateDetails = ServerSideEncryptionUpdateDetails'
+  { -- | Message explaining the current UpdateStatus. When the UpdateStatus is
+    -- FAILED, this message explains the cause of the failure.
+    message :: Prelude.Maybe Prelude.Text,
+    -- | The previous KMS key ID the domain was encrypted with, before
+    -- ServerSideEncryptionConfiguration was updated to a new KMS key ID.
+    oldKmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Status of the server-side encryption update. During an update, if there
+    -- is an issue with the domain\'s current or old KMS key ID, such as an
+    -- inaccessible or disabled key, then the status is FAILED. In order to
+    -- resolve this, the key needs to be made accessible, and then an
+    -- UpdateDomain call with the existing server-side encryption configuration
+    -- will re-attempt this update process.
+    updateStatus :: Prelude.Maybe ServerSideEncryptionUpdateStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ServerSideEncryptionUpdateDetails' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'message', 'serverSideEncryptionUpdateDetails_message' - Message explaining the current UpdateStatus. When the UpdateStatus is
+-- FAILED, this message explains the cause of the failure.
+--
+-- 'oldKmsKeyId', 'serverSideEncryptionUpdateDetails_oldKmsKeyId' - The previous KMS key ID the domain was encrypted with, before
+-- ServerSideEncryptionConfiguration was updated to a new KMS key ID.
+--
+-- 'updateStatus', 'serverSideEncryptionUpdateDetails_updateStatus' - Status of the server-side encryption update. During an update, if there
+-- is an issue with the domain\'s current or old KMS key ID, such as an
+-- inaccessible or disabled key, then the status is FAILED. In order to
+-- resolve this, the key needs to be made accessible, and then an
+-- UpdateDomain call with the existing server-side encryption configuration
+-- will re-attempt this update process.
+newServerSideEncryptionUpdateDetails ::
+  ServerSideEncryptionUpdateDetails
+newServerSideEncryptionUpdateDetails =
+  ServerSideEncryptionUpdateDetails'
+    { message =
+        Prelude.Nothing,
+      oldKmsKeyId = Prelude.Nothing,
+      updateStatus = Prelude.Nothing
+    }
+
+-- | Message explaining the current UpdateStatus. When the UpdateStatus is
+-- FAILED, this message explains the cause of the failure.
+serverSideEncryptionUpdateDetails_message :: Lens.Lens' ServerSideEncryptionUpdateDetails (Prelude.Maybe Prelude.Text)
+serverSideEncryptionUpdateDetails_message = Lens.lens (\ServerSideEncryptionUpdateDetails' {message} -> message) (\s@ServerSideEncryptionUpdateDetails' {} a -> s {message = a} :: ServerSideEncryptionUpdateDetails)
+
+-- | The previous KMS key ID the domain was encrypted with, before
+-- ServerSideEncryptionConfiguration was updated to a new KMS key ID.
+serverSideEncryptionUpdateDetails_oldKmsKeyId :: Lens.Lens' ServerSideEncryptionUpdateDetails (Prelude.Maybe Prelude.Text)
+serverSideEncryptionUpdateDetails_oldKmsKeyId = Lens.lens (\ServerSideEncryptionUpdateDetails' {oldKmsKeyId} -> oldKmsKeyId) (\s@ServerSideEncryptionUpdateDetails' {} a -> s {oldKmsKeyId = a} :: ServerSideEncryptionUpdateDetails)
+
+-- | Status of the server-side encryption update. During an update, if there
+-- is an issue with the domain\'s current or old KMS key ID, such as an
+-- inaccessible or disabled key, then the status is FAILED. In order to
+-- resolve this, the key needs to be made accessible, and then an
+-- UpdateDomain call with the existing server-side encryption configuration
+-- will re-attempt this update process.
+serverSideEncryptionUpdateDetails_updateStatus :: Lens.Lens' ServerSideEncryptionUpdateDetails (Prelude.Maybe ServerSideEncryptionUpdateStatus)
+serverSideEncryptionUpdateDetails_updateStatus = Lens.lens (\ServerSideEncryptionUpdateDetails' {updateStatus} -> updateStatus) (\s@ServerSideEncryptionUpdateDetails' {} a -> s {updateStatus = a} :: ServerSideEncryptionUpdateDetails)
+
+instance
+  Data.FromJSON
+    ServerSideEncryptionUpdateDetails
+  where
+  parseJSON =
+    Data.withObject
+      "ServerSideEncryptionUpdateDetails"
+      ( \x ->
+          ServerSideEncryptionUpdateDetails'
+            Prelude.<$> (x Data..:? "Message")
+            Prelude.<*> (x Data..:? "OldKmsKeyId")
+            Prelude.<*> (x Data..:? "UpdateStatus")
+      )
+
+instance
+  Prelude.Hashable
+    ServerSideEncryptionUpdateDetails
+  where
+  hashWithSalt
+    _salt
+    ServerSideEncryptionUpdateDetails' {..} =
+      _salt
+        `Prelude.hashWithSalt` message
+        `Prelude.hashWithSalt` oldKmsKeyId
+        `Prelude.hashWithSalt` updateStatus
+
+instance
+  Prelude.NFData
+    ServerSideEncryptionUpdateDetails
+  where
+  rnf ServerSideEncryptionUpdateDetails' {..} =
+    Prelude.rnf message
+      `Prelude.seq` Prelude.rnf oldKmsKeyId
+      `Prelude.seq` Prelude.rnf updateStatus
diff --git a/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateStatus.hs b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/ServerSideEncryptionUpdateStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.ServerSideEncryptionUpdateStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.ServerSideEncryptionUpdateStatus
+  ( ServerSideEncryptionUpdateStatus
+      ( ..,
+        ServerSideEncryptionUpdateStatus_COMPLETED,
+        ServerSideEncryptionUpdateStatus_FAILED,
+        ServerSideEncryptionUpdateStatus_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ServerSideEncryptionUpdateStatus = ServerSideEncryptionUpdateStatus'
+  { fromServerSideEncryptionUpdateStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ServerSideEncryptionUpdateStatus_COMPLETED :: ServerSideEncryptionUpdateStatus
+pattern ServerSideEncryptionUpdateStatus_COMPLETED = ServerSideEncryptionUpdateStatus' "COMPLETED"
+
+pattern ServerSideEncryptionUpdateStatus_FAILED :: ServerSideEncryptionUpdateStatus
+pattern ServerSideEncryptionUpdateStatus_FAILED = ServerSideEncryptionUpdateStatus' "FAILED"
+
+pattern ServerSideEncryptionUpdateStatus_IN_PROGRESS :: ServerSideEncryptionUpdateStatus
+pattern ServerSideEncryptionUpdateStatus_IN_PROGRESS = ServerSideEncryptionUpdateStatus' "IN_PROGRESS"
+
+{-# COMPLETE
+  ServerSideEncryptionUpdateStatus_COMPLETED,
+  ServerSideEncryptionUpdateStatus_FAILED,
+  ServerSideEncryptionUpdateStatus_IN_PROGRESS,
+  ServerSideEncryptionUpdateStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/Speaker.hs b/gen/Amazonka/VoiceId/Types/Speaker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/Speaker.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.Speaker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.Speaker where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.SpeakerStatus
+
+-- | Contains all the information about a speaker.
+--
+-- /See:/ 'newSpeaker' smart constructor.
+data Speaker = Speaker'
+  { -- | A timestamp showing when the speaker is created.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The client-provided identifier for the speaker.
+    customerSpeakerId :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The identifier of the domain that contains the speaker.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | The service-generated identifier for the speaker.
+    generatedSpeakerId :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp when the speaker was last accessed for enrollment,
+    -- re-enrollment or a successful authentication. This timestamp is accurate
+    -- to one hour.
+    lastAccessedAt :: Prelude.Maybe Data.POSIX,
+    -- | The current status of the speaker.
+    status :: Prelude.Maybe SpeakerStatus,
+    -- | A timestamp showing the speaker\'s last update.
+    updatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Speaker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'speaker_createdAt' - A timestamp showing when the speaker is created.
+--
+-- 'customerSpeakerId', 'speaker_customerSpeakerId' - The client-provided identifier for the speaker.
+--
+-- 'domainId', 'speaker_domainId' - The identifier of the domain that contains the speaker.
+--
+-- 'generatedSpeakerId', 'speaker_generatedSpeakerId' - The service-generated identifier for the speaker.
+--
+-- 'lastAccessedAt', 'speaker_lastAccessedAt' - The timestamp when the speaker was last accessed for enrollment,
+-- re-enrollment or a successful authentication. This timestamp is accurate
+-- to one hour.
+--
+-- 'status', 'speaker_status' - The current status of the speaker.
+--
+-- 'updatedAt', 'speaker_updatedAt' - A timestamp showing the speaker\'s last update.
+newSpeaker ::
+  Speaker
+newSpeaker =
+  Speaker'
+    { createdAt = Prelude.Nothing,
+      customerSpeakerId = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      generatedSpeakerId = Prelude.Nothing,
+      lastAccessedAt = Prelude.Nothing,
+      status = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | A timestamp showing when the speaker is created.
+speaker_createdAt :: Lens.Lens' Speaker (Prelude.Maybe Prelude.UTCTime)
+speaker_createdAt = Lens.lens (\Speaker' {createdAt} -> createdAt) (\s@Speaker' {} a -> s {createdAt = a} :: Speaker) Prelude.. Lens.mapping Data._Time
+
+-- | The client-provided identifier for the speaker.
+speaker_customerSpeakerId :: Lens.Lens' Speaker (Prelude.Maybe Prelude.Text)
+speaker_customerSpeakerId = Lens.lens (\Speaker' {customerSpeakerId} -> customerSpeakerId) (\s@Speaker' {} a -> s {customerSpeakerId = a} :: Speaker) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The identifier of the domain that contains the speaker.
+speaker_domainId :: Lens.Lens' Speaker (Prelude.Maybe Prelude.Text)
+speaker_domainId = Lens.lens (\Speaker' {domainId} -> domainId) (\s@Speaker' {} a -> s {domainId = a} :: Speaker)
+
+-- | The service-generated identifier for the speaker.
+speaker_generatedSpeakerId :: Lens.Lens' Speaker (Prelude.Maybe Prelude.Text)
+speaker_generatedSpeakerId = Lens.lens (\Speaker' {generatedSpeakerId} -> generatedSpeakerId) (\s@Speaker' {} a -> s {generatedSpeakerId = a} :: Speaker)
+
+-- | The timestamp when the speaker was last accessed for enrollment,
+-- re-enrollment or a successful authentication. This timestamp is accurate
+-- to one hour.
+speaker_lastAccessedAt :: Lens.Lens' Speaker (Prelude.Maybe Prelude.UTCTime)
+speaker_lastAccessedAt = Lens.lens (\Speaker' {lastAccessedAt} -> lastAccessedAt) (\s@Speaker' {} a -> s {lastAccessedAt = a} :: Speaker) Prelude.. Lens.mapping Data._Time
+
+-- | The current status of the speaker.
+speaker_status :: Lens.Lens' Speaker (Prelude.Maybe SpeakerStatus)
+speaker_status = Lens.lens (\Speaker' {status} -> status) (\s@Speaker' {} a -> s {status = a} :: Speaker)
+
+-- | A timestamp showing the speaker\'s last update.
+speaker_updatedAt :: Lens.Lens' Speaker (Prelude.Maybe Prelude.UTCTime)
+speaker_updatedAt = Lens.lens (\Speaker' {updatedAt} -> updatedAt) (\s@Speaker' {} a -> s {updatedAt = a} :: Speaker) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON Speaker where
+  parseJSON =
+    Data.withObject
+      "Speaker"
+      ( \x ->
+          Speaker'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "CustomerSpeakerId")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "GeneratedSpeakerId")
+            Prelude.<*> (x Data..:? "LastAccessedAt")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "UpdatedAt")
+      )
+
+instance Prelude.Hashable Speaker where
+  hashWithSalt _salt Speaker' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` customerSpeakerId
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` generatedSpeakerId
+      `Prelude.hashWithSalt` lastAccessedAt
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData Speaker where
+  rnf Speaker' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf customerSpeakerId
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf generatedSpeakerId
+      `Prelude.seq` Prelude.rnf lastAccessedAt
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJob.hs b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJob.hs
@@ -0,0 +1,243 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.SpeakerEnrollmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.SpeakerEnrollmentJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.EnrollmentConfig
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.InputDataConfig
+import Amazonka.VoiceId.Types.JobProgress
+import Amazonka.VoiceId.Types.OutputDataConfig
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+
+-- | Contains all the information about a speaker enrollment job.
+--
+-- /See:/ 'newSpeakerEnrollmentJob' smart constructor.
+data SpeakerEnrollmentJob = SpeakerEnrollmentJob'
+  { -- | A timestamp showing the creation of the speaker enrollment job.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+    -- to access customer\'s buckets to read the input manifest file and write
+    -- the job output file.
+    dataAccessRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The identifier of the domain that contains the speaker enrollment job.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp showing when the speaker enrollment job ended.
+    endedAt :: Prelude.Maybe Data.POSIX,
+    -- | The configuration that defines the action to take when the speaker is
+    -- already enrolled in Voice ID, and the @FraudDetectionConfig@ to use.
+    enrollmentConfig :: Prelude.Maybe EnrollmentConfig,
+    -- | Contains details that are populated when an entire batch job fails. In
+    -- cases of individual registration job failures, the batch job as a whole
+    -- doesn\'t fail; it is completed with a @JobStatus@ of
+    -- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+    -- individual registration requests that failed.
+    failureDetails :: Prelude.Maybe FailureDetails,
+    -- | The input data config containing an S3 URI for the input manifest file
+    -- that contains the list of speaker enrollment job requests.
+    inputDataConfig :: Prelude.Maybe InputDataConfig,
+    -- | The service-generated identifier for the speaker enrollment job.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The client-provided name for the speaker enrollment job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Provides details on job progress. This field shows the completed
+    -- percentage of registration requests listed in the input file.
+    jobProgress :: Prelude.Maybe JobProgress,
+    -- | The current status of the speaker enrollment job.
+    jobStatus :: Prelude.Maybe SpeakerEnrollmentJobStatus,
+    -- | The output data config containing the S3 location where Voice ID writes
+    -- the job output file; you must also include a KMS key ID to encrypt the
+    -- file.
+    outputDataConfig :: Prelude.Maybe OutputDataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SpeakerEnrollmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'speakerEnrollmentJob_createdAt' - A timestamp showing the creation of the speaker enrollment job.
+--
+-- 'dataAccessRoleArn', 'speakerEnrollmentJob_dataAccessRoleArn' - The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file.
+--
+-- 'domainId', 'speakerEnrollmentJob_domainId' - The identifier of the domain that contains the speaker enrollment job.
+--
+-- 'endedAt', 'speakerEnrollmentJob_endedAt' - A timestamp showing when the speaker enrollment job ended.
+--
+-- 'enrollmentConfig', 'speakerEnrollmentJob_enrollmentConfig' - The configuration that defines the action to take when the speaker is
+-- already enrolled in Voice ID, and the @FraudDetectionConfig@ to use.
+--
+-- 'failureDetails', 'speakerEnrollmentJob_failureDetails' - Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+--
+-- 'inputDataConfig', 'speakerEnrollmentJob_inputDataConfig' - The input data config containing an S3 URI for the input manifest file
+-- that contains the list of speaker enrollment job requests.
+--
+-- 'jobId', 'speakerEnrollmentJob_jobId' - The service-generated identifier for the speaker enrollment job.
+--
+-- 'jobName', 'speakerEnrollmentJob_jobName' - The client-provided name for the speaker enrollment job.
+--
+-- 'jobProgress', 'speakerEnrollmentJob_jobProgress' - Provides details on job progress. This field shows the completed
+-- percentage of registration requests listed in the input file.
+--
+-- 'jobStatus', 'speakerEnrollmentJob_jobStatus' - The current status of the speaker enrollment job.
+--
+-- 'outputDataConfig', 'speakerEnrollmentJob_outputDataConfig' - The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+newSpeakerEnrollmentJob ::
+  SpeakerEnrollmentJob
+newSpeakerEnrollmentJob =
+  SpeakerEnrollmentJob'
+    { createdAt = Prelude.Nothing,
+      dataAccessRoleArn = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      endedAt = Prelude.Nothing,
+      enrollmentConfig = Prelude.Nothing,
+      failureDetails = Prelude.Nothing,
+      inputDataConfig = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobProgress = Prelude.Nothing,
+      jobStatus = Prelude.Nothing,
+      outputDataConfig = Prelude.Nothing
+    }
+
+-- | A timestamp showing the creation of the speaker enrollment job.
+speakerEnrollmentJob_createdAt :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.UTCTime)
+speakerEnrollmentJob_createdAt = Lens.lens (\SpeakerEnrollmentJob' {createdAt} -> createdAt) (\s@SpeakerEnrollmentJob' {} a -> s {createdAt = a} :: SpeakerEnrollmentJob) Prelude.. Lens.mapping Data._Time
+
+-- | The IAM role Amazon Resource Name (ARN) that grants Voice ID permissions
+-- to access customer\'s buckets to read the input manifest file and write
+-- the job output file.
+speakerEnrollmentJob_dataAccessRoleArn :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJob_dataAccessRoleArn = Lens.lens (\SpeakerEnrollmentJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@SpeakerEnrollmentJob' {} a -> s {dataAccessRoleArn = a} :: SpeakerEnrollmentJob)
+
+-- | The identifier of the domain that contains the speaker enrollment job.
+speakerEnrollmentJob_domainId :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJob_domainId = Lens.lens (\SpeakerEnrollmentJob' {domainId} -> domainId) (\s@SpeakerEnrollmentJob' {} a -> s {domainId = a} :: SpeakerEnrollmentJob)
+
+-- | A timestamp showing when the speaker enrollment job ended.
+speakerEnrollmentJob_endedAt :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.UTCTime)
+speakerEnrollmentJob_endedAt = Lens.lens (\SpeakerEnrollmentJob' {endedAt} -> endedAt) (\s@SpeakerEnrollmentJob' {} a -> s {endedAt = a} :: SpeakerEnrollmentJob) Prelude.. Lens.mapping Data._Time
+
+-- | The configuration that defines the action to take when the speaker is
+-- already enrolled in Voice ID, and the @FraudDetectionConfig@ to use.
+speakerEnrollmentJob_enrollmentConfig :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe EnrollmentConfig)
+speakerEnrollmentJob_enrollmentConfig = Lens.lens (\SpeakerEnrollmentJob' {enrollmentConfig} -> enrollmentConfig) (\s@SpeakerEnrollmentJob' {} a -> s {enrollmentConfig = a} :: SpeakerEnrollmentJob)
+
+-- | Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+speakerEnrollmentJob_failureDetails :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe FailureDetails)
+speakerEnrollmentJob_failureDetails = Lens.lens (\SpeakerEnrollmentJob' {failureDetails} -> failureDetails) (\s@SpeakerEnrollmentJob' {} a -> s {failureDetails = a} :: SpeakerEnrollmentJob)
+
+-- | The input data config containing an S3 URI for the input manifest file
+-- that contains the list of speaker enrollment job requests.
+speakerEnrollmentJob_inputDataConfig :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe InputDataConfig)
+speakerEnrollmentJob_inputDataConfig = Lens.lens (\SpeakerEnrollmentJob' {inputDataConfig} -> inputDataConfig) (\s@SpeakerEnrollmentJob' {} a -> s {inputDataConfig = a} :: SpeakerEnrollmentJob)
+
+-- | The service-generated identifier for the speaker enrollment job.
+speakerEnrollmentJob_jobId :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJob_jobId = Lens.lens (\SpeakerEnrollmentJob' {jobId} -> jobId) (\s@SpeakerEnrollmentJob' {} a -> s {jobId = a} :: SpeakerEnrollmentJob)
+
+-- | The client-provided name for the speaker enrollment job.
+speakerEnrollmentJob_jobName :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJob_jobName = Lens.lens (\SpeakerEnrollmentJob' {jobName} -> jobName) (\s@SpeakerEnrollmentJob' {} a -> s {jobName = a} :: SpeakerEnrollmentJob) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Provides details on job progress. This field shows the completed
+-- percentage of registration requests listed in the input file.
+speakerEnrollmentJob_jobProgress :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe JobProgress)
+speakerEnrollmentJob_jobProgress = Lens.lens (\SpeakerEnrollmentJob' {jobProgress} -> jobProgress) (\s@SpeakerEnrollmentJob' {} a -> s {jobProgress = a} :: SpeakerEnrollmentJob)
+
+-- | The current status of the speaker enrollment job.
+speakerEnrollmentJob_jobStatus :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe SpeakerEnrollmentJobStatus)
+speakerEnrollmentJob_jobStatus = Lens.lens (\SpeakerEnrollmentJob' {jobStatus} -> jobStatus) (\s@SpeakerEnrollmentJob' {} a -> s {jobStatus = a} :: SpeakerEnrollmentJob)
+
+-- | The output data config containing the S3 location where Voice ID writes
+-- the job output file; you must also include a KMS key ID to encrypt the
+-- file.
+speakerEnrollmentJob_outputDataConfig :: Lens.Lens' SpeakerEnrollmentJob (Prelude.Maybe OutputDataConfig)
+speakerEnrollmentJob_outputDataConfig = Lens.lens (\SpeakerEnrollmentJob' {outputDataConfig} -> outputDataConfig) (\s@SpeakerEnrollmentJob' {} a -> s {outputDataConfig = a} :: SpeakerEnrollmentJob)
+
+instance Data.FromJSON SpeakerEnrollmentJob where
+  parseJSON =
+    Data.withObject
+      "SpeakerEnrollmentJob"
+      ( \x ->
+          SpeakerEnrollmentJob'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "DataAccessRoleArn")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "EndedAt")
+            Prelude.<*> (x Data..:? "EnrollmentConfig")
+            Prelude.<*> (x Data..:? "FailureDetails")
+            Prelude.<*> (x Data..:? "InputDataConfig")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "JobProgress")
+            Prelude.<*> (x Data..:? "JobStatus")
+            Prelude.<*> (x Data..:? "OutputDataConfig")
+      )
+
+instance Prelude.Hashable SpeakerEnrollmentJob where
+  hashWithSalt _salt SpeakerEnrollmentJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` endedAt
+      `Prelude.hashWithSalt` enrollmentConfig
+      `Prelude.hashWithSalt` failureDetails
+      `Prelude.hashWithSalt` inputDataConfig
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobProgress
+      `Prelude.hashWithSalt` jobStatus
+      `Prelude.hashWithSalt` outputDataConfig
+
+instance Prelude.NFData SpeakerEnrollmentJob where
+  rnf SpeakerEnrollmentJob' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf endedAt
+      `Prelude.seq` Prelude.rnf enrollmentConfig
+      `Prelude.seq` Prelude.rnf failureDetails
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobProgress
+      `Prelude.seq` Prelude.rnf jobStatus
+      `Prelude.seq` Prelude.rnf outputDataConfig
diff --git a/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobStatus.hs b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobStatus.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+  ( SpeakerEnrollmentJobStatus
+      ( ..,
+        SpeakerEnrollmentJobStatus_COMPLETED,
+        SpeakerEnrollmentJobStatus_COMPLETED_WITH_ERRORS,
+        SpeakerEnrollmentJobStatus_FAILED,
+        SpeakerEnrollmentJobStatus_IN_PROGRESS,
+        SpeakerEnrollmentJobStatus_SUBMITTED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SpeakerEnrollmentJobStatus = SpeakerEnrollmentJobStatus'
+  { fromSpeakerEnrollmentJobStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern SpeakerEnrollmentJobStatus_COMPLETED :: SpeakerEnrollmentJobStatus
+pattern SpeakerEnrollmentJobStatus_COMPLETED = SpeakerEnrollmentJobStatus' "COMPLETED"
+
+pattern SpeakerEnrollmentJobStatus_COMPLETED_WITH_ERRORS :: SpeakerEnrollmentJobStatus
+pattern SpeakerEnrollmentJobStatus_COMPLETED_WITH_ERRORS = SpeakerEnrollmentJobStatus' "COMPLETED_WITH_ERRORS"
+
+pattern SpeakerEnrollmentJobStatus_FAILED :: SpeakerEnrollmentJobStatus
+pattern SpeakerEnrollmentJobStatus_FAILED = SpeakerEnrollmentJobStatus' "FAILED"
+
+pattern SpeakerEnrollmentJobStatus_IN_PROGRESS :: SpeakerEnrollmentJobStatus
+pattern SpeakerEnrollmentJobStatus_IN_PROGRESS = SpeakerEnrollmentJobStatus' "IN_PROGRESS"
+
+pattern SpeakerEnrollmentJobStatus_SUBMITTED :: SpeakerEnrollmentJobStatus
+pattern SpeakerEnrollmentJobStatus_SUBMITTED = SpeakerEnrollmentJobStatus' "SUBMITTED"
+
+{-# COMPLETE
+  SpeakerEnrollmentJobStatus_COMPLETED,
+  SpeakerEnrollmentJobStatus_COMPLETED_WITH_ERRORS,
+  SpeakerEnrollmentJobStatus_FAILED,
+  SpeakerEnrollmentJobStatus_IN_PROGRESS,
+  SpeakerEnrollmentJobStatus_SUBMITTED,
+  SpeakerEnrollmentJobStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobSummary.hs b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/SpeakerEnrollmentJobSummary.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.SpeakerEnrollmentJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.SpeakerEnrollmentJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.FailureDetails
+import Amazonka.VoiceId.Types.JobProgress
+import Amazonka.VoiceId.Types.SpeakerEnrollmentJobStatus
+
+-- | Contains a summary of information about a speaker enrollment job.
+--
+-- /See:/ 'newSpeakerEnrollmentJobSummary' smart constructor.
+data SpeakerEnrollmentJobSummary = SpeakerEnrollmentJobSummary'
+  { -- | A timestamp showing the creation time of the speaker enrollment job.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The identifier of the domain that contains the speaker enrollment job.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | A timestamp showing when the speaker enrollment job ended.
+    endedAt :: Prelude.Maybe Data.POSIX,
+    -- | Contains details that are populated when an entire batch job fails. In
+    -- cases of individual registration job failures, the batch job as a whole
+    -- doesn\'t fail; it is completed with a @JobStatus@ of
+    -- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+    -- individual registration requests that failed.
+    failureDetails :: Prelude.Maybe FailureDetails,
+    -- | The service-generated identifier for the speaker enrollment job.
+    jobId :: Prelude.Maybe Prelude.Text,
+    -- | The client-provided name for the speaker enrollment job.
+    jobName :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | Provides details regarding job progress. This field shows the completed
+    -- percentage of enrollment requests listed in the input file.
+    jobProgress :: Prelude.Maybe JobProgress,
+    -- | The current status of the speaker enrollment job.
+    jobStatus :: Prelude.Maybe SpeakerEnrollmentJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SpeakerEnrollmentJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'speakerEnrollmentJobSummary_createdAt' - A timestamp showing the creation time of the speaker enrollment job.
+--
+-- 'domainId', 'speakerEnrollmentJobSummary_domainId' - The identifier of the domain that contains the speaker enrollment job.
+--
+-- 'endedAt', 'speakerEnrollmentJobSummary_endedAt' - A timestamp showing when the speaker enrollment job ended.
+--
+-- 'failureDetails', 'speakerEnrollmentJobSummary_failureDetails' - Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+--
+-- 'jobId', 'speakerEnrollmentJobSummary_jobId' - The service-generated identifier for the speaker enrollment job.
+--
+-- 'jobName', 'speakerEnrollmentJobSummary_jobName' - The client-provided name for the speaker enrollment job.
+--
+-- 'jobProgress', 'speakerEnrollmentJobSummary_jobProgress' - Provides details regarding job progress. This field shows the completed
+-- percentage of enrollment requests listed in the input file.
+--
+-- 'jobStatus', 'speakerEnrollmentJobSummary_jobStatus' - The current status of the speaker enrollment job.
+newSpeakerEnrollmentJobSummary ::
+  SpeakerEnrollmentJobSummary
+newSpeakerEnrollmentJobSummary =
+  SpeakerEnrollmentJobSummary'
+    { createdAt =
+        Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      endedAt = Prelude.Nothing,
+      failureDetails = Prelude.Nothing,
+      jobId = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobProgress = Prelude.Nothing,
+      jobStatus = Prelude.Nothing
+    }
+
+-- | A timestamp showing the creation time of the speaker enrollment job.
+speakerEnrollmentJobSummary_createdAt :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe Prelude.UTCTime)
+speakerEnrollmentJobSummary_createdAt = Lens.lens (\SpeakerEnrollmentJobSummary' {createdAt} -> createdAt) (\s@SpeakerEnrollmentJobSummary' {} a -> s {createdAt = a} :: SpeakerEnrollmentJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The identifier of the domain that contains the speaker enrollment job.
+speakerEnrollmentJobSummary_domainId :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJobSummary_domainId = Lens.lens (\SpeakerEnrollmentJobSummary' {domainId} -> domainId) (\s@SpeakerEnrollmentJobSummary' {} a -> s {domainId = a} :: SpeakerEnrollmentJobSummary)
+
+-- | A timestamp showing when the speaker enrollment job ended.
+speakerEnrollmentJobSummary_endedAt :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe Prelude.UTCTime)
+speakerEnrollmentJobSummary_endedAt = Lens.lens (\SpeakerEnrollmentJobSummary' {endedAt} -> endedAt) (\s@SpeakerEnrollmentJobSummary' {} a -> s {endedAt = a} :: SpeakerEnrollmentJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Contains details that are populated when an entire batch job fails. In
+-- cases of individual registration job failures, the batch job as a whole
+-- doesn\'t fail; it is completed with a @JobStatus@ of
+-- @COMPLETED_WITH_ERRORS@. You can use the job output file to identify the
+-- individual registration requests that failed.
+speakerEnrollmentJobSummary_failureDetails :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe FailureDetails)
+speakerEnrollmentJobSummary_failureDetails = Lens.lens (\SpeakerEnrollmentJobSummary' {failureDetails} -> failureDetails) (\s@SpeakerEnrollmentJobSummary' {} a -> s {failureDetails = a} :: SpeakerEnrollmentJobSummary)
+
+-- | The service-generated identifier for the speaker enrollment job.
+speakerEnrollmentJobSummary_jobId :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJobSummary_jobId = Lens.lens (\SpeakerEnrollmentJobSummary' {jobId} -> jobId) (\s@SpeakerEnrollmentJobSummary' {} a -> s {jobId = a} :: SpeakerEnrollmentJobSummary)
+
+-- | The client-provided name for the speaker enrollment job.
+speakerEnrollmentJobSummary_jobName :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe Prelude.Text)
+speakerEnrollmentJobSummary_jobName = Lens.lens (\SpeakerEnrollmentJobSummary' {jobName} -> jobName) (\s@SpeakerEnrollmentJobSummary' {} a -> s {jobName = a} :: SpeakerEnrollmentJobSummary) Prelude.. Lens.mapping Data._Sensitive
+
+-- | Provides details regarding job progress. This field shows the completed
+-- percentage of enrollment requests listed in the input file.
+speakerEnrollmentJobSummary_jobProgress :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe JobProgress)
+speakerEnrollmentJobSummary_jobProgress = Lens.lens (\SpeakerEnrollmentJobSummary' {jobProgress} -> jobProgress) (\s@SpeakerEnrollmentJobSummary' {} a -> s {jobProgress = a} :: SpeakerEnrollmentJobSummary)
+
+-- | The current status of the speaker enrollment job.
+speakerEnrollmentJobSummary_jobStatus :: Lens.Lens' SpeakerEnrollmentJobSummary (Prelude.Maybe SpeakerEnrollmentJobStatus)
+speakerEnrollmentJobSummary_jobStatus = Lens.lens (\SpeakerEnrollmentJobSummary' {jobStatus} -> jobStatus) (\s@SpeakerEnrollmentJobSummary' {} a -> s {jobStatus = a} :: SpeakerEnrollmentJobSummary)
+
+instance Data.FromJSON SpeakerEnrollmentJobSummary where
+  parseJSON =
+    Data.withObject
+      "SpeakerEnrollmentJobSummary"
+      ( \x ->
+          SpeakerEnrollmentJobSummary'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "EndedAt")
+            Prelude.<*> (x Data..:? "FailureDetails")
+            Prelude.<*> (x Data..:? "JobId")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "JobProgress")
+            Prelude.<*> (x Data..:? "JobStatus")
+      )
+
+instance Prelude.Hashable SpeakerEnrollmentJobSummary where
+  hashWithSalt _salt SpeakerEnrollmentJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` endedAt
+      `Prelude.hashWithSalt` failureDetails
+      `Prelude.hashWithSalt` jobId
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobProgress
+      `Prelude.hashWithSalt` jobStatus
+
+instance Prelude.NFData SpeakerEnrollmentJobSummary where
+  rnf SpeakerEnrollmentJobSummary' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf endedAt
+      `Prelude.seq` Prelude.rnf failureDetails
+      `Prelude.seq` Prelude.rnf jobId
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobProgress
+      `Prelude.seq` Prelude.rnf jobStatus
diff --git a/gen/Amazonka/VoiceId/Types/SpeakerStatus.hs b/gen/Amazonka/VoiceId/Types/SpeakerStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/SpeakerStatus.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.SpeakerStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.SpeakerStatus
+  ( SpeakerStatus
+      ( ..,
+        SpeakerStatus_ENROLLED,
+        SpeakerStatus_EXPIRED,
+        SpeakerStatus_OPTED_OUT,
+        SpeakerStatus_PENDING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SpeakerStatus = SpeakerStatus'
+  { fromSpeakerStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern SpeakerStatus_ENROLLED :: SpeakerStatus
+pattern SpeakerStatus_ENROLLED = SpeakerStatus' "ENROLLED"
+
+pattern SpeakerStatus_EXPIRED :: SpeakerStatus
+pattern SpeakerStatus_EXPIRED = SpeakerStatus' "EXPIRED"
+
+pattern SpeakerStatus_OPTED_OUT :: SpeakerStatus
+pattern SpeakerStatus_OPTED_OUT = SpeakerStatus' "OPTED_OUT"
+
+pattern SpeakerStatus_PENDING :: SpeakerStatus
+pattern SpeakerStatus_PENDING = SpeakerStatus' "PENDING"
+
+{-# COMPLETE
+  SpeakerStatus_ENROLLED,
+  SpeakerStatus_EXPIRED,
+  SpeakerStatus_OPTED_OUT,
+  SpeakerStatus_PENDING,
+  SpeakerStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/SpeakerSummary.hs b/gen/Amazonka/VoiceId/Types/SpeakerSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/SpeakerSummary.hs
@@ -0,0 +1,151 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.SpeakerSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.SpeakerSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Types.SpeakerStatus
+
+-- | Contains a summary of information about a speaker.
+--
+-- /See:/ 'newSpeakerSummary' smart constructor.
+data SpeakerSummary = SpeakerSummary'
+  { -- | A timestamp showing the speaker\'s creation time.
+    createdAt :: Prelude.Maybe Data.POSIX,
+    -- | The client-provided identifier for the speaker.
+    customerSpeakerId :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The identifier of the domain that contains the speaker.
+    domainId :: Prelude.Maybe Prelude.Text,
+    -- | The service-generated identifier for the speaker.
+    generatedSpeakerId :: Prelude.Maybe Prelude.Text,
+    -- | The timestamp when the speaker was last accessed for enrollment,
+    -- re-enrollment or a successful authentication. This timestamp is accurate
+    -- to one hour.
+    lastAccessedAt :: Prelude.Maybe Data.POSIX,
+    -- | The current status of the speaker.
+    status :: Prelude.Maybe SpeakerStatus,
+    -- | A timestamp showing the speaker\'s last update.
+    updatedAt :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SpeakerSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'createdAt', 'speakerSummary_createdAt' - A timestamp showing the speaker\'s creation time.
+--
+-- 'customerSpeakerId', 'speakerSummary_customerSpeakerId' - The client-provided identifier for the speaker.
+--
+-- 'domainId', 'speakerSummary_domainId' - The identifier of the domain that contains the speaker.
+--
+-- 'generatedSpeakerId', 'speakerSummary_generatedSpeakerId' - The service-generated identifier for the speaker.
+--
+-- 'lastAccessedAt', 'speakerSummary_lastAccessedAt' - The timestamp when the speaker was last accessed for enrollment,
+-- re-enrollment or a successful authentication. This timestamp is accurate
+-- to one hour.
+--
+-- 'status', 'speakerSummary_status' - The current status of the speaker.
+--
+-- 'updatedAt', 'speakerSummary_updatedAt' - A timestamp showing the speaker\'s last update.
+newSpeakerSummary ::
+  SpeakerSummary
+newSpeakerSummary =
+  SpeakerSummary'
+    { createdAt = Prelude.Nothing,
+      customerSpeakerId = Prelude.Nothing,
+      domainId = Prelude.Nothing,
+      generatedSpeakerId = Prelude.Nothing,
+      lastAccessedAt = Prelude.Nothing,
+      status = Prelude.Nothing,
+      updatedAt = Prelude.Nothing
+    }
+
+-- | A timestamp showing the speaker\'s creation time.
+speakerSummary_createdAt :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.UTCTime)
+speakerSummary_createdAt = Lens.lens (\SpeakerSummary' {createdAt} -> createdAt) (\s@SpeakerSummary' {} a -> s {createdAt = a} :: SpeakerSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The client-provided identifier for the speaker.
+speakerSummary_customerSpeakerId :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.Text)
+speakerSummary_customerSpeakerId = Lens.lens (\SpeakerSummary' {customerSpeakerId} -> customerSpeakerId) (\s@SpeakerSummary' {} a -> s {customerSpeakerId = a} :: SpeakerSummary) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The identifier of the domain that contains the speaker.
+speakerSummary_domainId :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.Text)
+speakerSummary_domainId = Lens.lens (\SpeakerSummary' {domainId} -> domainId) (\s@SpeakerSummary' {} a -> s {domainId = a} :: SpeakerSummary)
+
+-- | The service-generated identifier for the speaker.
+speakerSummary_generatedSpeakerId :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.Text)
+speakerSummary_generatedSpeakerId = Lens.lens (\SpeakerSummary' {generatedSpeakerId} -> generatedSpeakerId) (\s@SpeakerSummary' {} a -> s {generatedSpeakerId = a} :: SpeakerSummary)
+
+-- | The timestamp when the speaker was last accessed for enrollment,
+-- re-enrollment or a successful authentication. This timestamp is accurate
+-- to one hour.
+speakerSummary_lastAccessedAt :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.UTCTime)
+speakerSummary_lastAccessedAt = Lens.lens (\SpeakerSummary' {lastAccessedAt} -> lastAccessedAt) (\s@SpeakerSummary' {} a -> s {lastAccessedAt = a} :: SpeakerSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The current status of the speaker.
+speakerSummary_status :: Lens.Lens' SpeakerSummary (Prelude.Maybe SpeakerStatus)
+speakerSummary_status = Lens.lens (\SpeakerSummary' {status} -> status) (\s@SpeakerSummary' {} a -> s {status = a} :: SpeakerSummary)
+
+-- | A timestamp showing the speaker\'s last update.
+speakerSummary_updatedAt :: Lens.Lens' SpeakerSummary (Prelude.Maybe Prelude.UTCTime)
+speakerSummary_updatedAt = Lens.lens (\SpeakerSummary' {updatedAt} -> updatedAt) (\s@SpeakerSummary' {} a -> s {updatedAt = a} :: SpeakerSummary) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON SpeakerSummary where
+  parseJSON =
+    Data.withObject
+      "SpeakerSummary"
+      ( \x ->
+          SpeakerSummary'
+            Prelude.<$> (x Data..:? "CreatedAt")
+            Prelude.<*> (x Data..:? "CustomerSpeakerId")
+            Prelude.<*> (x Data..:? "DomainId")
+            Prelude.<*> (x Data..:? "GeneratedSpeakerId")
+            Prelude.<*> (x Data..:? "LastAccessedAt")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "UpdatedAt")
+      )
+
+instance Prelude.Hashable SpeakerSummary where
+  hashWithSalt _salt SpeakerSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` createdAt
+      `Prelude.hashWithSalt` customerSpeakerId
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` generatedSpeakerId
+      `Prelude.hashWithSalt` lastAccessedAt
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` updatedAt
+
+instance Prelude.NFData SpeakerSummary where
+  rnf SpeakerSummary' {..} =
+    Prelude.rnf createdAt
+      `Prelude.seq` Prelude.rnf customerSpeakerId
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf generatedSpeakerId
+      `Prelude.seq` Prelude.rnf lastAccessedAt
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf updatedAt
diff --git a/gen/Amazonka/VoiceId/Types/StreamingStatus.hs b/gen/Amazonka/VoiceId/Types/StreamingStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/StreamingStatus.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.StreamingStatus
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.StreamingStatus
+  ( StreamingStatus
+      ( ..,
+        StreamingStatus_ENDED,
+        StreamingStatus_ONGOING,
+        StreamingStatus_PENDING_CONFIGURATION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype StreamingStatus = StreamingStatus'
+  { fromStreamingStatus ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern StreamingStatus_ENDED :: StreamingStatus
+pattern StreamingStatus_ENDED = StreamingStatus' "ENDED"
+
+pattern StreamingStatus_ONGOING :: StreamingStatus
+pattern StreamingStatus_ONGOING = StreamingStatus' "ONGOING"
+
+pattern StreamingStatus_PENDING_CONFIGURATION :: StreamingStatus
+pattern StreamingStatus_PENDING_CONFIGURATION = StreamingStatus' "PENDING_CONFIGURATION"
+
+{-# COMPLETE
+  StreamingStatus_ENDED,
+  StreamingStatus_ONGOING,
+  StreamingStatus_PENDING_CONFIGURATION,
+  StreamingStatus'
+  #-}
diff --git a/gen/Amazonka/VoiceId/Types/Tag.hs b/gen/Amazonka/VoiceId/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/Tag.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The tags used to organize, track, or control access for this resource.
+-- For example, { \"tags\": {\"key1\":\"value1\", \"key2\":\"value2\"} }.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The first part of a key:value pair that forms a tag associated with a
+    -- given resource. For example, in the tag \'Department\':\'Sales\', the
+    -- key is \'Department\'.
+    key :: Data.Sensitive Prelude.Text,
+    -- | The second part of a key:value pair that forms a tag associated with a
+    -- given resource. For example, in the tag \'Department\':\'Sales\', the
+    -- value is \'Sales\'.
+    value :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'key', 'tag_key' - The first part of a key:value pair that forms a tag associated with a
+-- given resource. For example, in the tag \'Department\':\'Sales\', the
+-- key is \'Department\'.
+--
+-- 'value', 'tag_value' - The second part of a key:value pair that forms a tag associated with a
+-- given resource. For example, in the tag \'Department\':\'Sales\', the
+-- value is \'Sales\'.
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag'
+    { key = Data._Sensitive Lens.# pKey_,
+      value = Data._Sensitive Lens.# pValue_
+    }
+
+-- | The first part of a key:value pair that forms a tag associated with a
+-- given resource. For example, in the tag \'Department\':\'Sales\', the
+-- key is \'Department\'.
+tag_key :: Lens.Lens' Tag Prelude.Text
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag) Prelude.. Data._Sensitive
+
+-- | The second part of a key:value pair that forms a tag associated with a
+-- given resource. For example, in the tag \'Department\':\'Sales\', the
+-- value is \'Sales\'.
+tag_value :: Lens.Lens' Tag Prelude.Text
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag) Prelude.. Data._Sensitive
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..: "Key")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Key" Data..= key),
+            Prelude.Just ("Value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/VoiceId/Types/VoiceSpoofingRisk.hs b/gen/Amazonka/VoiceId/Types/VoiceSpoofingRisk.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Types/VoiceSpoofingRisk.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Types.VoiceSpoofingRisk
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Types.VoiceSpoofingRisk where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The details resulting from \'Voice Spoofing Risk\' analysis of the
+-- speaker.
+--
+-- /See:/ 'newVoiceSpoofingRisk' smart constructor.
+data VoiceSpoofingRisk = VoiceSpoofingRisk'
+  { -- | The score indicating the likelihood of speaker’s voice being spoofed.
+    riskScore :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VoiceSpoofingRisk' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'riskScore', 'voiceSpoofingRisk_riskScore' - The score indicating the likelihood of speaker’s voice being spoofed.
+newVoiceSpoofingRisk ::
+  -- | 'riskScore'
+  Prelude.Natural ->
+  VoiceSpoofingRisk
+newVoiceSpoofingRisk pRiskScore_ =
+  VoiceSpoofingRisk' {riskScore = pRiskScore_}
+
+-- | The score indicating the likelihood of speaker’s voice being spoofed.
+voiceSpoofingRisk_riskScore :: Lens.Lens' VoiceSpoofingRisk Prelude.Natural
+voiceSpoofingRisk_riskScore = Lens.lens (\VoiceSpoofingRisk' {riskScore} -> riskScore) (\s@VoiceSpoofingRisk' {} a -> s {riskScore = a} :: VoiceSpoofingRisk)
+
+instance Data.FromJSON VoiceSpoofingRisk where
+  parseJSON =
+    Data.withObject
+      "VoiceSpoofingRisk"
+      ( \x ->
+          VoiceSpoofingRisk'
+            Prelude.<$> (x Data..: "RiskScore")
+      )
+
+instance Prelude.Hashable VoiceSpoofingRisk where
+  hashWithSalt _salt VoiceSpoofingRisk' {..} =
+    _salt `Prelude.hashWithSalt` riskScore
+
+instance Prelude.NFData VoiceSpoofingRisk where
+  rnf VoiceSpoofingRisk' {..} = Prelude.rnf riskScore
diff --git a/gen/Amazonka/VoiceId/UntagResource.hs b/gen/Amazonka/VoiceId/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/UntagResource.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes specified tags from a specified Amazon Connect Voice ID
+-- resource.
+module Amazonka.VoiceId.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the Voice ID resource you want to
+    -- remove tags from.
+    resourceArn :: Prelude.Text,
+    -- | The list of tag keys you want to remove from the specified resource.
+    tagKeys :: [Data.Sensitive Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The Amazon Resource Name (ARN) of the Voice ID resource you want to
+-- remove tags from.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - The list of tag keys you want to remove from the specified resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the Voice ID resource you want to
+-- remove tags from.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | The list of tag keys you want to remove from the specified resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.UntagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("ResourceArn" Data..= resourceArn),
+            Prelude.Just ("TagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/UpdateDomain.hs b/gen/Amazonka/VoiceId/UpdateDomain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/UpdateDomain.hs
@@ -0,0 +1,238 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.UpdateDomain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the specified domain. This API has clobber behavior, and clears
+-- and replaces all attributes. If an optional field, such as
+-- \'Description\' is not provided, it is removed from the domain.
+module Amazonka.VoiceId.UpdateDomain
+  ( -- * Creating a Request
+    UpdateDomain (..),
+    newUpdateDomain,
+
+    -- * Request Lenses
+    updateDomain_description,
+    updateDomain_domainId,
+    updateDomain_name,
+    updateDomain_serverSideEncryptionConfiguration,
+
+    -- * Destructuring the Response
+    UpdateDomainResponse (..),
+    newUpdateDomainResponse,
+
+    -- * Response Lenses
+    updateDomainResponse_domain,
+    updateDomainResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+import Amazonka.VoiceId.Types
+
+-- | /See:/ 'newUpdateDomain' smart constructor.
+data UpdateDomain = UpdateDomain'
+  { -- | A brief description of the domain.
+    description :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The identifier of the domain to be updated.
+    domainId :: Prelude.Text,
+    -- | The name of the domain.
+    name :: Data.Sensitive Prelude.Text,
+    -- | The configuration, containing the KMS key identifier, to be used by
+    -- Voice ID for the server-side encryption of your data. Changing the
+    -- domain\'s associated KMS key immediately triggers an asynchronous
+    -- process to remove dependency on the old KMS key, such that the domain\'s
+    -- data can only be accessed using the new KMS key. The domain\'s
+    -- @ServerSideEncryptionUpdateDetails@ contains the details for this
+    -- process.
+    serverSideEncryptionConfiguration :: ServerSideEncryptionConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDomain' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'description', 'updateDomain_description' - A brief description of the domain.
+--
+-- 'domainId', 'updateDomain_domainId' - The identifier of the domain to be updated.
+--
+-- 'name', 'updateDomain_name' - The name of the domain.
+--
+-- 'serverSideEncryptionConfiguration', 'updateDomain_serverSideEncryptionConfiguration' - The configuration, containing the KMS key identifier, to be used by
+-- Voice ID for the server-side encryption of your data. Changing the
+-- domain\'s associated KMS key immediately triggers an asynchronous
+-- process to remove dependency on the old KMS key, such that the domain\'s
+-- data can only be accessed using the new KMS key. The domain\'s
+-- @ServerSideEncryptionUpdateDetails@ contains the details for this
+-- process.
+newUpdateDomain ::
+  -- | 'domainId'
+  Prelude.Text ->
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'serverSideEncryptionConfiguration'
+  ServerSideEncryptionConfiguration ->
+  UpdateDomain
+newUpdateDomain
+  pDomainId_
+  pName_
+  pServerSideEncryptionConfiguration_ =
+    UpdateDomain'
+      { description = Prelude.Nothing,
+        domainId = pDomainId_,
+        name = Data._Sensitive Lens.# pName_,
+        serverSideEncryptionConfiguration =
+          pServerSideEncryptionConfiguration_
+      }
+
+-- | A brief description of the domain.
+updateDomain_description :: Lens.Lens' UpdateDomain (Prelude.Maybe Prelude.Text)
+updateDomain_description = Lens.lens (\UpdateDomain' {description} -> description) (\s@UpdateDomain' {} a -> s {description = a} :: UpdateDomain) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The identifier of the domain to be updated.
+updateDomain_domainId :: Lens.Lens' UpdateDomain Prelude.Text
+updateDomain_domainId = Lens.lens (\UpdateDomain' {domainId} -> domainId) (\s@UpdateDomain' {} a -> s {domainId = a} :: UpdateDomain)
+
+-- | The name of the domain.
+updateDomain_name :: Lens.Lens' UpdateDomain Prelude.Text
+updateDomain_name = Lens.lens (\UpdateDomain' {name} -> name) (\s@UpdateDomain' {} a -> s {name = a} :: UpdateDomain) Prelude.. Data._Sensitive
+
+-- | The configuration, containing the KMS key identifier, to be used by
+-- Voice ID for the server-side encryption of your data. Changing the
+-- domain\'s associated KMS key immediately triggers an asynchronous
+-- process to remove dependency on the old KMS key, such that the domain\'s
+-- data can only be accessed using the new KMS key. The domain\'s
+-- @ServerSideEncryptionUpdateDetails@ contains the details for this
+-- process.
+updateDomain_serverSideEncryptionConfiguration :: Lens.Lens' UpdateDomain ServerSideEncryptionConfiguration
+updateDomain_serverSideEncryptionConfiguration = Lens.lens (\UpdateDomain' {serverSideEncryptionConfiguration} -> serverSideEncryptionConfiguration) (\s@UpdateDomain' {} a -> s {serverSideEncryptionConfiguration = a} :: UpdateDomain)
+
+instance Core.AWSRequest UpdateDomain where
+  type AWSResponse UpdateDomain = UpdateDomainResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDomainResponse'
+            Prelude.<$> (x Data..?> "Domain")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDomain where
+  hashWithSalt _salt UpdateDomain' {..} =
+    _salt
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` domainId
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` serverSideEncryptionConfiguration
+
+instance Prelude.NFData UpdateDomain where
+  rnf UpdateDomain' {..} =
+    Prelude.rnf description
+      `Prelude.seq` Prelude.rnf domainId
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf serverSideEncryptionConfiguration
+
+instance Data.ToHeaders UpdateDomain where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("VoiceID.UpdateDomain" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.0" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateDomain where
+  toJSON UpdateDomain' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            Prelude.Just ("DomainId" Data..= domainId),
+            Prelude.Just ("Name" Data..= name),
+            Prelude.Just
+              ( "ServerSideEncryptionConfiguration"
+                  Data..= serverSideEncryptionConfiguration
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateDomain where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateDomain where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateDomainResponse' smart constructor.
+data UpdateDomainResponse = UpdateDomainResponse'
+  { -- | Details about the updated domain
+    domain :: Prelude.Maybe Domain,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDomainResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'updateDomainResponse_domain' - Details about the updated domain
+--
+-- 'httpStatus', 'updateDomainResponse_httpStatus' - The response's http status code.
+newUpdateDomainResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDomainResponse
+newUpdateDomainResponse pHttpStatus_ =
+  UpdateDomainResponse'
+    { domain = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Details about the updated domain
+updateDomainResponse_domain :: Lens.Lens' UpdateDomainResponse (Prelude.Maybe Domain)
+updateDomainResponse_domain = Lens.lens (\UpdateDomainResponse' {domain} -> domain) (\s@UpdateDomainResponse' {} a -> s {domain = a} :: UpdateDomainResponse)
+
+-- | The response's http status code.
+updateDomainResponse_httpStatus :: Lens.Lens' UpdateDomainResponse Prelude.Int
+updateDomainResponse_httpStatus = Lens.lens (\UpdateDomainResponse' {httpStatus} -> httpStatus) (\s@UpdateDomainResponse' {} a -> s {httpStatus = a} :: UpdateDomainResponse)
+
+instance Prelude.NFData UpdateDomainResponse where
+  rnf UpdateDomainResponse' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/VoiceId/Waiters.hs b/gen/Amazonka/VoiceId/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/VoiceId/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.VoiceId.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.VoiceId.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+import Amazonka.VoiceId.Lens
+import Amazonka.VoiceId.Types
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.VoiceId
+import Test.Amazonka.VoiceId.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "VoiceId"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/VoiceId.hs b/test/Test/Amazonka/Gen/VoiceId.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/VoiceId.hs
@@ -0,0 +1,458 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.VoiceId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.VoiceId where
+
+import Amazonka.VoiceId
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.VoiceId.Internal
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestCreateDomain $
+--             newCreateDomain
+--
+--         , requestDeleteDomain $
+--             newDeleteDomain
+--
+--         , requestDeleteFraudster $
+--             newDeleteFraudster
+--
+--         , requestDeleteSpeaker $
+--             newDeleteSpeaker
+--
+--         , requestDescribeDomain $
+--             newDescribeDomain
+--
+--         , requestDescribeFraudster $
+--             newDescribeFraudster
+--
+--         , requestDescribeFraudsterRegistrationJob $
+--             newDescribeFraudsterRegistrationJob
+--
+--         , requestDescribeSpeaker $
+--             newDescribeSpeaker
+--
+--         , requestDescribeSpeakerEnrollmentJob $
+--             newDescribeSpeakerEnrollmentJob
+--
+--         , requestEvaluateSession $
+--             newEvaluateSession
+--
+--         , requestListDomains $
+--             newListDomains
+--
+--         , requestListFraudsterRegistrationJobs $
+--             newListFraudsterRegistrationJobs
+--
+--         , requestListSpeakerEnrollmentJobs $
+--             newListSpeakerEnrollmentJobs
+--
+--         , requestListSpeakers $
+--             newListSpeakers
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestOptOutSpeaker $
+--             newOptOutSpeaker
+--
+--         , requestStartFraudsterRegistrationJob $
+--             newStartFraudsterRegistrationJob
+--
+--         , requestStartSpeakerEnrollmentJob $
+--             newStartSpeakerEnrollmentJob
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateDomain $
+--             newUpdateDomain
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateDomain $
+--             newCreateDomainResponse
+--
+--         , responseDeleteDomain $
+--             newDeleteDomainResponse
+--
+--         , responseDeleteFraudster $
+--             newDeleteFraudsterResponse
+--
+--         , responseDeleteSpeaker $
+--             newDeleteSpeakerResponse
+--
+--         , responseDescribeDomain $
+--             newDescribeDomainResponse
+--
+--         , responseDescribeFraudster $
+--             newDescribeFraudsterResponse
+--
+--         , responseDescribeFraudsterRegistrationJob $
+--             newDescribeFraudsterRegistrationJobResponse
+--
+--         , responseDescribeSpeaker $
+--             newDescribeSpeakerResponse
+--
+--         , responseDescribeSpeakerEnrollmentJob $
+--             newDescribeSpeakerEnrollmentJobResponse
+--
+--         , responseEvaluateSession $
+--             newEvaluateSessionResponse
+--
+--         , responseListDomains $
+--             newListDomainsResponse
+--
+--         , responseListFraudsterRegistrationJobs $
+--             newListFraudsterRegistrationJobsResponse
+--
+--         , responseListSpeakerEnrollmentJobs $
+--             newListSpeakerEnrollmentJobsResponse
+--
+--         , responseListSpeakers $
+--             newListSpeakersResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseOptOutSpeaker $
+--             newOptOutSpeakerResponse
+--
+--         , responseStartFraudsterRegistrationJob $
+--             newStartFraudsterRegistrationJobResponse
+--
+--         , responseStartSpeakerEnrollmentJob $
+--             newStartSpeakerEnrollmentJobResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateDomain $
+--             newUpdateDomainResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateDomain :: CreateDomain -> TestTree
+requestCreateDomain =
+  req
+    "CreateDomain"
+    "fixture/CreateDomain.yaml"
+
+requestDeleteDomain :: DeleteDomain -> TestTree
+requestDeleteDomain =
+  req
+    "DeleteDomain"
+    "fixture/DeleteDomain.yaml"
+
+requestDeleteFraudster :: DeleteFraudster -> TestTree
+requestDeleteFraudster =
+  req
+    "DeleteFraudster"
+    "fixture/DeleteFraudster.yaml"
+
+requestDeleteSpeaker :: DeleteSpeaker -> TestTree
+requestDeleteSpeaker =
+  req
+    "DeleteSpeaker"
+    "fixture/DeleteSpeaker.yaml"
+
+requestDescribeDomain :: DescribeDomain -> TestTree
+requestDescribeDomain =
+  req
+    "DescribeDomain"
+    "fixture/DescribeDomain.yaml"
+
+requestDescribeFraudster :: DescribeFraudster -> TestTree
+requestDescribeFraudster =
+  req
+    "DescribeFraudster"
+    "fixture/DescribeFraudster.yaml"
+
+requestDescribeFraudsterRegistrationJob :: DescribeFraudsterRegistrationJob -> TestTree
+requestDescribeFraudsterRegistrationJob =
+  req
+    "DescribeFraudsterRegistrationJob"
+    "fixture/DescribeFraudsterRegistrationJob.yaml"
+
+requestDescribeSpeaker :: DescribeSpeaker -> TestTree
+requestDescribeSpeaker =
+  req
+    "DescribeSpeaker"
+    "fixture/DescribeSpeaker.yaml"
+
+requestDescribeSpeakerEnrollmentJob :: DescribeSpeakerEnrollmentJob -> TestTree
+requestDescribeSpeakerEnrollmentJob =
+  req
+    "DescribeSpeakerEnrollmentJob"
+    "fixture/DescribeSpeakerEnrollmentJob.yaml"
+
+requestEvaluateSession :: EvaluateSession -> TestTree
+requestEvaluateSession =
+  req
+    "EvaluateSession"
+    "fixture/EvaluateSession.yaml"
+
+requestListDomains :: ListDomains -> TestTree
+requestListDomains =
+  req
+    "ListDomains"
+    "fixture/ListDomains.yaml"
+
+requestListFraudsterRegistrationJobs :: ListFraudsterRegistrationJobs -> TestTree
+requestListFraudsterRegistrationJobs =
+  req
+    "ListFraudsterRegistrationJobs"
+    "fixture/ListFraudsterRegistrationJobs.yaml"
+
+requestListSpeakerEnrollmentJobs :: ListSpeakerEnrollmentJobs -> TestTree
+requestListSpeakerEnrollmentJobs =
+  req
+    "ListSpeakerEnrollmentJobs"
+    "fixture/ListSpeakerEnrollmentJobs.yaml"
+
+requestListSpeakers :: ListSpeakers -> TestTree
+requestListSpeakers =
+  req
+    "ListSpeakers"
+    "fixture/ListSpeakers.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestOptOutSpeaker :: OptOutSpeaker -> TestTree
+requestOptOutSpeaker =
+  req
+    "OptOutSpeaker"
+    "fixture/OptOutSpeaker.yaml"
+
+requestStartFraudsterRegistrationJob :: StartFraudsterRegistrationJob -> TestTree
+requestStartFraudsterRegistrationJob =
+  req
+    "StartFraudsterRegistrationJob"
+    "fixture/StartFraudsterRegistrationJob.yaml"
+
+requestStartSpeakerEnrollmentJob :: StartSpeakerEnrollmentJob -> TestTree
+requestStartSpeakerEnrollmentJob =
+  req
+    "StartSpeakerEnrollmentJob"
+    "fixture/StartSpeakerEnrollmentJob.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateDomain :: UpdateDomain -> TestTree
+requestUpdateDomain =
+  req
+    "UpdateDomain"
+    "fixture/UpdateDomain.yaml"
+
+-- Responses
+
+responseCreateDomain :: CreateDomainResponse -> TestTree
+responseCreateDomain =
+  res
+    "CreateDomainResponse"
+    "fixture/CreateDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDomain)
+
+responseDeleteDomain :: DeleteDomainResponse -> TestTree
+responseDeleteDomain =
+  res
+    "DeleteDomainResponse"
+    "fixture/DeleteDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDomain)
+
+responseDeleteFraudster :: DeleteFraudsterResponse -> TestTree
+responseDeleteFraudster =
+  res
+    "DeleteFraudsterResponse"
+    "fixture/DeleteFraudsterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteFraudster)
+
+responseDeleteSpeaker :: DeleteSpeakerResponse -> TestTree
+responseDeleteSpeaker =
+  res
+    "DeleteSpeakerResponse"
+    "fixture/DeleteSpeakerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSpeaker)
+
+responseDescribeDomain :: DescribeDomainResponse -> TestTree
+responseDescribeDomain =
+  res
+    "DescribeDomainResponse"
+    "fixture/DescribeDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDomain)
+
+responseDescribeFraudster :: DescribeFraudsterResponse -> TestTree
+responseDescribeFraudster =
+  res
+    "DescribeFraudsterResponse"
+    "fixture/DescribeFraudsterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeFraudster)
+
+responseDescribeFraudsterRegistrationJob :: DescribeFraudsterRegistrationJobResponse -> TestTree
+responseDescribeFraudsterRegistrationJob =
+  res
+    "DescribeFraudsterRegistrationJobResponse"
+    "fixture/DescribeFraudsterRegistrationJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeFraudsterRegistrationJob)
+
+responseDescribeSpeaker :: DescribeSpeakerResponse -> TestTree
+responseDescribeSpeaker =
+  res
+    "DescribeSpeakerResponse"
+    "fixture/DescribeSpeakerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSpeaker)
+
+responseDescribeSpeakerEnrollmentJob :: DescribeSpeakerEnrollmentJobResponse -> TestTree
+responseDescribeSpeakerEnrollmentJob =
+  res
+    "DescribeSpeakerEnrollmentJobResponse"
+    "fixture/DescribeSpeakerEnrollmentJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSpeakerEnrollmentJob)
+
+responseEvaluateSession :: EvaluateSessionResponse -> TestTree
+responseEvaluateSession =
+  res
+    "EvaluateSessionResponse"
+    "fixture/EvaluateSessionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy EvaluateSession)
+
+responseListDomains :: ListDomainsResponse -> TestTree
+responseListDomains =
+  res
+    "ListDomainsResponse"
+    "fixture/ListDomainsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDomains)
+
+responseListFraudsterRegistrationJobs :: ListFraudsterRegistrationJobsResponse -> TestTree
+responseListFraudsterRegistrationJobs =
+  res
+    "ListFraudsterRegistrationJobsResponse"
+    "fixture/ListFraudsterRegistrationJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListFraudsterRegistrationJobs)
+
+responseListSpeakerEnrollmentJobs :: ListSpeakerEnrollmentJobsResponse -> TestTree
+responseListSpeakerEnrollmentJobs =
+  res
+    "ListSpeakerEnrollmentJobsResponse"
+    "fixture/ListSpeakerEnrollmentJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSpeakerEnrollmentJobs)
+
+responseListSpeakers :: ListSpeakersResponse -> TestTree
+responseListSpeakers =
+  res
+    "ListSpeakersResponse"
+    "fixture/ListSpeakersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSpeakers)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseOptOutSpeaker :: OptOutSpeakerResponse -> TestTree
+responseOptOutSpeaker =
+  res
+    "OptOutSpeakerResponse"
+    "fixture/OptOutSpeakerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy OptOutSpeaker)
+
+responseStartFraudsterRegistrationJob :: StartFraudsterRegistrationJobResponse -> TestTree
+responseStartFraudsterRegistrationJob =
+  res
+    "StartFraudsterRegistrationJobResponse"
+    "fixture/StartFraudsterRegistrationJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartFraudsterRegistrationJob)
+
+responseStartSpeakerEnrollmentJob :: StartSpeakerEnrollmentJobResponse -> TestTree
+responseStartSpeakerEnrollmentJob =
+  res
+    "StartSpeakerEnrollmentJobResponse"
+    "fixture/StartSpeakerEnrollmentJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartSpeakerEnrollmentJob)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateDomain :: UpdateDomainResponse -> TestTree
+responseUpdateDomain =
+  res
+    "UpdateDomainResponse"
+    "fixture/UpdateDomainResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDomain)
diff --git a/test/Test/Amazonka/VoiceId.hs b/test/Test/Amazonka/VoiceId.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/VoiceId.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.VoiceId
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.VoiceId
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/VoiceId/Internal.hs b/test/Test/Amazonka/VoiceId/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/VoiceId/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.VoiceId.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.VoiceId.Internal where
