diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,9 +7,8 @@
 
 
 ## Version
-
-`1.6.1`
-
+ 
+`2.0` - Derived from API version @2017-10-26@ of the AWS service descriptions, licensed under Apache 2.0.
 
 ## Description
 
@@ -26,7 +25,7 @@
 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 [Network.AWS.Transcribe](http://hackage.haskell.org/package/amazonka-transcribe/docs/Network-AWS-Transcribe.html)
+See [Amazonka.Transcribe](http://hackage.haskell.org/package/amazonka-transcribe/docs/Amazonka-Transcribe.html)
 or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
 
 
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import           Distribution.Simple
-main = defaultMain
diff --git a/amazonka-transcribe.cabal b/amazonka-transcribe.cabal
--- a/amazonka-transcribe.cabal
+++ b/amazonka-transcribe.cabal
@@ -1,93 +1,176 @@
-name:                  amazonka-transcribe
-version:               1.6.1
-synopsis:              Amazon Transcribe Service 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>
-copyright:             Copyright (c) 2013-2018 Brendan Hay
-category:              Network, AWS, Cloud, Distributed Computing
-build-type:            Simple
-cabal-version:         >= 1.10
-extra-source-files:    README.md fixture/*.yaml fixture/*.proto src/.gitkeep
+cabal-version:      2.2
+name:               amazonka-transcribe
+version:            2.0
+synopsis:           Amazon Transcribe Service 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:
-    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.
-    .
-    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
-    such as <http://hackage.haskell.org/package/lens lens> or
-    <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
-    .
-    See "Network.AWS.Transcribe" or <https://aws.amazon.com/documentation/ the AWS documentation>
-    to get started.
+  Derived from API version @2017-10-26@ 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.Transcribe.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.Transcribe" 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-transcribe
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-transcribe
 
 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:
-          Network.AWS.Transcribe
-        , Network.AWS.Transcribe.CreateVocabulary
-        , Network.AWS.Transcribe.DeleteVocabulary
-        , Network.AWS.Transcribe.GetTranscriptionJob
-        , Network.AWS.Transcribe.GetVocabulary
-        , Network.AWS.Transcribe.ListTranscriptionJobs
-        , Network.AWS.Transcribe.ListVocabularies
-        , Network.AWS.Transcribe.StartTranscriptionJob
-        , Network.AWS.Transcribe.Types
-        , Network.AWS.Transcribe.UpdateVocabulary
-        , Network.AWS.Transcribe.Waiters
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
 
-    other-modules:
-          Network.AWS.Transcribe.Types.Product
-        , Network.AWS.Transcribe.Types.Sum
+  exposed-modules:
+    Amazonka.Transcribe
+    Amazonka.Transcribe.CreateCallAnalyticsCategory
+    Amazonka.Transcribe.CreateLanguageModel
+    Amazonka.Transcribe.CreateMedicalVocabulary
+    Amazonka.Transcribe.CreateVocabulary
+    Amazonka.Transcribe.CreateVocabularyFilter
+    Amazonka.Transcribe.DeleteCallAnalyticsCategory
+    Amazonka.Transcribe.DeleteCallAnalyticsJob
+    Amazonka.Transcribe.DeleteLanguageModel
+    Amazonka.Transcribe.DeleteMedicalTranscriptionJob
+    Amazonka.Transcribe.DeleteMedicalVocabulary
+    Amazonka.Transcribe.DeleteTranscriptionJob
+    Amazonka.Transcribe.DeleteVocabulary
+    Amazonka.Transcribe.DeleteVocabularyFilter
+    Amazonka.Transcribe.DescribeLanguageModel
+    Amazonka.Transcribe.GetCallAnalyticsCategory
+    Amazonka.Transcribe.GetCallAnalyticsJob
+    Amazonka.Transcribe.GetMedicalTranscriptionJob
+    Amazonka.Transcribe.GetMedicalVocabulary
+    Amazonka.Transcribe.GetTranscriptionJob
+    Amazonka.Transcribe.GetVocabulary
+    Amazonka.Transcribe.GetVocabularyFilter
+    Amazonka.Transcribe.Lens
+    Amazonka.Transcribe.ListCallAnalyticsCategories
+    Amazonka.Transcribe.ListCallAnalyticsJobs
+    Amazonka.Transcribe.ListLanguageModels
+    Amazonka.Transcribe.ListMedicalTranscriptionJobs
+    Amazonka.Transcribe.ListMedicalVocabularies
+    Amazonka.Transcribe.ListTagsForResource
+    Amazonka.Transcribe.ListTranscriptionJobs
+    Amazonka.Transcribe.ListVocabularies
+    Amazonka.Transcribe.ListVocabularyFilters
+    Amazonka.Transcribe.StartCallAnalyticsJob
+    Amazonka.Transcribe.StartMedicalTranscriptionJob
+    Amazonka.Transcribe.StartTranscriptionJob
+    Amazonka.Transcribe.TagResource
+    Amazonka.Transcribe.Types
+    Amazonka.Transcribe.Types.AbsoluteTimeRange
+    Amazonka.Transcribe.Types.BaseModelName
+    Amazonka.Transcribe.Types.CallAnalyticsJob
+    Amazonka.Transcribe.Types.CallAnalyticsJobSettings
+    Amazonka.Transcribe.Types.CallAnalyticsJobStatus
+    Amazonka.Transcribe.Types.CallAnalyticsJobSummary
+    Amazonka.Transcribe.Types.CategoryProperties
+    Amazonka.Transcribe.Types.ChannelDefinition
+    Amazonka.Transcribe.Types.CLMLanguageCode
+    Amazonka.Transcribe.Types.ContentRedaction
+    Amazonka.Transcribe.Types.InputDataConfig
+    Amazonka.Transcribe.Types.InputType
+    Amazonka.Transcribe.Types.InterruptionFilter
+    Amazonka.Transcribe.Types.JobExecutionSettings
+    Amazonka.Transcribe.Types.LanguageCode
+    Amazonka.Transcribe.Types.LanguageCodeItem
+    Amazonka.Transcribe.Types.LanguageIdSettings
+    Amazonka.Transcribe.Types.LanguageModel
+    Amazonka.Transcribe.Types.Media
+    Amazonka.Transcribe.Types.MediaFormat
+    Amazonka.Transcribe.Types.MedicalContentIdentificationType
+    Amazonka.Transcribe.Types.MedicalTranscript
+    Amazonka.Transcribe.Types.MedicalTranscriptionJob
+    Amazonka.Transcribe.Types.MedicalTranscriptionJobSummary
+    Amazonka.Transcribe.Types.MedicalTranscriptionSetting
+    Amazonka.Transcribe.Types.ModelSettings
+    Amazonka.Transcribe.Types.ModelStatus
+    Amazonka.Transcribe.Types.NonTalkTimeFilter
+    Amazonka.Transcribe.Types.OutputLocationType
+    Amazonka.Transcribe.Types.ParticipantRole
+    Amazonka.Transcribe.Types.PiiEntityType
+    Amazonka.Transcribe.Types.RedactionOutput
+    Amazonka.Transcribe.Types.RedactionType
+    Amazonka.Transcribe.Types.RelativeTimeRange
+    Amazonka.Transcribe.Types.Rule
+    Amazonka.Transcribe.Types.SentimentFilter
+    Amazonka.Transcribe.Types.SentimentValue
+    Amazonka.Transcribe.Types.Settings
+    Amazonka.Transcribe.Types.Specialty
+    Amazonka.Transcribe.Types.SubtitleFormat
+    Amazonka.Transcribe.Types.Subtitles
+    Amazonka.Transcribe.Types.SubtitlesOutput
+    Amazonka.Transcribe.Types.Tag
+    Amazonka.Transcribe.Types.Transcript
+    Amazonka.Transcribe.Types.TranscriptFilter
+    Amazonka.Transcribe.Types.TranscriptFilterType
+    Amazonka.Transcribe.Types.TranscriptionJob
+    Amazonka.Transcribe.Types.TranscriptionJobStatus
+    Amazonka.Transcribe.Types.TranscriptionJobSummary
+    Amazonka.Transcribe.Types.Type
+    Amazonka.Transcribe.Types.VocabularyFilterInfo
+    Amazonka.Transcribe.Types.VocabularyFilterMethod
+    Amazonka.Transcribe.Types.VocabularyInfo
+    Amazonka.Transcribe.Types.VocabularyState
+    Amazonka.Transcribe.UntagResource
+    Amazonka.Transcribe.UpdateCallAnalyticsCategory
+    Amazonka.Transcribe.UpdateMedicalVocabulary
+    Amazonka.Transcribe.UpdateVocabulary
+    Amazonka.Transcribe.UpdateVocabularyFilter
+    Amazonka.Transcribe.Waiters
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , base          >= 4.7     && < 5
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
 
 test-suite amazonka-transcribe-test
-    type:              exitcode-stdio-1.0
-    default-language:  Haskell2010
-    hs-source-dirs:    test
-    main-is:           Main.hs
-
-    ghc-options:       -Wall -threaded
+  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.AWS.Transcribe
-        , Test.AWS.Gen.Transcribe
-        , Test.AWS.Transcribe.Internal
+  -- 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.Transcribe
+    Test.Amazonka.Transcribe
+    Test.Amazonka.Transcribe.Internal
 
-    build-depends:
-          amazonka-core == 1.6.1.*
-        , amazonka-test == 1.6.1.*
-        , amazonka-transcribe
-        , base
-        , bytestring
-        , tasty
-        , tasty-hunit
-        , text
-        , time
-        , unordered-containers
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-test         >=2.0 && <2.1
+    , amazonka-transcribe
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateCallAnalyticsCategory.yaml b/fixture/CreateCallAnalyticsCategory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCallAnalyticsCategory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/CreateCallAnalyticsCategoryResponse.proto b/fixture/CreateCallAnalyticsCategoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCallAnalyticsCategoryResponse.proto
diff --git a/fixture/CreateLanguageModel.yaml b/fixture/CreateLanguageModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateLanguageModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/CreateLanguageModelResponse.proto b/fixture/CreateLanguageModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateLanguageModelResponse.proto
diff --git a/fixture/CreateMedicalVocabulary.yaml b/fixture/CreateMedicalVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMedicalVocabulary.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/CreateMedicalVocabularyResponse.proto b/fixture/CreateMedicalVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMedicalVocabularyResponse.proto
diff --git a/fixture/CreateVocabularyFilter.yaml b/fixture/CreateVocabularyFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVocabularyFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/CreateVocabularyFilterResponse.proto b/fixture/CreateVocabularyFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVocabularyFilterResponse.proto
diff --git a/fixture/DeleteCallAnalyticsCategory.yaml b/fixture/DeleteCallAnalyticsCategory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCallAnalyticsCategory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteCallAnalyticsCategoryResponse.proto b/fixture/DeleteCallAnalyticsCategoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCallAnalyticsCategoryResponse.proto
diff --git a/fixture/DeleteCallAnalyticsJob.yaml b/fixture/DeleteCallAnalyticsJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCallAnalyticsJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteCallAnalyticsJobResponse.proto b/fixture/DeleteCallAnalyticsJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCallAnalyticsJobResponse.proto
diff --git a/fixture/DeleteLanguageModel.yaml b/fixture/DeleteLanguageModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLanguageModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteLanguageModelResponse.proto b/fixture/DeleteLanguageModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteLanguageModelResponse.proto
diff --git a/fixture/DeleteMedicalTranscriptionJob.yaml b/fixture/DeleteMedicalTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMedicalTranscriptionJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteMedicalTranscriptionJobResponse.proto b/fixture/DeleteMedicalTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMedicalTranscriptionJobResponse.proto
diff --git a/fixture/DeleteMedicalVocabulary.yaml b/fixture/DeleteMedicalVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMedicalVocabulary.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteMedicalVocabularyResponse.proto b/fixture/DeleteMedicalVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMedicalVocabularyResponse.proto
diff --git a/fixture/DeleteTranscriptionJob.yaml b/fixture/DeleteTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTranscriptionJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteTranscriptionJobResponse.proto b/fixture/DeleteTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteTranscriptionJobResponse.proto
diff --git a/fixture/DeleteVocabularyFilter.yaml b/fixture/DeleteVocabularyFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVocabularyFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DeleteVocabularyFilterResponse.proto b/fixture/DeleteVocabularyFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVocabularyFilterResponse.proto
diff --git a/fixture/DescribeLanguageModel.yaml b/fixture/DescribeLanguageModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeLanguageModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/DescribeLanguageModelResponse.proto b/fixture/DescribeLanguageModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeLanguageModelResponse.proto
diff --git a/fixture/GetCallAnalyticsCategory.yaml b/fixture/GetCallAnalyticsCategory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCallAnalyticsCategory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/GetCallAnalyticsCategoryResponse.proto b/fixture/GetCallAnalyticsCategoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCallAnalyticsCategoryResponse.proto
diff --git a/fixture/GetCallAnalyticsJob.yaml b/fixture/GetCallAnalyticsJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetCallAnalyticsJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/GetCallAnalyticsJobResponse.proto b/fixture/GetCallAnalyticsJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetCallAnalyticsJobResponse.proto
diff --git a/fixture/GetMedicalTranscriptionJob.yaml b/fixture/GetMedicalTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetMedicalTranscriptionJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/GetMedicalTranscriptionJobResponse.proto b/fixture/GetMedicalTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetMedicalTranscriptionJobResponse.proto
diff --git a/fixture/GetMedicalVocabulary.yaml b/fixture/GetMedicalVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetMedicalVocabulary.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/GetMedicalVocabularyResponse.proto b/fixture/GetMedicalVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetMedicalVocabularyResponse.proto
diff --git a/fixture/GetVocabularyFilter.yaml b/fixture/GetVocabularyFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetVocabularyFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/GetVocabularyFilterResponse.proto b/fixture/GetVocabularyFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetVocabularyFilterResponse.proto
diff --git a/fixture/ListCallAnalyticsCategories.yaml b/fixture/ListCallAnalyticsCategories.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListCallAnalyticsCategories.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListCallAnalyticsCategoriesResponse.proto b/fixture/ListCallAnalyticsCategoriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListCallAnalyticsCategoriesResponse.proto
diff --git a/fixture/ListCallAnalyticsJobs.yaml b/fixture/ListCallAnalyticsJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListCallAnalyticsJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListCallAnalyticsJobsResponse.proto b/fixture/ListCallAnalyticsJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListCallAnalyticsJobsResponse.proto
diff --git a/fixture/ListLanguageModels.yaml b/fixture/ListLanguageModels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListLanguageModels.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListLanguageModelsResponse.proto b/fixture/ListLanguageModelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListLanguageModelsResponse.proto
diff --git a/fixture/ListMedicalTranscriptionJobs.yaml b/fixture/ListMedicalTranscriptionJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMedicalTranscriptionJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListMedicalTranscriptionJobsResponse.proto b/fixture/ListMedicalTranscriptionJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMedicalTranscriptionJobsResponse.proto
diff --git a/fixture/ListMedicalVocabularies.yaml b/fixture/ListMedicalVocabularies.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMedicalVocabularies.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListMedicalVocabulariesResponse.proto b/fixture/ListMedicalVocabulariesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMedicalVocabulariesResponse.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/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListVocabularyFilters.yaml b/fixture/ListVocabularyFilters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVocabularyFilters.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/ListVocabularyFiltersResponse.proto b/fixture/ListVocabularyFiltersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVocabularyFiltersResponse.proto
diff --git a/fixture/StartCallAnalyticsJob.yaml b/fixture/StartCallAnalyticsJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartCallAnalyticsJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/StartCallAnalyticsJobResponse.proto b/fixture/StartCallAnalyticsJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartCallAnalyticsJobResponse.proto
diff --git a/fixture/StartMedicalTranscriptionJob.yaml b/fixture/StartMedicalTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartMedicalTranscriptionJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/StartMedicalTranscriptionJobResponse.proto b/fixture/StartMedicalTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartMedicalTranscriptionJobResponse.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/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/UpdateCallAnalyticsCategory.yaml b/fixture/UpdateCallAnalyticsCategory.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCallAnalyticsCategory.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/UpdateCallAnalyticsCategoryResponse.proto b/fixture/UpdateCallAnalyticsCategoryResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCallAnalyticsCategoryResponse.proto
diff --git a/fixture/UpdateMedicalVocabulary.yaml b/fixture/UpdateMedicalVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMedicalVocabulary.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/UpdateMedicalVocabularyResponse.proto b/fixture/UpdateMedicalVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMedicalVocabularyResponse.proto
diff --git a/fixture/UpdateVocabularyFilter.yaml b/fixture/UpdateVocabularyFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVocabularyFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  transcribe.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/UpdateVocabularyFilterResponse.proto b/fixture/UpdateVocabularyFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVocabularyFilterResponse.proto
diff --git a/gen/Amazonka/Transcribe.hs b/gen/Amazonka/Transcribe.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe.hs
@@ -0,0 +1,558 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Transcribe
+-- 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 @2017-10-26@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Transcribe offers three main types of batch transcription:
+-- __Standard__, __Medical__, and __Call Analytics__.
+--
+-- -   __Standard transcriptions__ are the most common option. Refer to for
+--     details.
+--
+-- -   __Medical transcriptions__ are tailored to medical professionals and
+--     incorporate medical terms. A common use case for this service is
+--     transcribing doctor-patient dialogue into after-visit notes. Refer
+--     to for details.
+--
+-- -   __Call Analytics transcriptions__ are designed for use with call
+--     center audio on two different channels; if you\'re looking for
+--     insight into customer service calls, use this option. Refer to for
+--     details.
+module Amazonka.Transcribe
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** BadRequestException
+    _BadRequestException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalFailureException
+    _InternalFailureException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** NotFoundException
+    _NotFoundException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateCallAnalyticsCategory
+    CreateCallAnalyticsCategory (CreateCallAnalyticsCategory'),
+    newCreateCallAnalyticsCategory,
+    CreateCallAnalyticsCategoryResponse (CreateCallAnalyticsCategoryResponse'),
+    newCreateCallAnalyticsCategoryResponse,
+
+    -- ** CreateLanguageModel
+    CreateLanguageModel (CreateLanguageModel'),
+    newCreateLanguageModel,
+    CreateLanguageModelResponse (CreateLanguageModelResponse'),
+    newCreateLanguageModelResponse,
+
+    -- ** CreateMedicalVocabulary
+    CreateMedicalVocabulary (CreateMedicalVocabulary'),
+    newCreateMedicalVocabulary,
+    CreateMedicalVocabularyResponse (CreateMedicalVocabularyResponse'),
+    newCreateMedicalVocabularyResponse,
+
+    -- ** CreateVocabulary
+    CreateVocabulary (CreateVocabulary'),
+    newCreateVocabulary,
+    CreateVocabularyResponse (CreateVocabularyResponse'),
+    newCreateVocabularyResponse,
+
+    -- ** CreateVocabularyFilter
+    CreateVocabularyFilter (CreateVocabularyFilter'),
+    newCreateVocabularyFilter,
+    CreateVocabularyFilterResponse (CreateVocabularyFilterResponse'),
+    newCreateVocabularyFilterResponse,
+
+    -- ** DeleteCallAnalyticsCategory
+    DeleteCallAnalyticsCategory (DeleteCallAnalyticsCategory'),
+    newDeleteCallAnalyticsCategory,
+    DeleteCallAnalyticsCategoryResponse (DeleteCallAnalyticsCategoryResponse'),
+    newDeleteCallAnalyticsCategoryResponse,
+
+    -- ** DeleteCallAnalyticsJob
+    DeleteCallAnalyticsJob (DeleteCallAnalyticsJob'),
+    newDeleteCallAnalyticsJob,
+    DeleteCallAnalyticsJobResponse (DeleteCallAnalyticsJobResponse'),
+    newDeleteCallAnalyticsJobResponse,
+
+    -- ** DeleteLanguageModel
+    DeleteLanguageModel (DeleteLanguageModel'),
+    newDeleteLanguageModel,
+    DeleteLanguageModelResponse (DeleteLanguageModelResponse'),
+    newDeleteLanguageModelResponse,
+
+    -- ** DeleteMedicalTranscriptionJob
+    DeleteMedicalTranscriptionJob (DeleteMedicalTranscriptionJob'),
+    newDeleteMedicalTranscriptionJob,
+    DeleteMedicalTranscriptionJobResponse (DeleteMedicalTranscriptionJobResponse'),
+    newDeleteMedicalTranscriptionJobResponse,
+
+    -- ** DeleteMedicalVocabulary
+    DeleteMedicalVocabulary (DeleteMedicalVocabulary'),
+    newDeleteMedicalVocabulary,
+    DeleteMedicalVocabularyResponse (DeleteMedicalVocabularyResponse'),
+    newDeleteMedicalVocabularyResponse,
+
+    -- ** DeleteTranscriptionJob
+    DeleteTranscriptionJob (DeleteTranscriptionJob'),
+    newDeleteTranscriptionJob,
+    DeleteTranscriptionJobResponse (DeleteTranscriptionJobResponse'),
+    newDeleteTranscriptionJobResponse,
+
+    -- ** DeleteVocabulary
+    DeleteVocabulary (DeleteVocabulary'),
+    newDeleteVocabulary,
+    DeleteVocabularyResponse (DeleteVocabularyResponse'),
+    newDeleteVocabularyResponse,
+
+    -- ** DeleteVocabularyFilter
+    DeleteVocabularyFilter (DeleteVocabularyFilter'),
+    newDeleteVocabularyFilter,
+    DeleteVocabularyFilterResponse (DeleteVocabularyFilterResponse'),
+    newDeleteVocabularyFilterResponse,
+
+    -- ** DescribeLanguageModel
+    DescribeLanguageModel (DescribeLanguageModel'),
+    newDescribeLanguageModel,
+    DescribeLanguageModelResponse (DescribeLanguageModelResponse'),
+    newDescribeLanguageModelResponse,
+
+    -- ** GetCallAnalyticsCategory
+    GetCallAnalyticsCategory (GetCallAnalyticsCategory'),
+    newGetCallAnalyticsCategory,
+    GetCallAnalyticsCategoryResponse (GetCallAnalyticsCategoryResponse'),
+    newGetCallAnalyticsCategoryResponse,
+
+    -- ** GetCallAnalyticsJob
+    GetCallAnalyticsJob (GetCallAnalyticsJob'),
+    newGetCallAnalyticsJob,
+    GetCallAnalyticsJobResponse (GetCallAnalyticsJobResponse'),
+    newGetCallAnalyticsJobResponse,
+
+    -- ** GetMedicalTranscriptionJob
+    GetMedicalTranscriptionJob (GetMedicalTranscriptionJob'),
+    newGetMedicalTranscriptionJob,
+    GetMedicalTranscriptionJobResponse (GetMedicalTranscriptionJobResponse'),
+    newGetMedicalTranscriptionJobResponse,
+
+    -- ** GetMedicalVocabulary
+    GetMedicalVocabulary (GetMedicalVocabulary'),
+    newGetMedicalVocabulary,
+    GetMedicalVocabularyResponse (GetMedicalVocabularyResponse'),
+    newGetMedicalVocabularyResponse,
+
+    -- ** GetTranscriptionJob
+    GetTranscriptionJob (GetTranscriptionJob'),
+    newGetTranscriptionJob,
+    GetTranscriptionJobResponse (GetTranscriptionJobResponse'),
+    newGetTranscriptionJobResponse,
+
+    -- ** GetVocabulary
+    GetVocabulary (GetVocabulary'),
+    newGetVocabulary,
+    GetVocabularyResponse (GetVocabularyResponse'),
+    newGetVocabularyResponse,
+
+    -- ** GetVocabularyFilter
+    GetVocabularyFilter (GetVocabularyFilter'),
+    newGetVocabularyFilter,
+    GetVocabularyFilterResponse (GetVocabularyFilterResponse'),
+    newGetVocabularyFilterResponse,
+
+    -- ** ListCallAnalyticsCategories
+    ListCallAnalyticsCategories (ListCallAnalyticsCategories'),
+    newListCallAnalyticsCategories,
+    ListCallAnalyticsCategoriesResponse (ListCallAnalyticsCategoriesResponse'),
+    newListCallAnalyticsCategoriesResponse,
+
+    -- ** ListCallAnalyticsJobs
+    ListCallAnalyticsJobs (ListCallAnalyticsJobs'),
+    newListCallAnalyticsJobs,
+    ListCallAnalyticsJobsResponse (ListCallAnalyticsJobsResponse'),
+    newListCallAnalyticsJobsResponse,
+
+    -- ** ListLanguageModels
+    ListLanguageModels (ListLanguageModels'),
+    newListLanguageModels,
+    ListLanguageModelsResponse (ListLanguageModelsResponse'),
+    newListLanguageModelsResponse,
+
+    -- ** ListMedicalTranscriptionJobs
+    ListMedicalTranscriptionJobs (ListMedicalTranscriptionJobs'),
+    newListMedicalTranscriptionJobs,
+    ListMedicalTranscriptionJobsResponse (ListMedicalTranscriptionJobsResponse'),
+    newListMedicalTranscriptionJobsResponse,
+
+    -- ** ListMedicalVocabularies
+    ListMedicalVocabularies (ListMedicalVocabularies'),
+    newListMedicalVocabularies,
+    ListMedicalVocabulariesResponse (ListMedicalVocabulariesResponse'),
+    newListMedicalVocabulariesResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** ListTranscriptionJobs
+    ListTranscriptionJobs (ListTranscriptionJobs'),
+    newListTranscriptionJobs,
+    ListTranscriptionJobsResponse (ListTranscriptionJobsResponse'),
+    newListTranscriptionJobsResponse,
+
+    -- ** ListVocabularies
+    ListVocabularies (ListVocabularies'),
+    newListVocabularies,
+    ListVocabulariesResponse (ListVocabulariesResponse'),
+    newListVocabulariesResponse,
+
+    -- ** ListVocabularyFilters
+    ListVocabularyFilters (ListVocabularyFilters'),
+    newListVocabularyFilters,
+    ListVocabularyFiltersResponse (ListVocabularyFiltersResponse'),
+    newListVocabularyFiltersResponse,
+
+    -- ** StartCallAnalyticsJob
+    StartCallAnalyticsJob (StartCallAnalyticsJob'),
+    newStartCallAnalyticsJob,
+    StartCallAnalyticsJobResponse (StartCallAnalyticsJobResponse'),
+    newStartCallAnalyticsJobResponse,
+
+    -- ** StartMedicalTranscriptionJob
+    StartMedicalTranscriptionJob (StartMedicalTranscriptionJob'),
+    newStartMedicalTranscriptionJob,
+    StartMedicalTranscriptionJobResponse (StartMedicalTranscriptionJobResponse'),
+    newStartMedicalTranscriptionJobResponse,
+
+    -- ** StartTranscriptionJob
+    StartTranscriptionJob (StartTranscriptionJob'),
+    newStartTranscriptionJob,
+    StartTranscriptionJobResponse (StartTranscriptionJobResponse'),
+    newStartTranscriptionJobResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateCallAnalyticsCategory
+    UpdateCallAnalyticsCategory (UpdateCallAnalyticsCategory'),
+    newUpdateCallAnalyticsCategory,
+    UpdateCallAnalyticsCategoryResponse (UpdateCallAnalyticsCategoryResponse'),
+    newUpdateCallAnalyticsCategoryResponse,
+
+    -- ** UpdateMedicalVocabulary
+    UpdateMedicalVocabulary (UpdateMedicalVocabulary'),
+    newUpdateMedicalVocabulary,
+    UpdateMedicalVocabularyResponse (UpdateMedicalVocabularyResponse'),
+    newUpdateMedicalVocabularyResponse,
+
+    -- ** UpdateVocabulary
+    UpdateVocabulary (UpdateVocabulary'),
+    newUpdateVocabulary,
+    UpdateVocabularyResponse (UpdateVocabularyResponse'),
+    newUpdateVocabularyResponse,
+
+    -- ** UpdateVocabularyFilter
+    UpdateVocabularyFilter (UpdateVocabularyFilter'),
+    newUpdateVocabularyFilter,
+    UpdateVocabularyFilterResponse (UpdateVocabularyFilterResponse'),
+    newUpdateVocabularyFilterResponse,
+
+    -- * Types
+
+    -- ** BaseModelName
+    BaseModelName (..),
+
+    -- ** CLMLanguageCode
+    CLMLanguageCode (..),
+
+    -- ** CallAnalyticsJobStatus
+    CallAnalyticsJobStatus (..),
+
+    -- ** InputType
+    InputType (..),
+
+    -- ** LanguageCode
+    LanguageCode (..),
+
+    -- ** MediaFormat
+    MediaFormat (..),
+
+    -- ** MedicalContentIdentificationType
+    MedicalContentIdentificationType (..),
+
+    -- ** ModelStatus
+    ModelStatus (..),
+
+    -- ** OutputLocationType
+    OutputLocationType (..),
+
+    -- ** ParticipantRole
+    ParticipantRole (..),
+
+    -- ** PiiEntityType
+    PiiEntityType (..),
+
+    -- ** RedactionOutput
+    RedactionOutput (..),
+
+    -- ** RedactionType
+    RedactionType (..),
+
+    -- ** SentimentValue
+    SentimentValue (..),
+
+    -- ** Specialty
+    Specialty (..),
+
+    -- ** SubtitleFormat
+    SubtitleFormat (..),
+
+    -- ** TranscriptFilterType
+    TranscriptFilterType (..),
+
+    -- ** TranscriptionJobStatus
+    TranscriptionJobStatus (..),
+
+    -- ** Type
+    Type (..),
+
+    -- ** VocabularyFilterMethod
+    VocabularyFilterMethod (..),
+
+    -- ** VocabularyState
+    VocabularyState (..),
+
+    -- ** AbsoluteTimeRange
+    AbsoluteTimeRange (AbsoluteTimeRange'),
+    newAbsoluteTimeRange,
+
+    -- ** CallAnalyticsJob
+    CallAnalyticsJob (CallAnalyticsJob'),
+    newCallAnalyticsJob,
+
+    -- ** CallAnalyticsJobSettings
+    CallAnalyticsJobSettings (CallAnalyticsJobSettings'),
+    newCallAnalyticsJobSettings,
+
+    -- ** CallAnalyticsJobSummary
+    CallAnalyticsJobSummary (CallAnalyticsJobSummary'),
+    newCallAnalyticsJobSummary,
+
+    -- ** CategoryProperties
+    CategoryProperties (CategoryProperties'),
+    newCategoryProperties,
+
+    -- ** ChannelDefinition
+    ChannelDefinition (ChannelDefinition'),
+    newChannelDefinition,
+
+    -- ** ContentRedaction
+    ContentRedaction (ContentRedaction'),
+    newContentRedaction,
+
+    -- ** InputDataConfig
+    InputDataConfig (InputDataConfig'),
+    newInputDataConfig,
+
+    -- ** InterruptionFilter
+    InterruptionFilter (InterruptionFilter'),
+    newInterruptionFilter,
+
+    -- ** JobExecutionSettings
+    JobExecutionSettings (JobExecutionSettings'),
+    newJobExecutionSettings,
+
+    -- ** LanguageCodeItem
+    LanguageCodeItem (LanguageCodeItem'),
+    newLanguageCodeItem,
+
+    -- ** LanguageIdSettings
+    LanguageIdSettings (LanguageIdSettings'),
+    newLanguageIdSettings,
+
+    -- ** LanguageModel
+    LanguageModel (LanguageModel'),
+    newLanguageModel,
+
+    -- ** Media
+    Media (Media'),
+    newMedia,
+
+    -- ** MedicalTranscript
+    MedicalTranscript (MedicalTranscript'),
+    newMedicalTranscript,
+
+    -- ** MedicalTranscriptionJob
+    MedicalTranscriptionJob (MedicalTranscriptionJob'),
+    newMedicalTranscriptionJob,
+
+    -- ** MedicalTranscriptionJobSummary
+    MedicalTranscriptionJobSummary (MedicalTranscriptionJobSummary'),
+    newMedicalTranscriptionJobSummary,
+
+    -- ** MedicalTranscriptionSetting
+    MedicalTranscriptionSetting (MedicalTranscriptionSetting'),
+    newMedicalTranscriptionSetting,
+
+    -- ** ModelSettings
+    ModelSettings (ModelSettings'),
+    newModelSettings,
+
+    -- ** NonTalkTimeFilter
+    NonTalkTimeFilter (NonTalkTimeFilter'),
+    newNonTalkTimeFilter,
+
+    -- ** RelativeTimeRange
+    RelativeTimeRange (RelativeTimeRange'),
+    newRelativeTimeRange,
+
+    -- ** Rule
+    Rule (Rule'),
+    newRule,
+
+    -- ** SentimentFilter
+    SentimentFilter (SentimentFilter'),
+    newSentimentFilter,
+
+    -- ** Settings
+    Settings (Settings'),
+    newSettings,
+
+    -- ** Subtitles
+    Subtitles (Subtitles'),
+    newSubtitles,
+
+    -- ** SubtitlesOutput
+    SubtitlesOutput (SubtitlesOutput'),
+    newSubtitlesOutput,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** Transcript
+    Transcript (Transcript'),
+    newTranscript,
+
+    -- ** TranscriptFilter
+    TranscriptFilter (TranscriptFilter'),
+    newTranscriptFilter,
+
+    -- ** TranscriptionJob
+    TranscriptionJob (TranscriptionJob'),
+    newTranscriptionJob,
+
+    -- ** TranscriptionJobSummary
+    TranscriptionJobSummary (TranscriptionJobSummary'),
+    newTranscriptionJobSummary,
+
+    -- ** VocabularyFilterInfo
+    VocabularyFilterInfo (VocabularyFilterInfo'),
+    newVocabularyFilterInfo,
+
+    -- ** VocabularyInfo
+    VocabularyInfo (VocabularyInfo'),
+    newVocabularyInfo,
+  )
+where
+
+import Amazonka.Transcribe.CreateCallAnalyticsCategory
+import Amazonka.Transcribe.CreateLanguageModel
+import Amazonka.Transcribe.CreateMedicalVocabulary
+import Amazonka.Transcribe.CreateVocabulary
+import Amazonka.Transcribe.CreateVocabularyFilter
+import Amazonka.Transcribe.DeleteCallAnalyticsCategory
+import Amazonka.Transcribe.DeleteCallAnalyticsJob
+import Amazonka.Transcribe.DeleteLanguageModel
+import Amazonka.Transcribe.DeleteMedicalTranscriptionJob
+import Amazonka.Transcribe.DeleteMedicalVocabulary
+import Amazonka.Transcribe.DeleteTranscriptionJob
+import Amazonka.Transcribe.DeleteVocabulary
+import Amazonka.Transcribe.DeleteVocabularyFilter
+import Amazonka.Transcribe.DescribeLanguageModel
+import Amazonka.Transcribe.GetCallAnalyticsCategory
+import Amazonka.Transcribe.GetCallAnalyticsJob
+import Amazonka.Transcribe.GetMedicalTranscriptionJob
+import Amazonka.Transcribe.GetMedicalVocabulary
+import Amazonka.Transcribe.GetTranscriptionJob
+import Amazonka.Transcribe.GetVocabulary
+import Amazonka.Transcribe.GetVocabularyFilter
+import Amazonka.Transcribe.Lens
+import Amazonka.Transcribe.ListCallAnalyticsCategories
+import Amazonka.Transcribe.ListCallAnalyticsJobs
+import Amazonka.Transcribe.ListLanguageModels
+import Amazonka.Transcribe.ListMedicalTranscriptionJobs
+import Amazonka.Transcribe.ListMedicalVocabularies
+import Amazonka.Transcribe.ListTagsForResource
+import Amazonka.Transcribe.ListTranscriptionJobs
+import Amazonka.Transcribe.ListVocabularies
+import Amazonka.Transcribe.ListVocabularyFilters
+import Amazonka.Transcribe.StartCallAnalyticsJob
+import Amazonka.Transcribe.StartMedicalTranscriptionJob
+import Amazonka.Transcribe.StartTranscriptionJob
+import Amazonka.Transcribe.TagResource
+import Amazonka.Transcribe.Types
+import Amazonka.Transcribe.UntagResource
+import Amazonka.Transcribe.UpdateCallAnalyticsCategory
+import Amazonka.Transcribe.UpdateMedicalVocabulary
+import Amazonka.Transcribe.UpdateVocabulary
+import Amazonka.Transcribe.UpdateVocabularyFilter
+import Amazonka.Transcribe.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 'Transcribe'.
+
+-- $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/Transcribe/CreateCallAnalyticsCategory.hs b/gen/Amazonka/Transcribe/CreateCallAnalyticsCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/CreateCallAnalyticsCategory.hs
@@ -0,0 +1,297 @@
+{-# 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.Transcribe.CreateCallAnalyticsCategory
+-- 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 new Call Analytics category.
+--
+-- All categories are automatically applied to your Call Analytics
+-- transcriptions. Note that in order to apply categories to your
+-- transcriptions, you must create them before submitting your
+-- transcription request, as categories cannot be applied retroactively.
+--
+-- When creating a new category, you can use the @InputType@ parameter to
+-- label the category as a batch category (@POST_CALL@) or a streaming
+-- category (@REAL_TIME@). Batch categories can only be applied to batch
+-- transcriptions and streaming categories can only be applied to streaming
+-- transcriptions. If you do not include @InputType@, your category is
+-- created as a batch category by default.
+--
+-- Call Analytics categories are composed of rules. For each category, you
+-- must create between 1 and 20 rules. Rules can include these parameters:
+-- , , , and .
+--
+-- To update an existing category, see .
+--
+-- To learn more about Call Analytics categories, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html Creating categories for batch transcriptions>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-stream.html Creating categories for streaming transcriptions>.
+module Amazonka.Transcribe.CreateCallAnalyticsCategory
+  ( -- * Creating a Request
+    CreateCallAnalyticsCategory (..),
+    newCreateCallAnalyticsCategory,
+
+    -- * Request Lenses
+    createCallAnalyticsCategory_inputType,
+    createCallAnalyticsCategory_categoryName,
+    createCallAnalyticsCategory_rules,
+
+    -- * Destructuring the Response
+    CreateCallAnalyticsCategoryResponse (..),
+    newCreateCallAnalyticsCategoryResponse,
+
+    -- * Response Lenses
+    createCallAnalyticsCategoryResponse_categoryProperties,
+    createCallAnalyticsCategoryResponse_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.Transcribe.Types
+
+-- | /See:/ 'newCreateCallAnalyticsCategory' smart constructor.
+data CreateCallAnalyticsCategory = CreateCallAnalyticsCategory'
+  { -- | Choose whether you want to create a streaming or a batch category for
+    -- your Call Analytics transcription.
+    --
+    -- Specifying @POST_CALL@ assigns your category to batch transcriptions;
+    -- categories with this input type cannot be applied to streaming
+    -- (real-time) transcriptions.
+    --
+    -- Specifying @REAL_TIME@ assigns your category to streaming
+    -- transcriptions; categories with this input type cannot be applied to
+    -- batch (post-call) transcriptions.
+    --
+    -- If you do not include @InputType@, your category is created as a batch
+    -- category by default.
+    inputType :: Prelude.Maybe InputType,
+    -- | A unique name, chosen by you, for your Call Analytics category. It\'s
+    -- helpful to use a detailed naming system that will make sense to you in
+    -- the future. For example, it\'s better to use
+    -- @sentiment-positive-last30seconds@ for a category over a generic name
+    -- like @test-category@.
+    --
+    -- Category names are case sensitive.
+    categoryName :: Prelude.Text,
+    -- | Rules define a Call Analytics category. When creating a new category,
+    -- you must create between 1 and 20 rules for that category. For each rule,
+    -- you specify a filter you want applied to the attributes of a call. For
+    -- example, you can choose a sentiment filter that detects if a customer\'s
+    -- sentiment was positive during the last 30 seconds of the call.
+    rules :: Prelude.NonEmpty Rule
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCallAnalyticsCategory' 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:
+--
+-- 'inputType', 'createCallAnalyticsCategory_inputType' - Choose whether you want to create a streaming or a batch category for
+-- your Call Analytics transcription.
+--
+-- Specifying @POST_CALL@ assigns your category to batch transcriptions;
+-- categories with this input type cannot be applied to streaming
+-- (real-time) transcriptions.
+--
+-- Specifying @REAL_TIME@ assigns your category to streaming
+-- transcriptions; categories with this input type cannot be applied to
+-- batch (post-call) transcriptions.
+--
+-- If you do not include @InputType@, your category is created as a batch
+-- category by default.
+--
+-- 'categoryName', 'createCallAnalyticsCategory_categoryName' - A unique name, chosen by you, for your Call Analytics category. It\'s
+-- helpful to use a detailed naming system that will make sense to you in
+-- the future. For example, it\'s better to use
+-- @sentiment-positive-last30seconds@ for a category over a generic name
+-- like @test-category@.
+--
+-- Category names are case sensitive.
+--
+-- 'rules', 'createCallAnalyticsCategory_rules' - Rules define a Call Analytics category. When creating a new category,
+-- you must create between 1 and 20 rules for that category. For each rule,
+-- you specify a filter you want applied to the attributes of a call. For
+-- example, you can choose a sentiment filter that detects if a customer\'s
+-- sentiment was positive during the last 30 seconds of the call.
+newCreateCallAnalyticsCategory ::
+  -- | 'categoryName'
+  Prelude.Text ->
+  -- | 'rules'
+  Prelude.NonEmpty Rule ->
+  CreateCallAnalyticsCategory
+newCreateCallAnalyticsCategory pCategoryName_ pRules_ =
+  CreateCallAnalyticsCategory'
+    { inputType =
+        Prelude.Nothing,
+      categoryName = pCategoryName_,
+      rules = Lens.coerced Lens.# pRules_
+    }
+
+-- | Choose whether you want to create a streaming or a batch category for
+-- your Call Analytics transcription.
+--
+-- Specifying @POST_CALL@ assigns your category to batch transcriptions;
+-- categories with this input type cannot be applied to streaming
+-- (real-time) transcriptions.
+--
+-- Specifying @REAL_TIME@ assigns your category to streaming
+-- transcriptions; categories with this input type cannot be applied to
+-- batch (post-call) transcriptions.
+--
+-- If you do not include @InputType@, your category is created as a batch
+-- category by default.
+createCallAnalyticsCategory_inputType :: Lens.Lens' CreateCallAnalyticsCategory (Prelude.Maybe InputType)
+createCallAnalyticsCategory_inputType = Lens.lens (\CreateCallAnalyticsCategory' {inputType} -> inputType) (\s@CreateCallAnalyticsCategory' {} a -> s {inputType = a} :: CreateCallAnalyticsCategory)
+
+-- | A unique name, chosen by you, for your Call Analytics category. It\'s
+-- helpful to use a detailed naming system that will make sense to you in
+-- the future. For example, it\'s better to use
+-- @sentiment-positive-last30seconds@ for a category over a generic name
+-- like @test-category@.
+--
+-- Category names are case sensitive.
+createCallAnalyticsCategory_categoryName :: Lens.Lens' CreateCallAnalyticsCategory Prelude.Text
+createCallAnalyticsCategory_categoryName = Lens.lens (\CreateCallAnalyticsCategory' {categoryName} -> categoryName) (\s@CreateCallAnalyticsCategory' {} a -> s {categoryName = a} :: CreateCallAnalyticsCategory)
+
+-- | Rules define a Call Analytics category. When creating a new category,
+-- you must create between 1 and 20 rules for that category. For each rule,
+-- you specify a filter you want applied to the attributes of a call. For
+-- example, you can choose a sentiment filter that detects if a customer\'s
+-- sentiment was positive during the last 30 seconds of the call.
+createCallAnalyticsCategory_rules :: Lens.Lens' CreateCallAnalyticsCategory (Prelude.NonEmpty Rule)
+createCallAnalyticsCategory_rules = Lens.lens (\CreateCallAnalyticsCategory' {rules} -> rules) (\s@CreateCallAnalyticsCategory' {} a -> s {rules = a} :: CreateCallAnalyticsCategory) Prelude.. Lens.coerced
+
+instance Core.AWSRequest CreateCallAnalyticsCategory where
+  type
+    AWSResponse CreateCallAnalyticsCategory =
+      CreateCallAnalyticsCategoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateCallAnalyticsCategoryResponse'
+            Prelude.<$> (x Data..?> "CategoryProperties")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateCallAnalyticsCategory where
+  hashWithSalt _salt CreateCallAnalyticsCategory' {..} =
+    _salt
+      `Prelude.hashWithSalt` inputType
+      `Prelude.hashWithSalt` categoryName
+      `Prelude.hashWithSalt` rules
+
+instance Prelude.NFData CreateCallAnalyticsCategory where
+  rnf CreateCallAnalyticsCategory' {..} =
+    Prelude.rnf inputType
+      `Prelude.seq` Prelude.rnf categoryName
+      `Prelude.seq` Prelude.rnf rules
+
+instance Data.ToHeaders CreateCallAnalyticsCategory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.CreateCallAnalyticsCategory" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateCallAnalyticsCategory where
+  toJSON CreateCallAnalyticsCategory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("InputType" Data..=) Prelude.<$> inputType,
+            Prelude.Just ("CategoryName" Data..= categoryName),
+            Prelude.Just ("Rules" Data..= rules)
+          ]
+      )
+
+instance Data.ToPath CreateCallAnalyticsCategory where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateCallAnalyticsCategory where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateCallAnalyticsCategoryResponse' smart constructor.
+data CreateCallAnalyticsCategoryResponse = CreateCallAnalyticsCategoryResponse'
+  { -- | Provides you with the properties of your new category, including its
+    -- associated rules.
+    categoryProperties :: Prelude.Maybe CategoryProperties,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCallAnalyticsCategoryResponse' 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:
+--
+-- 'categoryProperties', 'createCallAnalyticsCategoryResponse_categoryProperties' - Provides you with the properties of your new category, including its
+-- associated rules.
+--
+-- 'httpStatus', 'createCallAnalyticsCategoryResponse_httpStatus' - The response's http status code.
+newCreateCallAnalyticsCategoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateCallAnalyticsCategoryResponse
+newCreateCallAnalyticsCategoryResponse pHttpStatus_ =
+  CreateCallAnalyticsCategoryResponse'
+    { categoryProperties =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides you with the properties of your new category, including its
+-- associated rules.
+createCallAnalyticsCategoryResponse_categoryProperties :: Lens.Lens' CreateCallAnalyticsCategoryResponse (Prelude.Maybe CategoryProperties)
+createCallAnalyticsCategoryResponse_categoryProperties = Lens.lens (\CreateCallAnalyticsCategoryResponse' {categoryProperties} -> categoryProperties) (\s@CreateCallAnalyticsCategoryResponse' {} a -> s {categoryProperties = a} :: CreateCallAnalyticsCategoryResponse)
+
+-- | The response's http status code.
+createCallAnalyticsCategoryResponse_httpStatus :: Lens.Lens' CreateCallAnalyticsCategoryResponse Prelude.Int
+createCallAnalyticsCategoryResponse_httpStatus = Lens.lens (\CreateCallAnalyticsCategoryResponse' {httpStatus} -> httpStatus) (\s@CreateCallAnalyticsCategoryResponse' {} a -> s {httpStatus = a} :: CreateCallAnalyticsCategoryResponse)
+
+instance
+  Prelude.NFData
+    CreateCallAnalyticsCategoryResponse
+  where
+  rnf CreateCallAnalyticsCategoryResponse' {..} =
+    Prelude.rnf categoryProperties
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/CreateLanguageModel.hs b/gen/Amazonka/Transcribe/CreateLanguageModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/CreateLanguageModel.hs
@@ -0,0 +1,428 @@
+{-# 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.Transcribe.CreateLanguageModel
+-- 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 new custom language model.
+--
+-- When creating a new custom language model, you must specify:
+--
+-- -   If you want a Wideband (audio sample rates over 16,000 Hz) or
+--     Narrowband (audio sample rates under 16,000 Hz) base model
+--
+-- -   The location of your training and tuning files (this must be an
+--     Amazon S3 URI)
+--
+-- -   The language of your model
+--
+-- -   A unique name for your model
+module Amazonka.Transcribe.CreateLanguageModel
+  ( -- * Creating a Request
+    CreateLanguageModel (..),
+    newCreateLanguageModel,
+
+    -- * Request Lenses
+    createLanguageModel_tags,
+    createLanguageModel_languageCode,
+    createLanguageModel_baseModelName,
+    createLanguageModel_modelName,
+    createLanguageModel_inputDataConfig,
+
+    -- * Destructuring the Response
+    CreateLanguageModelResponse (..),
+    newCreateLanguageModelResponse,
+
+    -- * Response Lenses
+    createLanguageModelResponse_baseModelName,
+    createLanguageModelResponse_inputDataConfig,
+    createLanguageModelResponse_languageCode,
+    createLanguageModelResponse_modelName,
+    createLanguageModelResponse_modelStatus,
+    createLanguageModelResponse_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.Transcribe.Types
+
+-- | /See:/ 'newCreateLanguageModel' smart constructor.
+data CreateLanguageModel = CreateLanguageModel'
+  { -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new custom language model at the time you create this new model.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The language code that represents the language of your model. Each
+    -- custom language model must contain terms in only one language, and the
+    -- language you select for your custom language model must match the
+    -- language of your training and tuning data.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table. Note that US English (@en-US@) is the only language supported
+    -- with Amazon Transcribe Medical.
+    --
+    -- A custom language model can only be used to transcribe files in the same
+    -- language as the model. For example, if you create a custom language
+    -- model using US English (@en-US@), you can only apply this model to files
+    -- that contain English audio.
+    languageCode :: CLMLanguageCode,
+    -- | The Amazon Transcribe standard language model, or base model, used to
+    -- create your custom language model. Amazon Transcribe offers two options
+    -- for base models: Wideband and Narrowband.
+    --
+    -- If the audio you want to transcribe has a sample rate of 16,000 Hz or
+    -- greater, choose @WideBand@. To transcribe audio with a sample rate less
+    -- than 16,000 Hz, choose @NarrowBand@.
+    baseModelName :: BaseModelName,
+    -- | A unique name, chosen by you, for your custom language model.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new custom
+    -- language model with the same name as an existing custom language model,
+    -- you get a @ConflictException@ error.
+    modelName :: Prelude.Text,
+    -- | Contains the Amazon S3 location of the training data you want to use to
+    -- create a new custom language model, and permissions to access this
+    -- location.
+    --
+    -- When using @InputDataConfig@, you must include these sub-parameters:
+    -- @S3Uri@, which is the Amazon S3 location of your training data, and
+    -- @DataAccessRoleArn@, which is the Amazon Resource Name (ARN) of the role
+    -- that has permission to access your specified Amazon S3 location. You can
+    -- optionally include @TuningDataS3Uri@, which is the Amazon S3 location of
+    -- your tuning data. If you specify different Amazon S3 locations for
+    -- training and tuning data, the ARN you use must have permissions to
+    -- access both locations.
+    inputDataConfig :: InputDataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateLanguageModel' 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', 'createLanguageModel_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom language model at the time you create this new model.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'languageCode', 'createLanguageModel_languageCode' - The language code that represents the language of your model. Each
+-- custom language model must contain terms in only one language, and the
+-- language you select for your custom language model must match the
+-- language of your training and tuning data.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table. Note that US English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+--
+-- A custom language model can only be used to transcribe files in the same
+-- language as the model. For example, if you create a custom language
+-- model using US English (@en-US@), you can only apply this model to files
+-- that contain English audio.
+--
+-- 'baseModelName', 'createLanguageModel_baseModelName' - The Amazon Transcribe standard language model, or base model, used to
+-- create your custom language model. Amazon Transcribe offers two options
+-- for base models: Wideband and Narrowband.
+--
+-- If the audio you want to transcribe has a sample rate of 16,000 Hz or
+-- greater, choose @WideBand@. To transcribe audio with a sample rate less
+-- than 16,000 Hz, choose @NarrowBand@.
+--
+-- 'modelName', 'createLanguageModel_modelName' - A unique name, chosen by you, for your custom language model.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- language model with the same name as an existing custom language model,
+-- you get a @ConflictException@ error.
+--
+-- 'inputDataConfig', 'createLanguageModel_inputDataConfig' - Contains the Amazon S3 location of the training data you want to use to
+-- create a new custom language model, and permissions to access this
+-- location.
+--
+-- When using @InputDataConfig@, you must include these sub-parameters:
+-- @S3Uri@, which is the Amazon S3 location of your training data, and
+-- @DataAccessRoleArn@, which is the Amazon Resource Name (ARN) of the role
+-- that has permission to access your specified Amazon S3 location. You can
+-- optionally include @TuningDataS3Uri@, which is the Amazon S3 location of
+-- your tuning data. If you specify different Amazon S3 locations for
+-- training and tuning data, the ARN you use must have permissions to
+-- access both locations.
+newCreateLanguageModel ::
+  -- | 'languageCode'
+  CLMLanguageCode ->
+  -- | 'baseModelName'
+  BaseModelName ->
+  -- | 'modelName'
+  Prelude.Text ->
+  -- | 'inputDataConfig'
+  InputDataConfig ->
+  CreateLanguageModel
+newCreateLanguageModel
+  pLanguageCode_
+  pBaseModelName_
+  pModelName_
+  pInputDataConfig_ =
+    CreateLanguageModel'
+      { tags = Prelude.Nothing,
+        languageCode = pLanguageCode_,
+        baseModelName = pBaseModelName_,
+        modelName = pModelName_,
+        inputDataConfig = pInputDataConfig_
+      }
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom language model at the time you create this new model.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+createLanguageModel_tags :: Lens.Lens' CreateLanguageModel (Prelude.Maybe (Prelude.NonEmpty Tag))
+createLanguageModel_tags = Lens.lens (\CreateLanguageModel' {tags} -> tags) (\s@CreateLanguageModel' {} a -> s {tags = a} :: CreateLanguageModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The language code that represents the language of your model. Each
+-- custom language model must contain terms in only one language, and the
+-- language you select for your custom language model must match the
+-- language of your training and tuning data.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table. Note that US English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+--
+-- A custom language model can only be used to transcribe files in the same
+-- language as the model. For example, if you create a custom language
+-- model using US English (@en-US@), you can only apply this model to files
+-- that contain English audio.
+createLanguageModel_languageCode :: Lens.Lens' CreateLanguageModel CLMLanguageCode
+createLanguageModel_languageCode = Lens.lens (\CreateLanguageModel' {languageCode} -> languageCode) (\s@CreateLanguageModel' {} a -> s {languageCode = a} :: CreateLanguageModel)
+
+-- | The Amazon Transcribe standard language model, or base model, used to
+-- create your custom language model. Amazon Transcribe offers two options
+-- for base models: Wideband and Narrowband.
+--
+-- If the audio you want to transcribe has a sample rate of 16,000 Hz or
+-- greater, choose @WideBand@. To transcribe audio with a sample rate less
+-- than 16,000 Hz, choose @NarrowBand@.
+createLanguageModel_baseModelName :: Lens.Lens' CreateLanguageModel BaseModelName
+createLanguageModel_baseModelName = Lens.lens (\CreateLanguageModel' {baseModelName} -> baseModelName) (\s@CreateLanguageModel' {} a -> s {baseModelName = a} :: CreateLanguageModel)
+
+-- | A unique name, chosen by you, for your custom language model.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- language model with the same name as an existing custom language model,
+-- you get a @ConflictException@ error.
+createLanguageModel_modelName :: Lens.Lens' CreateLanguageModel Prelude.Text
+createLanguageModel_modelName = Lens.lens (\CreateLanguageModel' {modelName} -> modelName) (\s@CreateLanguageModel' {} a -> s {modelName = a} :: CreateLanguageModel)
+
+-- | Contains the Amazon S3 location of the training data you want to use to
+-- create a new custom language model, and permissions to access this
+-- location.
+--
+-- When using @InputDataConfig@, you must include these sub-parameters:
+-- @S3Uri@, which is the Amazon S3 location of your training data, and
+-- @DataAccessRoleArn@, which is the Amazon Resource Name (ARN) of the role
+-- that has permission to access your specified Amazon S3 location. You can
+-- optionally include @TuningDataS3Uri@, which is the Amazon S3 location of
+-- your tuning data. If you specify different Amazon S3 locations for
+-- training and tuning data, the ARN you use must have permissions to
+-- access both locations.
+createLanguageModel_inputDataConfig :: Lens.Lens' CreateLanguageModel InputDataConfig
+createLanguageModel_inputDataConfig = Lens.lens (\CreateLanguageModel' {inputDataConfig} -> inputDataConfig) (\s@CreateLanguageModel' {} a -> s {inputDataConfig = a} :: CreateLanguageModel)
+
+instance Core.AWSRequest CreateLanguageModel where
+  type
+    AWSResponse CreateLanguageModel =
+      CreateLanguageModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateLanguageModelResponse'
+            Prelude.<$> (x Data..?> "BaseModelName")
+            Prelude.<*> (x Data..?> "InputDataConfig")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "ModelName")
+            Prelude.<*> (x Data..?> "ModelStatus")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateLanguageModel where
+  hashWithSalt _salt CreateLanguageModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` baseModelName
+      `Prelude.hashWithSalt` modelName
+      `Prelude.hashWithSalt` inputDataConfig
+
+instance Prelude.NFData CreateLanguageModel where
+  rnf CreateLanguageModel' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf baseModelName
+      `Prelude.seq` Prelude.rnf modelName
+      `Prelude.seq` Prelude.rnf inputDataConfig
+
+instance Data.ToHeaders CreateLanguageModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.CreateLanguageModel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateLanguageModel where
+  toJSON CreateLanguageModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("LanguageCode" Data..= languageCode),
+            Prelude.Just ("BaseModelName" Data..= baseModelName),
+            Prelude.Just ("ModelName" Data..= modelName),
+            Prelude.Just
+              ("InputDataConfig" Data..= inputDataConfig)
+          ]
+      )
+
+instance Data.ToPath CreateLanguageModel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateLanguageModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateLanguageModelResponse' smart constructor.
+data CreateLanguageModelResponse = CreateLanguageModelResponse'
+  { -- | The Amazon Transcribe standard language model, or base model, you
+    -- specified when creating your custom language model.
+    baseModelName :: Prelude.Maybe BaseModelName,
+    -- | Lists your data access role ARN (Amazon Resource Name) and the Amazon S3
+    -- locations you provided for your training (@S3Uri@) and tuning
+    -- (@TuningDataS3Uri@) data.
+    inputDataConfig :: Prelude.Maybe InputDataConfig,
+    -- | The language code you selected for your custom language model.
+    languageCode :: Prelude.Maybe CLMLanguageCode,
+    -- | The name of your custom language model.
+    modelName :: Prelude.Maybe Prelude.Text,
+    -- | The status of your custom language model. When the status displays as
+    -- @COMPLETED@, your model is ready to use.
+    modelStatus :: Prelude.Maybe ModelStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateLanguageModelResponse' 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:
+--
+-- 'baseModelName', 'createLanguageModelResponse_baseModelName' - The Amazon Transcribe standard language model, or base model, you
+-- specified when creating your custom language model.
+--
+-- 'inputDataConfig', 'createLanguageModelResponse_inputDataConfig' - Lists your data access role ARN (Amazon Resource Name) and the Amazon S3
+-- locations you provided for your training (@S3Uri@) and tuning
+-- (@TuningDataS3Uri@) data.
+--
+-- 'languageCode', 'createLanguageModelResponse_languageCode' - The language code you selected for your custom language model.
+--
+-- 'modelName', 'createLanguageModelResponse_modelName' - The name of your custom language model.
+--
+-- 'modelStatus', 'createLanguageModelResponse_modelStatus' - The status of your custom language model. When the status displays as
+-- @COMPLETED@, your model is ready to use.
+--
+-- 'httpStatus', 'createLanguageModelResponse_httpStatus' - The response's http status code.
+newCreateLanguageModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateLanguageModelResponse
+newCreateLanguageModelResponse pHttpStatus_ =
+  CreateLanguageModelResponse'
+    { baseModelName =
+        Prelude.Nothing,
+      inputDataConfig = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      modelName = Prelude.Nothing,
+      modelStatus = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Transcribe standard language model, or base model, you
+-- specified when creating your custom language model.
+createLanguageModelResponse_baseModelName :: Lens.Lens' CreateLanguageModelResponse (Prelude.Maybe BaseModelName)
+createLanguageModelResponse_baseModelName = Lens.lens (\CreateLanguageModelResponse' {baseModelName} -> baseModelName) (\s@CreateLanguageModelResponse' {} a -> s {baseModelName = a} :: CreateLanguageModelResponse)
+
+-- | Lists your data access role ARN (Amazon Resource Name) and the Amazon S3
+-- locations you provided for your training (@S3Uri@) and tuning
+-- (@TuningDataS3Uri@) data.
+createLanguageModelResponse_inputDataConfig :: Lens.Lens' CreateLanguageModelResponse (Prelude.Maybe InputDataConfig)
+createLanguageModelResponse_inputDataConfig = Lens.lens (\CreateLanguageModelResponse' {inputDataConfig} -> inputDataConfig) (\s@CreateLanguageModelResponse' {} a -> s {inputDataConfig = a} :: CreateLanguageModelResponse)
+
+-- | The language code you selected for your custom language model.
+createLanguageModelResponse_languageCode :: Lens.Lens' CreateLanguageModelResponse (Prelude.Maybe CLMLanguageCode)
+createLanguageModelResponse_languageCode = Lens.lens (\CreateLanguageModelResponse' {languageCode} -> languageCode) (\s@CreateLanguageModelResponse' {} a -> s {languageCode = a} :: CreateLanguageModelResponse)
+
+-- | The name of your custom language model.
+createLanguageModelResponse_modelName :: Lens.Lens' CreateLanguageModelResponse (Prelude.Maybe Prelude.Text)
+createLanguageModelResponse_modelName = Lens.lens (\CreateLanguageModelResponse' {modelName} -> modelName) (\s@CreateLanguageModelResponse' {} a -> s {modelName = a} :: CreateLanguageModelResponse)
+
+-- | The status of your custom language model. When the status displays as
+-- @COMPLETED@, your model is ready to use.
+createLanguageModelResponse_modelStatus :: Lens.Lens' CreateLanguageModelResponse (Prelude.Maybe ModelStatus)
+createLanguageModelResponse_modelStatus = Lens.lens (\CreateLanguageModelResponse' {modelStatus} -> modelStatus) (\s@CreateLanguageModelResponse' {} a -> s {modelStatus = a} :: CreateLanguageModelResponse)
+
+-- | The response's http status code.
+createLanguageModelResponse_httpStatus :: Lens.Lens' CreateLanguageModelResponse Prelude.Int
+createLanguageModelResponse_httpStatus = Lens.lens (\CreateLanguageModelResponse' {httpStatus} -> httpStatus) (\s@CreateLanguageModelResponse' {} a -> s {httpStatus = a} :: CreateLanguageModelResponse)
+
+instance Prelude.NFData CreateLanguageModelResponse where
+  rnf CreateLanguageModelResponse' {..} =
+    Prelude.rnf baseModelName
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf modelName
+      `Prelude.seq` Prelude.rnf modelStatus
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/CreateMedicalVocabulary.hs b/gen/Amazonka/Transcribe/CreateMedicalVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/CreateMedicalVocabulary.hs
@@ -0,0 +1,368 @@
+{-# 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.Transcribe.CreateMedicalVocabulary
+-- 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 new custom medical vocabulary.
+--
+-- Before creating a new custom medical vocabulary, you must first upload a
+-- text file that contains your new entries, phrases, and terms into an
+-- Amazon S3 bucket. Note that this differs from , where you can include a
+-- list of terms within your request using the @Phrases@ flag;
+-- @CreateMedicalVocabulary@ does not support the @Phrases@ flag.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html Custom vocabularies>.
+module Amazonka.Transcribe.CreateMedicalVocabulary
+  ( -- * Creating a Request
+    CreateMedicalVocabulary (..),
+    newCreateMedicalVocabulary,
+
+    -- * Request Lenses
+    createMedicalVocabulary_tags,
+    createMedicalVocabulary_vocabularyName,
+    createMedicalVocabulary_languageCode,
+    createMedicalVocabulary_vocabularyFileUri,
+
+    -- * Destructuring the Response
+    CreateMedicalVocabularyResponse (..),
+    newCreateMedicalVocabularyResponse,
+
+    -- * Response Lenses
+    createMedicalVocabularyResponse_failureReason,
+    createMedicalVocabularyResponse_languageCode,
+    createMedicalVocabularyResponse_lastModifiedTime,
+    createMedicalVocabularyResponse_vocabularyName,
+    createMedicalVocabularyResponse_vocabularyState,
+    createMedicalVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newCreateMedicalVocabulary' smart constructor.
+data CreateMedicalVocabulary = CreateMedicalVocabulary'
+  { -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new custom medical vocabulary at the time you create this new custom
+    -- vocabulary.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | A unique name, chosen by you, for your new custom medical vocabulary.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new custom
+    -- medical vocabulary with the same name as an existing custom medical
+    -- vocabulary, you get a @ConflictException@ error.
+    vocabularyName :: Prelude.Text,
+    -- | The language code that represents the language of the entries in your
+    -- custom vocabulary. US English (@en-US@) is the only language supported
+    -- with Amazon Transcribe Medical.
+    languageCode :: LanguageCode,
+    -- | The Amazon S3 location (URI) of the text file that contains your custom
+    -- medical vocabulary. The URI must be in the same Amazon Web Services
+    -- Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+    vocabularyFileUri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMedicalVocabulary' 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', 'createMedicalVocabulary_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom medical vocabulary at the time you create this new custom
+-- vocabulary.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'vocabularyName', 'createMedicalVocabulary_vocabularyName' - A unique name, chosen by you, for your new custom medical vocabulary.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- medical vocabulary with the same name as an existing custom medical
+-- vocabulary, you get a @ConflictException@ error.
+--
+-- 'languageCode', 'createMedicalVocabulary_languageCode' - The language code that represents the language of the entries in your
+-- custom vocabulary. US English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+--
+-- 'vocabularyFileUri', 'createMedicalVocabulary_vocabularyFileUri' - The Amazon S3 location (URI) of the text file that contains your custom
+-- medical vocabulary. The URI must be in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+newCreateMedicalVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  -- | 'vocabularyFileUri'
+  Prelude.Text ->
+  CreateMedicalVocabulary
+newCreateMedicalVocabulary
+  pVocabularyName_
+  pLanguageCode_
+  pVocabularyFileUri_ =
+    CreateMedicalVocabulary'
+      { tags = Prelude.Nothing,
+        vocabularyName = pVocabularyName_,
+        languageCode = pLanguageCode_,
+        vocabularyFileUri = pVocabularyFileUri_
+      }
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom medical vocabulary at the time you create this new custom
+-- vocabulary.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+createMedicalVocabulary_tags :: Lens.Lens' CreateMedicalVocabulary (Prelude.Maybe (Prelude.NonEmpty Tag))
+createMedicalVocabulary_tags = Lens.lens (\CreateMedicalVocabulary' {tags} -> tags) (\s@CreateMedicalVocabulary' {} a -> s {tags = a} :: CreateMedicalVocabulary) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique name, chosen by you, for your new custom medical vocabulary.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- medical vocabulary with the same name as an existing custom medical
+-- vocabulary, you get a @ConflictException@ error.
+createMedicalVocabulary_vocabularyName :: Lens.Lens' CreateMedicalVocabulary Prelude.Text
+createMedicalVocabulary_vocabularyName = Lens.lens (\CreateMedicalVocabulary' {vocabularyName} -> vocabularyName) (\s@CreateMedicalVocabulary' {} a -> s {vocabularyName = a} :: CreateMedicalVocabulary)
+
+-- | The language code that represents the language of the entries in your
+-- custom vocabulary. US English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+createMedicalVocabulary_languageCode :: Lens.Lens' CreateMedicalVocabulary LanguageCode
+createMedicalVocabulary_languageCode = Lens.lens (\CreateMedicalVocabulary' {languageCode} -> languageCode) (\s@CreateMedicalVocabulary' {} a -> s {languageCode = a} :: CreateMedicalVocabulary)
+
+-- | The Amazon S3 location (URI) of the text file that contains your custom
+-- medical vocabulary. The URI must be in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+createMedicalVocabulary_vocabularyFileUri :: Lens.Lens' CreateMedicalVocabulary Prelude.Text
+createMedicalVocabulary_vocabularyFileUri = Lens.lens (\CreateMedicalVocabulary' {vocabularyFileUri} -> vocabularyFileUri) (\s@CreateMedicalVocabulary' {} a -> s {vocabularyFileUri = a} :: CreateMedicalVocabulary)
+
+instance Core.AWSRequest CreateMedicalVocabulary where
+  type
+    AWSResponse CreateMedicalVocabulary =
+      CreateMedicalVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateMedicalVocabularyResponse'
+            Prelude.<$> (x Data..?> "FailureReason")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateMedicalVocabulary where
+  hashWithSalt _salt CreateMedicalVocabulary' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` vocabularyName
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` vocabularyFileUri
+
+instance Prelude.NFData CreateMedicalVocabulary where
+  rnf CreateMedicalVocabulary' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf vocabularyFileUri
+
+instance Data.ToHeaders CreateMedicalVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.CreateMedicalVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateMedicalVocabulary where
+  toJSON CreateMedicalVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ("VocabularyName" Data..= vocabularyName),
+            Prelude.Just ("LanguageCode" Data..= languageCode),
+            Prelude.Just
+              ("VocabularyFileUri" Data..= vocabularyFileUri)
+          ]
+      )
+
+instance Data.ToPath CreateMedicalVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateMedicalVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateMedicalVocabularyResponse' smart constructor.
+data CreateMedicalVocabularyResponse = CreateMedicalVocabularyResponse'
+  { -- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+    -- about why the medical transcription job request failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code you selected for your custom medical vocabulary. US
+    -- English (@en-US@) is the only language supported with Amazon Transcribe
+    -- Medical.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time you created your custom medical vocabulary.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name you chose for your custom medical vocabulary.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom medical vocabulary. If the state is
+    -- @READY@, you can use the custom vocabulary in a
+    -- @StartMedicalTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMedicalVocabularyResponse' 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:
+--
+-- 'failureReason', 'createMedicalVocabularyResponse_failureReason' - If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the medical transcription job request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'createMedicalVocabularyResponse_languageCode' - The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+--
+-- 'lastModifiedTime', 'createMedicalVocabularyResponse_lastModifiedTime' - The date and time you created your custom medical vocabulary.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'createMedicalVocabularyResponse_vocabularyName' - The name you chose for your custom medical vocabulary.
+--
+-- 'vocabularyState', 'createMedicalVocabularyResponse_vocabularyState' - The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+--
+-- 'httpStatus', 'createMedicalVocabularyResponse_httpStatus' - The response's http status code.
+newCreateMedicalVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateMedicalVocabularyResponse
+newCreateMedicalVocabularyResponse pHttpStatus_ =
+  CreateMedicalVocabularyResponse'
+    { failureReason =
+        Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the medical transcription job request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+createMedicalVocabularyResponse_failureReason :: Lens.Lens' CreateMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+createMedicalVocabularyResponse_failureReason = Lens.lens (\CreateMedicalVocabularyResponse' {failureReason} -> failureReason) (\s@CreateMedicalVocabularyResponse' {} a -> s {failureReason = a} :: CreateMedicalVocabularyResponse)
+
+-- | The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+createMedicalVocabularyResponse_languageCode :: Lens.Lens' CreateMedicalVocabularyResponse (Prelude.Maybe LanguageCode)
+createMedicalVocabularyResponse_languageCode = Lens.lens (\CreateMedicalVocabularyResponse' {languageCode} -> languageCode) (\s@CreateMedicalVocabularyResponse' {} a -> s {languageCode = a} :: CreateMedicalVocabularyResponse)
+
+-- | The date and time you created your custom medical vocabulary.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+createMedicalVocabularyResponse_lastModifiedTime :: Lens.Lens' CreateMedicalVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+createMedicalVocabularyResponse_lastModifiedTime = Lens.lens (\CreateMedicalVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@CreateMedicalVocabularyResponse' {} a -> s {lastModifiedTime = a} :: CreateMedicalVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name you chose for your custom medical vocabulary.
+createMedicalVocabularyResponse_vocabularyName :: Lens.Lens' CreateMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+createMedicalVocabularyResponse_vocabularyName = Lens.lens (\CreateMedicalVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@CreateMedicalVocabularyResponse' {} a -> s {vocabularyName = a} :: CreateMedicalVocabularyResponse)
+
+-- | The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+createMedicalVocabularyResponse_vocabularyState :: Lens.Lens' CreateMedicalVocabularyResponse (Prelude.Maybe VocabularyState)
+createMedicalVocabularyResponse_vocabularyState = Lens.lens (\CreateMedicalVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@CreateMedicalVocabularyResponse' {} a -> s {vocabularyState = a} :: CreateMedicalVocabularyResponse)
+
+-- | The response's http status code.
+createMedicalVocabularyResponse_httpStatus :: Lens.Lens' CreateMedicalVocabularyResponse Prelude.Int
+createMedicalVocabularyResponse_httpStatus = Lens.lens (\CreateMedicalVocabularyResponse' {httpStatus} -> httpStatus) (\s@CreateMedicalVocabularyResponse' {} a -> s {httpStatus = a} :: CreateMedicalVocabularyResponse)
+
+instance
+  Prelude.NFData
+    CreateMedicalVocabularyResponse
+  where
+  rnf CreateMedicalVocabularyResponse' {..} =
+    Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/CreateVocabulary.hs b/gen/Amazonka/Transcribe/CreateVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/CreateVocabulary.hs
@@ -0,0 +1,441 @@
+{-# 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.Transcribe.CreateVocabulary
+-- 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 new custom vocabulary.
+--
+-- When creating a new custom vocabulary, you can either upload a text file
+-- that contains your new entries, phrases, and terms into an Amazon S3
+-- bucket and include the URI in your request. Or you can include a list of
+-- terms directly in your request using the @Phrases@ flag.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html Custom vocabularies>.
+module Amazonka.Transcribe.CreateVocabulary
+  ( -- * Creating a Request
+    CreateVocabulary (..),
+    newCreateVocabulary,
+
+    -- * Request Lenses
+    createVocabulary_phrases,
+    createVocabulary_tags,
+    createVocabulary_vocabularyFileUri,
+    createVocabulary_vocabularyName,
+    createVocabulary_languageCode,
+
+    -- * Destructuring the Response
+    CreateVocabularyResponse (..),
+    newCreateVocabularyResponse,
+
+    -- * Response Lenses
+    createVocabularyResponse_failureReason,
+    createVocabularyResponse_languageCode,
+    createVocabularyResponse_lastModifiedTime,
+    createVocabularyResponse_vocabularyName,
+    createVocabularyResponse_vocabularyState,
+    createVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newCreateVocabulary' smart constructor.
+data CreateVocabulary = CreateVocabulary'
+  { -- | Use this parameter if you want to create your custom vocabulary by
+    -- including all desired terms, as comma-separated values, within your
+    -- request. The other option for creating your custom vocabulary is to save
+    -- your entries in a text file and upload them to an Amazon S3 bucket, then
+    -- specify the location of your file using the @VocabularyFileUri@
+    -- parameter.
+    --
+    -- Note that if you include @Phrases@ in your request, you cannot use
+    -- @VocabularyFileUri@; you must choose one or the other.
+    --
+    -- Each language has a character set that contains all allowed characters
+    -- for that specific language. If you use unsupported characters, your
+    -- custom vocabulary filter request fails. Refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+    -- to get the character set for your language.
+    phrases :: Prelude.Maybe [Prelude.Text],
+    -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new custom vocabulary at the time you create this new custom vocabulary.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The Amazon S3 location of the text file that contains your custom
+    -- vocabulary. The URI must be located in the same Amazon Web Services
+    -- Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+    --
+    -- Note that if you include @VocabularyFileUri@ in your request, you cannot
+    -- use the @Phrases@ flag; you must choose one or the other.
+    vocabularyFileUri :: Prelude.Maybe Prelude.Text,
+    -- | A unique name, chosen by you, for your new custom vocabulary.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new custom
+    -- vocabulary with the same name as an existing custom vocabulary, you get
+    -- a @ConflictException@ error.
+    vocabularyName :: Prelude.Text,
+    -- | The language code that represents the language of the entries in your
+    -- custom vocabulary. Each custom vocabulary must contain terms in only one
+    -- language.
+    --
+    -- A custom vocabulary can only be used to transcribe files in the same
+    -- language as the custom vocabulary. For example, if you create a custom
+    -- vocabulary using US English (@en-US@), you can only apply this custom
+    -- vocabulary to files that contain English audio.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    languageCode :: LanguageCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVocabulary' 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:
+--
+-- 'phrases', 'createVocabulary_phrases' - Use this parameter if you want to create your custom vocabulary by
+-- including all desired terms, as comma-separated values, within your
+-- request. The other option for creating your custom vocabulary is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFileUri@
+-- parameter.
+--
+-- Note that if you include @Phrases@ in your request, you cannot use
+-- @VocabularyFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- 'tags', 'createVocabulary_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom vocabulary at the time you create this new custom vocabulary.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'vocabularyFileUri', 'createVocabulary_vocabularyFileUri' - The Amazon S3 location of the text file that contains your custom
+-- vocabulary. The URI must be located in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+--
+-- Note that if you include @VocabularyFileUri@ in your request, you cannot
+-- use the @Phrases@ flag; you must choose one or the other.
+--
+-- 'vocabularyName', 'createVocabulary_vocabularyName' - A unique name, chosen by you, for your new custom vocabulary.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- vocabulary with the same name as an existing custom vocabulary, you get
+-- a @ConflictException@ error.
+--
+-- 'languageCode', 'createVocabulary_languageCode' - The language code that represents the language of the entries in your
+-- custom vocabulary. Each custom vocabulary must contain terms in only one
+-- language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+newCreateVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  CreateVocabulary
+newCreateVocabulary pVocabularyName_ pLanguageCode_ =
+  CreateVocabulary'
+    { phrases = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      vocabularyFileUri = Prelude.Nothing,
+      vocabularyName = pVocabularyName_,
+      languageCode = pLanguageCode_
+    }
+
+-- | Use this parameter if you want to create your custom vocabulary by
+-- including all desired terms, as comma-separated values, within your
+-- request. The other option for creating your custom vocabulary is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFileUri@
+-- parameter.
+--
+-- Note that if you include @Phrases@ in your request, you cannot use
+-- @VocabularyFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+createVocabulary_phrases :: Lens.Lens' CreateVocabulary (Prelude.Maybe [Prelude.Text])
+createVocabulary_phrases = Lens.lens (\CreateVocabulary' {phrases} -> phrases) (\s@CreateVocabulary' {} a -> s {phrases = a} :: CreateVocabulary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom vocabulary at the time you create this new custom vocabulary.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+createVocabulary_tags :: Lens.Lens' CreateVocabulary (Prelude.Maybe (Prelude.NonEmpty Tag))
+createVocabulary_tags = Lens.lens (\CreateVocabulary' {tags} -> tags) (\s@CreateVocabulary' {} a -> s {tags = a} :: CreateVocabulary) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 location of the text file that contains your custom
+-- vocabulary. The URI must be located in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+--
+-- Note that if you include @VocabularyFileUri@ in your request, you cannot
+-- use the @Phrases@ flag; you must choose one or the other.
+createVocabulary_vocabularyFileUri :: Lens.Lens' CreateVocabulary (Prelude.Maybe Prelude.Text)
+createVocabulary_vocabularyFileUri = Lens.lens (\CreateVocabulary' {vocabularyFileUri} -> vocabularyFileUri) (\s@CreateVocabulary' {} a -> s {vocabularyFileUri = a} :: CreateVocabulary)
+
+-- | A unique name, chosen by you, for your new custom vocabulary.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- vocabulary with the same name as an existing custom vocabulary, you get
+-- a @ConflictException@ error.
+createVocabulary_vocabularyName :: Lens.Lens' CreateVocabulary Prelude.Text
+createVocabulary_vocabularyName = Lens.lens (\CreateVocabulary' {vocabularyName} -> vocabularyName) (\s@CreateVocabulary' {} a -> s {vocabularyName = a} :: CreateVocabulary)
+
+-- | The language code that represents the language of the entries in your
+-- custom vocabulary. Each custom vocabulary must contain terms in only one
+-- language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+createVocabulary_languageCode :: Lens.Lens' CreateVocabulary LanguageCode
+createVocabulary_languageCode = Lens.lens (\CreateVocabulary' {languageCode} -> languageCode) (\s@CreateVocabulary' {} a -> s {languageCode = a} :: CreateVocabulary)
+
+instance Core.AWSRequest CreateVocabulary where
+  type
+    AWSResponse CreateVocabulary =
+      CreateVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVocabularyResponse'
+            Prelude.<$> (x Data..?> "FailureReason")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateVocabulary where
+  hashWithSalt _salt CreateVocabulary' {..} =
+    _salt
+      `Prelude.hashWithSalt` phrases
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` vocabularyFileUri
+      `Prelude.hashWithSalt` vocabularyName
+      `Prelude.hashWithSalt` languageCode
+
+instance Prelude.NFData CreateVocabulary where
+  rnf CreateVocabulary' {..} =
+    Prelude.rnf phrases
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf vocabularyFileUri
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf languageCode
+
+instance Data.ToHeaders CreateVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.CreateVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVocabulary where
+  toJSON CreateVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Phrases" Data..=) Prelude.<$> phrases,
+            ("Tags" Data..=) Prelude.<$> tags,
+            ("VocabularyFileUri" Data..=)
+              Prelude.<$> vocabularyFileUri,
+            Prelude.Just
+              ("VocabularyName" Data..= vocabularyName),
+            Prelude.Just ("LanguageCode" Data..= languageCode)
+          ]
+      )
+
+instance Data.ToPath CreateVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateVocabularyResponse' smart constructor.
+data CreateVocabularyResponse = CreateVocabularyResponse'
+  { -- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+    -- about why the custom vocabulary request failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code you selected for your custom vocabulary.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time you created your custom vocabulary.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name you chose for your custom vocabulary.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom vocabulary. If the state is @READY@,
+    -- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVocabularyResponse' 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:
+--
+-- 'failureReason', 'createVocabularyResponse_failureReason' - If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'createVocabularyResponse_languageCode' - The language code you selected for your custom vocabulary.
+--
+-- 'lastModifiedTime', 'createVocabularyResponse_lastModifiedTime' - The date and time you created your custom vocabulary.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'createVocabularyResponse_vocabularyName' - The name you chose for your custom vocabulary.
+--
+-- 'vocabularyState', 'createVocabularyResponse_vocabularyState' - The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+--
+-- 'httpStatus', 'createVocabularyResponse_httpStatus' - The response's http status code.
+newCreateVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateVocabularyResponse
+newCreateVocabularyResponse pHttpStatus_ =
+  CreateVocabularyResponse'
+    { failureReason =
+        Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+createVocabularyResponse_failureReason :: Lens.Lens' CreateVocabularyResponse (Prelude.Maybe Prelude.Text)
+createVocabularyResponse_failureReason = Lens.lens (\CreateVocabularyResponse' {failureReason} -> failureReason) (\s@CreateVocabularyResponse' {} a -> s {failureReason = a} :: CreateVocabularyResponse)
+
+-- | The language code you selected for your custom vocabulary.
+createVocabularyResponse_languageCode :: Lens.Lens' CreateVocabularyResponse (Prelude.Maybe LanguageCode)
+createVocabularyResponse_languageCode = Lens.lens (\CreateVocabularyResponse' {languageCode} -> languageCode) (\s@CreateVocabularyResponse' {} a -> s {languageCode = a} :: CreateVocabularyResponse)
+
+-- | The date and time you created your custom vocabulary.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+createVocabularyResponse_lastModifiedTime :: Lens.Lens' CreateVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+createVocabularyResponse_lastModifiedTime = Lens.lens (\CreateVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@CreateVocabularyResponse' {} a -> s {lastModifiedTime = a} :: CreateVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name you chose for your custom vocabulary.
+createVocabularyResponse_vocabularyName :: Lens.Lens' CreateVocabularyResponse (Prelude.Maybe Prelude.Text)
+createVocabularyResponse_vocabularyName = Lens.lens (\CreateVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@CreateVocabularyResponse' {} a -> s {vocabularyName = a} :: CreateVocabularyResponse)
+
+-- | The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+createVocabularyResponse_vocabularyState :: Lens.Lens' CreateVocabularyResponse (Prelude.Maybe VocabularyState)
+createVocabularyResponse_vocabularyState = Lens.lens (\CreateVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@CreateVocabularyResponse' {} a -> s {vocabularyState = a} :: CreateVocabularyResponse)
+
+-- | The response's http status code.
+createVocabularyResponse_httpStatus :: Lens.Lens' CreateVocabularyResponse Prelude.Int
+createVocabularyResponse_httpStatus = Lens.lens (\CreateVocabularyResponse' {httpStatus} -> httpStatus) (\s@CreateVocabularyResponse' {} a -> s {httpStatus = a} :: CreateVocabularyResponse)
+
+instance Prelude.NFData CreateVocabularyResponse where
+  rnf CreateVocabularyResponse' {..} =
+    Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/CreateVocabularyFilter.hs b/gen/Amazonka/Transcribe/CreateVocabularyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/CreateVocabularyFilter.hs
@@ -0,0 +1,417 @@
+{-# 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.Transcribe.CreateVocabularyFilter
+-- 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 new custom vocabulary filter.
+--
+-- You can use custom vocabulary filters to mask, delete, or flag specific
+-- words from your transcript. Custom vocabulary filters are commonly used
+-- to mask profanity in transcripts.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/vocabulary-filtering.html Vocabulary filtering>.
+module Amazonka.Transcribe.CreateVocabularyFilter
+  ( -- * Creating a Request
+    CreateVocabularyFilter (..),
+    newCreateVocabularyFilter,
+
+    -- * Request Lenses
+    createVocabularyFilter_tags,
+    createVocabularyFilter_vocabularyFilterFileUri,
+    createVocabularyFilter_words,
+    createVocabularyFilter_vocabularyFilterName,
+    createVocabularyFilter_languageCode,
+
+    -- * Destructuring the Response
+    CreateVocabularyFilterResponse (..),
+    newCreateVocabularyFilterResponse,
+
+    -- * Response Lenses
+    createVocabularyFilterResponse_languageCode,
+    createVocabularyFilterResponse_lastModifiedTime,
+    createVocabularyFilterResponse_vocabularyFilterName,
+    createVocabularyFilterResponse_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.Transcribe.Types
+
+-- | /See:/ 'newCreateVocabularyFilter' smart constructor.
+data CreateVocabularyFilter = CreateVocabularyFilter'
+  { -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new custom vocabulary filter at the time you create this new vocabulary
+    -- filter.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The Amazon S3 location of the text file that contains your custom
+    -- vocabulary filter terms. The URI must be located in the same Amazon Web
+    -- Services Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+    --
+    -- Note that if you include @VocabularyFilterFileUri@ in your request, you
+    -- cannot use @Words@; you must choose one or the other.
+    vocabularyFilterFileUri :: Prelude.Maybe Prelude.Text,
+    -- | Use this parameter if you want to create your custom vocabulary filter
+    -- by including all desired terms, as comma-separated values, within your
+    -- request. The other option for creating your vocabulary filter is to save
+    -- your entries in a text file and upload them to an Amazon S3 bucket, then
+    -- specify the location of your file using the @VocabularyFilterFileUri@
+    -- parameter.
+    --
+    -- Note that if you include @Words@ in your request, you cannot use
+    -- @VocabularyFilterFileUri@; you must choose one or the other.
+    --
+    -- Each language has a character set that contains all allowed characters
+    -- for that specific language. If you use unsupported characters, your
+    -- custom vocabulary filter request fails. Refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+    -- to get the character set for your language.
+    words :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | A unique name, chosen by you, for your new custom vocabulary filter.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new custom
+    -- vocabulary filter with the same name as an existing custom vocabulary
+    -- filter, you get a @ConflictException@ error.
+    vocabularyFilterName :: Prelude.Text,
+    -- | The language code that represents the language of the entries in your
+    -- vocabulary filter. Each custom vocabulary filter must contain terms in
+    -- only one language.
+    --
+    -- A custom vocabulary filter can only be used to transcribe files in the
+    -- same language as the filter. For example, if you create a custom
+    -- vocabulary filter using US English (@en-US@), you can only apply this
+    -- filter to files that contain English audio.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    languageCode :: LanguageCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVocabularyFilter' 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', 'createVocabularyFilter_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom vocabulary filter at the time you create this new vocabulary
+-- filter.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'vocabularyFilterFileUri', 'createVocabularyFilter_vocabularyFilterFileUri' - The Amazon S3 location of the text file that contains your custom
+-- vocabulary filter terms. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+--
+-- Note that if you include @VocabularyFilterFileUri@ in your request, you
+-- cannot use @Words@; you must choose one or the other.
+--
+-- 'words', 'createVocabularyFilter_words' - Use this parameter if you want to create your custom vocabulary filter
+-- by including all desired terms, as comma-separated values, within your
+-- request. The other option for creating your vocabulary filter is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFilterFileUri@
+-- parameter.
+--
+-- Note that if you include @Words@ in your request, you cannot use
+-- @VocabularyFilterFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- 'vocabularyFilterName', 'createVocabularyFilter_vocabularyFilterName' - A unique name, chosen by you, for your new custom vocabulary filter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- vocabulary filter with the same name as an existing custom vocabulary
+-- filter, you get a @ConflictException@ error.
+--
+-- 'languageCode', 'createVocabularyFilter_languageCode' - The language code that represents the language of the entries in your
+-- vocabulary filter. Each custom vocabulary filter must contain terms in
+-- only one language.
+--
+-- A custom vocabulary filter can only be used to transcribe files in the
+-- same language as the filter. For example, if you create a custom
+-- vocabulary filter using US English (@en-US@), you can only apply this
+-- filter to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+newCreateVocabularyFilter ::
+  -- | 'vocabularyFilterName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  CreateVocabularyFilter
+newCreateVocabularyFilter
+  pVocabularyFilterName_
+  pLanguageCode_ =
+    CreateVocabularyFilter'
+      { tags = Prelude.Nothing,
+        vocabularyFilterFileUri = Prelude.Nothing,
+        words = Prelude.Nothing,
+        vocabularyFilterName = pVocabularyFilterName_,
+        languageCode = pLanguageCode_
+      }
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new custom vocabulary filter at the time you create this new vocabulary
+-- filter.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+createVocabularyFilter_tags :: Lens.Lens' CreateVocabularyFilter (Prelude.Maybe (Prelude.NonEmpty Tag))
+createVocabularyFilter_tags = Lens.lens (\CreateVocabularyFilter' {tags} -> tags) (\s@CreateVocabularyFilter' {} a -> s {tags = a} :: CreateVocabularyFilter) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 location of the text file that contains your custom
+-- vocabulary filter terms. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+--
+-- Note that if you include @VocabularyFilterFileUri@ in your request, you
+-- cannot use @Words@; you must choose one or the other.
+createVocabularyFilter_vocabularyFilterFileUri :: Lens.Lens' CreateVocabularyFilter (Prelude.Maybe Prelude.Text)
+createVocabularyFilter_vocabularyFilterFileUri = Lens.lens (\CreateVocabularyFilter' {vocabularyFilterFileUri} -> vocabularyFilterFileUri) (\s@CreateVocabularyFilter' {} a -> s {vocabularyFilterFileUri = a} :: CreateVocabularyFilter)
+
+-- | Use this parameter if you want to create your custom vocabulary filter
+-- by including all desired terms, as comma-separated values, within your
+-- request. The other option for creating your vocabulary filter is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFilterFileUri@
+-- parameter.
+--
+-- Note that if you include @Words@ in your request, you cannot use
+-- @VocabularyFilterFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+createVocabularyFilter_words :: Lens.Lens' CreateVocabularyFilter (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+createVocabularyFilter_words = Lens.lens (\CreateVocabularyFilter' {words} -> words) (\s@CreateVocabularyFilter' {} a -> s {words = a} :: CreateVocabularyFilter) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique name, chosen by you, for your new custom vocabulary filter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new custom
+-- vocabulary filter with the same name as an existing custom vocabulary
+-- filter, you get a @ConflictException@ error.
+createVocabularyFilter_vocabularyFilterName :: Lens.Lens' CreateVocabularyFilter Prelude.Text
+createVocabularyFilter_vocabularyFilterName = Lens.lens (\CreateVocabularyFilter' {vocabularyFilterName} -> vocabularyFilterName) (\s@CreateVocabularyFilter' {} a -> s {vocabularyFilterName = a} :: CreateVocabularyFilter)
+
+-- | The language code that represents the language of the entries in your
+-- vocabulary filter. Each custom vocabulary filter must contain terms in
+-- only one language.
+--
+-- A custom vocabulary filter can only be used to transcribe files in the
+-- same language as the filter. For example, if you create a custom
+-- vocabulary filter using US English (@en-US@), you can only apply this
+-- filter to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+createVocabularyFilter_languageCode :: Lens.Lens' CreateVocabularyFilter LanguageCode
+createVocabularyFilter_languageCode = Lens.lens (\CreateVocabularyFilter' {languageCode} -> languageCode) (\s@CreateVocabularyFilter' {} a -> s {languageCode = a} :: CreateVocabularyFilter)
+
+instance Core.AWSRequest CreateVocabularyFilter where
+  type
+    AWSResponse CreateVocabularyFilter =
+      CreateVocabularyFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateVocabularyFilterResponse'
+            Prelude.<$> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyFilterName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateVocabularyFilter where
+  hashWithSalt _salt CreateVocabularyFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` vocabularyFilterFileUri
+      `Prelude.hashWithSalt` words
+      `Prelude.hashWithSalt` vocabularyFilterName
+      `Prelude.hashWithSalt` languageCode
+
+instance Prelude.NFData CreateVocabularyFilter where
+  rnf CreateVocabularyFilter' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf vocabularyFilterFileUri
+      `Prelude.seq` Prelude.rnf words
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf languageCode
+
+instance Data.ToHeaders CreateVocabularyFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.CreateVocabularyFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateVocabularyFilter where
+  toJSON CreateVocabularyFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Tags" Data..=) Prelude.<$> tags,
+            ("VocabularyFilterFileUri" Data..=)
+              Prelude.<$> vocabularyFilterFileUri,
+            ("Words" Data..=) Prelude.<$> words,
+            Prelude.Just
+              ( "VocabularyFilterName"
+                  Data..= vocabularyFilterName
+              ),
+            Prelude.Just ("LanguageCode" Data..= languageCode)
+          ]
+      )
+
+instance Data.ToPath CreateVocabularyFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateVocabularyFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateVocabularyFilterResponse' smart constructor.
+data CreateVocabularyFilterResponse = CreateVocabularyFilterResponse'
+  { -- | The language code you selected for your custom vocabulary filter.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time you created your custom vocabulary filter.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name you chose for your custom vocabulary filter.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateVocabularyFilterResponse' 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:
+--
+-- 'languageCode', 'createVocabularyFilterResponse_languageCode' - The language code you selected for your custom vocabulary filter.
+--
+-- 'lastModifiedTime', 'createVocabularyFilterResponse_lastModifiedTime' - The date and time you created your custom vocabulary filter.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyFilterName', 'createVocabularyFilterResponse_vocabularyFilterName' - The name you chose for your custom vocabulary filter.
+--
+-- 'httpStatus', 'createVocabularyFilterResponse_httpStatus' - The response's http status code.
+newCreateVocabularyFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateVocabularyFilterResponse
+newCreateVocabularyFilterResponse pHttpStatus_ =
+  CreateVocabularyFilterResponse'
+    { languageCode =
+        Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The language code you selected for your custom vocabulary filter.
+createVocabularyFilterResponse_languageCode :: Lens.Lens' CreateVocabularyFilterResponse (Prelude.Maybe LanguageCode)
+createVocabularyFilterResponse_languageCode = Lens.lens (\CreateVocabularyFilterResponse' {languageCode} -> languageCode) (\s@CreateVocabularyFilterResponse' {} a -> s {languageCode = a} :: CreateVocabularyFilterResponse)
+
+-- | The date and time you created your custom vocabulary filter.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+createVocabularyFilterResponse_lastModifiedTime :: Lens.Lens' CreateVocabularyFilterResponse (Prelude.Maybe Prelude.UTCTime)
+createVocabularyFilterResponse_lastModifiedTime = Lens.lens (\CreateVocabularyFilterResponse' {lastModifiedTime} -> lastModifiedTime) (\s@CreateVocabularyFilterResponse' {} a -> s {lastModifiedTime = a} :: CreateVocabularyFilterResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name you chose for your custom vocabulary filter.
+createVocabularyFilterResponse_vocabularyFilterName :: Lens.Lens' CreateVocabularyFilterResponse (Prelude.Maybe Prelude.Text)
+createVocabularyFilterResponse_vocabularyFilterName = Lens.lens (\CreateVocabularyFilterResponse' {vocabularyFilterName} -> vocabularyFilterName) (\s@CreateVocabularyFilterResponse' {} a -> s {vocabularyFilterName = a} :: CreateVocabularyFilterResponse)
+
+-- | The response's http status code.
+createVocabularyFilterResponse_httpStatus :: Lens.Lens' CreateVocabularyFilterResponse Prelude.Int
+createVocabularyFilterResponse_httpStatus = Lens.lens (\CreateVocabularyFilterResponse' {httpStatus} -> httpStatus) (\s@CreateVocabularyFilterResponse' {} a -> s {httpStatus = a} :: CreateVocabularyFilterResponse)
+
+instance
+  Prelude.NFData
+    CreateVocabularyFilterResponse
+  where
+  rnf CreateVocabularyFilterResponse' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/DeleteCallAnalyticsCategory.hs b/gen/Amazonka/Transcribe/DeleteCallAnalyticsCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteCallAnalyticsCategory.hs
@@ -0,0 +1,168 @@
+{-# 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.Transcribe.DeleteCallAnalyticsCategory
+-- 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 a Call Analytics category. To use this operation, specify the
+-- name of the category you want to delete using @CategoryName@. Category
+-- names are case sensitive.
+module Amazonka.Transcribe.DeleteCallAnalyticsCategory
+  ( -- * Creating a Request
+    DeleteCallAnalyticsCategory (..),
+    newDeleteCallAnalyticsCategory,
+
+    -- * Request Lenses
+    deleteCallAnalyticsCategory_categoryName,
+
+    -- * Destructuring the Response
+    DeleteCallAnalyticsCategoryResponse (..),
+    newDeleteCallAnalyticsCategoryResponse,
+
+    -- * Response Lenses
+    deleteCallAnalyticsCategoryResponse_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.Transcribe.Types
+
+-- | /See:/ 'newDeleteCallAnalyticsCategory' smart constructor.
+data DeleteCallAnalyticsCategory = DeleteCallAnalyticsCategory'
+  { -- | The name of the Call Analytics category you want to delete. Category
+    -- names are case sensitive.
+    categoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCallAnalyticsCategory' 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:
+--
+-- 'categoryName', 'deleteCallAnalyticsCategory_categoryName' - The name of the Call Analytics category you want to delete. Category
+-- names are case sensitive.
+newDeleteCallAnalyticsCategory ::
+  -- | 'categoryName'
+  Prelude.Text ->
+  DeleteCallAnalyticsCategory
+newDeleteCallAnalyticsCategory pCategoryName_ =
+  DeleteCallAnalyticsCategory'
+    { categoryName =
+        pCategoryName_
+    }
+
+-- | The name of the Call Analytics category you want to delete. Category
+-- names are case sensitive.
+deleteCallAnalyticsCategory_categoryName :: Lens.Lens' DeleteCallAnalyticsCategory Prelude.Text
+deleteCallAnalyticsCategory_categoryName = Lens.lens (\DeleteCallAnalyticsCategory' {categoryName} -> categoryName) (\s@DeleteCallAnalyticsCategory' {} a -> s {categoryName = a} :: DeleteCallAnalyticsCategory)
+
+instance Core.AWSRequest DeleteCallAnalyticsCategory where
+  type
+    AWSResponse DeleteCallAnalyticsCategory =
+      DeleteCallAnalyticsCategoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteCallAnalyticsCategoryResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteCallAnalyticsCategory where
+  hashWithSalt _salt DeleteCallAnalyticsCategory' {..} =
+    _salt `Prelude.hashWithSalt` categoryName
+
+instance Prelude.NFData DeleteCallAnalyticsCategory where
+  rnf DeleteCallAnalyticsCategory' {..} =
+    Prelude.rnf categoryName
+
+instance Data.ToHeaders DeleteCallAnalyticsCategory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteCallAnalyticsCategory" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteCallAnalyticsCategory where
+  toJSON DeleteCallAnalyticsCategory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("CategoryName" Data..= categoryName)]
+      )
+
+instance Data.ToPath DeleteCallAnalyticsCategory where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteCallAnalyticsCategory where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteCallAnalyticsCategoryResponse' smart constructor.
+data DeleteCallAnalyticsCategoryResponse = DeleteCallAnalyticsCategoryResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCallAnalyticsCategoryResponse' 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', 'deleteCallAnalyticsCategoryResponse_httpStatus' - The response's http status code.
+newDeleteCallAnalyticsCategoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteCallAnalyticsCategoryResponse
+newDeleteCallAnalyticsCategoryResponse pHttpStatus_ =
+  DeleteCallAnalyticsCategoryResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteCallAnalyticsCategoryResponse_httpStatus :: Lens.Lens' DeleteCallAnalyticsCategoryResponse Prelude.Int
+deleteCallAnalyticsCategoryResponse_httpStatus = Lens.lens (\DeleteCallAnalyticsCategoryResponse' {httpStatus} -> httpStatus) (\s@DeleteCallAnalyticsCategoryResponse' {} a -> s {httpStatus = a} :: DeleteCallAnalyticsCategoryResponse)
+
+instance
+  Prelude.NFData
+    DeleteCallAnalyticsCategoryResponse
+  where
+  rnf DeleteCallAnalyticsCategoryResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/DeleteCallAnalyticsJob.hs b/gen/Amazonka/Transcribe/DeleteCallAnalyticsJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteCallAnalyticsJob.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.Transcribe.DeleteCallAnalyticsJob
+-- 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 a Call Analytics job. To use this operation, specify the name of
+-- the job you want to delete using @CallAnalyticsJobName@. Job names are
+-- case sensitive.
+module Amazonka.Transcribe.DeleteCallAnalyticsJob
+  ( -- * Creating a Request
+    DeleteCallAnalyticsJob (..),
+    newDeleteCallAnalyticsJob,
+
+    -- * Request Lenses
+    deleteCallAnalyticsJob_callAnalyticsJobName,
+
+    -- * Destructuring the Response
+    DeleteCallAnalyticsJobResponse (..),
+    newDeleteCallAnalyticsJobResponse,
+
+    -- * Response Lenses
+    deleteCallAnalyticsJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newDeleteCallAnalyticsJob' smart constructor.
+data DeleteCallAnalyticsJob = DeleteCallAnalyticsJob'
+  { -- | The name of the Call Analytics job you want to delete. Job names are
+    -- case sensitive.
+    callAnalyticsJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCallAnalyticsJob' 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:
+--
+-- 'callAnalyticsJobName', 'deleteCallAnalyticsJob_callAnalyticsJobName' - The name of the Call Analytics job you want to delete. Job names are
+-- case sensitive.
+newDeleteCallAnalyticsJob ::
+  -- | 'callAnalyticsJobName'
+  Prelude.Text ->
+  DeleteCallAnalyticsJob
+newDeleteCallAnalyticsJob pCallAnalyticsJobName_ =
+  DeleteCallAnalyticsJob'
+    { callAnalyticsJobName =
+        pCallAnalyticsJobName_
+    }
+
+-- | The name of the Call Analytics job you want to delete. Job names are
+-- case sensitive.
+deleteCallAnalyticsJob_callAnalyticsJobName :: Lens.Lens' DeleteCallAnalyticsJob Prelude.Text
+deleteCallAnalyticsJob_callAnalyticsJobName = Lens.lens (\DeleteCallAnalyticsJob' {callAnalyticsJobName} -> callAnalyticsJobName) (\s@DeleteCallAnalyticsJob' {} a -> s {callAnalyticsJobName = a} :: DeleteCallAnalyticsJob)
+
+instance Core.AWSRequest DeleteCallAnalyticsJob where
+  type
+    AWSResponse DeleteCallAnalyticsJob =
+      DeleteCallAnalyticsJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteCallAnalyticsJobResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteCallAnalyticsJob where
+  hashWithSalt _salt DeleteCallAnalyticsJob' {..} =
+    _salt `Prelude.hashWithSalt` callAnalyticsJobName
+
+instance Prelude.NFData DeleteCallAnalyticsJob where
+  rnf DeleteCallAnalyticsJob' {..} =
+    Prelude.rnf callAnalyticsJobName
+
+instance Data.ToHeaders DeleteCallAnalyticsJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteCallAnalyticsJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteCallAnalyticsJob where
+  toJSON DeleteCallAnalyticsJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "CallAnalyticsJobName"
+                  Data..= callAnalyticsJobName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteCallAnalyticsJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteCallAnalyticsJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteCallAnalyticsJobResponse' smart constructor.
+data DeleteCallAnalyticsJobResponse = DeleteCallAnalyticsJobResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCallAnalyticsJobResponse' 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', 'deleteCallAnalyticsJobResponse_httpStatus' - The response's http status code.
+newDeleteCallAnalyticsJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteCallAnalyticsJobResponse
+newDeleteCallAnalyticsJobResponse pHttpStatus_ =
+  DeleteCallAnalyticsJobResponse'
+    { httpStatus =
+        pHttpStatus_
+    }
+
+-- | The response's http status code.
+deleteCallAnalyticsJobResponse_httpStatus :: Lens.Lens' DeleteCallAnalyticsJobResponse Prelude.Int
+deleteCallAnalyticsJobResponse_httpStatus = Lens.lens (\DeleteCallAnalyticsJobResponse' {httpStatus} -> httpStatus) (\s@DeleteCallAnalyticsJobResponse' {} a -> s {httpStatus = a} :: DeleteCallAnalyticsJobResponse)
+
+instance
+  Prelude.NFData
+    DeleteCallAnalyticsJobResponse
+  where
+  rnf DeleteCallAnalyticsJobResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/DeleteLanguageModel.hs b/gen/Amazonka/Transcribe/DeleteLanguageModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteLanguageModel.hs
@@ -0,0 +1,138 @@
+{-# 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.Transcribe.DeleteLanguageModel
+-- 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 a custom language model. To use this operation, specify the name
+-- of the language model you want to delete using @ModelName@. custom
+-- language model names are case sensitive.
+module Amazonka.Transcribe.DeleteLanguageModel
+  ( -- * Creating a Request
+    DeleteLanguageModel (..),
+    newDeleteLanguageModel,
+
+    -- * Request Lenses
+    deleteLanguageModel_modelName,
+
+    -- * Destructuring the Response
+    DeleteLanguageModelResponse (..),
+    newDeleteLanguageModelResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteLanguageModel' smart constructor.
+data DeleteLanguageModel = DeleteLanguageModel'
+  { -- | The name of the custom language model you want to delete. Model names
+    -- are case sensitive.
+    modelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteLanguageModel' 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:
+--
+-- 'modelName', 'deleteLanguageModel_modelName' - The name of the custom language model you want to delete. Model names
+-- are case sensitive.
+newDeleteLanguageModel ::
+  -- | 'modelName'
+  Prelude.Text ->
+  DeleteLanguageModel
+newDeleteLanguageModel pModelName_ =
+  DeleteLanguageModel' {modelName = pModelName_}
+
+-- | The name of the custom language model you want to delete. Model names
+-- are case sensitive.
+deleteLanguageModel_modelName :: Lens.Lens' DeleteLanguageModel Prelude.Text
+deleteLanguageModel_modelName = Lens.lens (\DeleteLanguageModel' {modelName} -> modelName) (\s@DeleteLanguageModel' {} a -> s {modelName = a} :: DeleteLanguageModel)
+
+instance Core.AWSRequest DeleteLanguageModel where
+  type
+    AWSResponse DeleteLanguageModel =
+      DeleteLanguageModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteLanguageModelResponse'
+
+instance Prelude.Hashable DeleteLanguageModel where
+  hashWithSalt _salt DeleteLanguageModel' {..} =
+    _salt `Prelude.hashWithSalt` modelName
+
+instance Prelude.NFData DeleteLanguageModel where
+  rnf DeleteLanguageModel' {..} = Prelude.rnf modelName
+
+instance Data.ToHeaders DeleteLanguageModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteLanguageModel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteLanguageModel where
+  toJSON DeleteLanguageModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ModelName" Data..= modelName)]
+      )
+
+instance Data.ToPath DeleteLanguageModel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteLanguageModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteLanguageModelResponse' smart constructor.
+data DeleteLanguageModelResponse = DeleteLanguageModelResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteLanguageModelResponse' 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.
+newDeleteLanguageModelResponse ::
+  DeleteLanguageModelResponse
+newDeleteLanguageModelResponse =
+  DeleteLanguageModelResponse'
+
+instance Prelude.NFData DeleteLanguageModelResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DeleteMedicalTranscriptionJob.hs b/gen/Amazonka/Transcribe/DeleteMedicalTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteMedicalTranscriptionJob.hs
@@ -0,0 +1,158 @@
+{-# 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.Transcribe.DeleteMedicalTranscriptionJob
+-- 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 a medical transcription job. To use this operation, specify the
+-- name of the job you want to delete using @MedicalTranscriptionJobName@.
+-- Job names are case sensitive.
+module Amazonka.Transcribe.DeleteMedicalTranscriptionJob
+  ( -- * Creating a Request
+    DeleteMedicalTranscriptionJob (..),
+    newDeleteMedicalTranscriptionJob,
+
+    -- * Request Lenses
+    deleteMedicalTranscriptionJob_medicalTranscriptionJobName,
+
+    -- * Destructuring the Response
+    DeleteMedicalTranscriptionJobResponse (..),
+    newDeleteMedicalTranscriptionJobResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteMedicalTranscriptionJob' smart constructor.
+data DeleteMedicalTranscriptionJob = DeleteMedicalTranscriptionJob'
+  { -- | The name of the medical transcription job you want to delete. Job names
+    -- are case sensitive.
+    medicalTranscriptionJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMedicalTranscriptionJob' 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:
+--
+-- 'medicalTranscriptionJobName', 'deleteMedicalTranscriptionJob_medicalTranscriptionJobName' - The name of the medical transcription job you want to delete. Job names
+-- are case sensitive.
+newDeleteMedicalTranscriptionJob ::
+  -- | 'medicalTranscriptionJobName'
+  Prelude.Text ->
+  DeleteMedicalTranscriptionJob
+newDeleteMedicalTranscriptionJob
+  pMedicalTranscriptionJobName_ =
+    DeleteMedicalTranscriptionJob'
+      { medicalTranscriptionJobName =
+          pMedicalTranscriptionJobName_
+      }
+
+-- | The name of the medical transcription job you want to delete. Job names
+-- are case sensitive.
+deleteMedicalTranscriptionJob_medicalTranscriptionJobName :: Lens.Lens' DeleteMedicalTranscriptionJob Prelude.Text
+deleteMedicalTranscriptionJob_medicalTranscriptionJobName = Lens.lens (\DeleteMedicalTranscriptionJob' {medicalTranscriptionJobName} -> medicalTranscriptionJobName) (\s@DeleteMedicalTranscriptionJob' {} a -> s {medicalTranscriptionJobName = a} :: DeleteMedicalTranscriptionJob)
+
+instance
+  Core.AWSRequest
+    DeleteMedicalTranscriptionJob
+  where
+  type
+    AWSResponse DeleteMedicalTranscriptionJob =
+      DeleteMedicalTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteMedicalTranscriptionJobResponse'
+
+instance
+  Prelude.Hashable
+    DeleteMedicalTranscriptionJob
+  where
+  hashWithSalt _salt DeleteMedicalTranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` medicalTranscriptionJobName
+
+instance Prelude.NFData DeleteMedicalTranscriptionJob where
+  rnf DeleteMedicalTranscriptionJob' {..} =
+    Prelude.rnf medicalTranscriptionJobName
+
+instance Data.ToHeaders DeleteMedicalTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteMedicalTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteMedicalTranscriptionJob where
+  toJSON DeleteMedicalTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "MedicalTranscriptionJobName"
+                  Data..= medicalTranscriptionJobName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteMedicalTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteMedicalTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteMedicalTranscriptionJobResponse' smart constructor.
+data DeleteMedicalTranscriptionJobResponse = DeleteMedicalTranscriptionJobResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMedicalTranscriptionJobResponse' 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.
+newDeleteMedicalTranscriptionJobResponse ::
+  DeleteMedicalTranscriptionJobResponse
+newDeleteMedicalTranscriptionJobResponse =
+  DeleteMedicalTranscriptionJobResponse'
+
+instance
+  Prelude.NFData
+    DeleteMedicalTranscriptionJobResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DeleteMedicalVocabulary.hs b/gen/Amazonka/Transcribe/DeleteMedicalVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteMedicalVocabulary.hs
@@ -0,0 +1,148 @@
+{-# 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.Transcribe.DeleteMedicalVocabulary
+-- 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 a custom medical vocabulary. To use this operation, specify the
+-- name of the custom vocabulary you want to delete using @VocabularyName@.
+-- Custom vocabulary names are case sensitive.
+module Amazonka.Transcribe.DeleteMedicalVocabulary
+  ( -- * Creating a Request
+    DeleteMedicalVocabulary (..),
+    newDeleteMedicalVocabulary,
+
+    -- * Request Lenses
+    deleteMedicalVocabulary_vocabularyName,
+
+    -- * Destructuring the Response
+    DeleteMedicalVocabularyResponse (..),
+    newDeleteMedicalVocabularyResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteMedicalVocabulary' smart constructor.
+data DeleteMedicalVocabulary = DeleteMedicalVocabulary'
+  { -- | The name of the custom medical vocabulary you want to delete. Custom
+    -- medical vocabulary names are case sensitive.
+    vocabularyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMedicalVocabulary' 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:
+--
+-- 'vocabularyName', 'deleteMedicalVocabulary_vocabularyName' - The name of the custom medical vocabulary you want to delete. Custom
+-- medical vocabulary names are case sensitive.
+newDeleteMedicalVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  DeleteMedicalVocabulary
+newDeleteMedicalVocabulary pVocabularyName_ =
+  DeleteMedicalVocabulary'
+    { vocabularyName =
+        pVocabularyName_
+    }
+
+-- | The name of the custom medical vocabulary you want to delete. Custom
+-- medical vocabulary names are case sensitive.
+deleteMedicalVocabulary_vocabularyName :: Lens.Lens' DeleteMedicalVocabulary Prelude.Text
+deleteMedicalVocabulary_vocabularyName = Lens.lens (\DeleteMedicalVocabulary' {vocabularyName} -> vocabularyName) (\s@DeleteMedicalVocabulary' {} a -> s {vocabularyName = a} :: DeleteMedicalVocabulary)
+
+instance Core.AWSRequest DeleteMedicalVocabulary where
+  type
+    AWSResponse DeleteMedicalVocabulary =
+      DeleteMedicalVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteMedicalVocabularyResponse'
+
+instance Prelude.Hashable DeleteMedicalVocabulary where
+  hashWithSalt _salt DeleteMedicalVocabulary' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData DeleteMedicalVocabulary where
+  rnf DeleteMedicalVocabulary' {..} =
+    Prelude.rnf vocabularyName
+
+instance Data.ToHeaders DeleteMedicalVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteMedicalVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteMedicalVocabulary where
+  toJSON DeleteMedicalVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VocabularyName" Data..= vocabularyName)
+          ]
+      )
+
+instance Data.ToPath DeleteMedicalVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteMedicalVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteMedicalVocabularyResponse' smart constructor.
+data DeleteMedicalVocabularyResponse = DeleteMedicalVocabularyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMedicalVocabularyResponse' 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.
+newDeleteMedicalVocabularyResponse ::
+  DeleteMedicalVocabularyResponse
+newDeleteMedicalVocabularyResponse =
+  DeleteMedicalVocabularyResponse'
+
+instance
+  Prelude.NFData
+    DeleteMedicalVocabularyResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DeleteTranscriptionJob.hs b/gen/Amazonka/Transcribe/DeleteTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteTranscriptionJob.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.Transcribe.DeleteTranscriptionJob
+-- 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 a transcription job. To use this operation, specify the name of
+-- the job you want to delete using @TranscriptionJobName@. Job names are
+-- case sensitive.
+module Amazonka.Transcribe.DeleteTranscriptionJob
+  ( -- * Creating a Request
+    DeleteTranscriptionJob (..),
+    newDeleteTranscriptionJob,
+
+    -- * Request Lenses
+    deleteTranscriptionJob_transcriptionJobName,
+
+    -- * Destructuring the Response
+    DeleteTranscriptionJobResponse (..),
+    newDeleteTranscriptionJobResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteTranscriptionJob' smart constructor.
+data DeleteTranscriptionJob = DeleteTranscriptionJob'
+  { -- | The name of the transcription job you want to delete. Job names are case
+    -- sensitive.
+    transcriptionJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTranscriptionJob' 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:
+--
+-- 'transcriptionJobName', 'deleteTranscriptionJob_transcriptionJobName' - The name of the transcription job you want to delete. Job names are case
+-- sensitive.
+newDeleteTranscriptionJob ::
+  -- | 'transcriptionJobName'
+  Prelude.Text ->
+  DeleteTranscriptionJob
+newDeleteTranscriptionJob pTranscriptionJobName_ =
+  DeleteTranscriptionJob'
+    { transcriptionJobName =
+        pTranscriptionJobName_
+    }
+
+-- | The name of the transcription job you want to delete. Job names are case
+-- sensitive.
+deleteTranscriptionJob_transcriptionJobName :: Lens.Lens' DeleteTranscriptionJob Prelude.Text
+deleteTranscriptionJob_transcriptionJobName = Lens.lens (\DeleteTranscriptionJob' {transcriptionJobName} -> transcriptionJobName) (\s@DeleteTranscriptionJob' {} a -> s {transcriptionJobName = a} :: DeleteTranscriptionJob)
+
+instance Core.AWSRequest DeleteTranscriptionJob where
+  type
+    AWSResponse DeleteTranscriptionJob =
+      DeleteTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteTranscriptionJobResponse'
+
+instance Prelude.Hashable DeleteTranscriptionJob where
+  hashWithSalt _salt DeleteTranscriptionJob' {..} =
+    _salt `Prelude.hashWithSalt` transcriptionJobName
+
+instance Prelude.NFData DeleteTranscriptionJob where
+  rnf DeleteTranscriptionJob' {..} =
+    Prelude.rnf transcriptionJobName
+
+instance Data.ToHeaders DeleteTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteTranscriptionJob where
+  toJSON DeleteTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "TranscriptionJobName"
+                  Data..= transcriptionJobName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteTranscriptionJobResponse' smart constructor.
+data DeleteTranscriptionJobResponse = DeleteTranscriptionJobResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteTranscriptionJobResponse' 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.
+newDeleteTranscriptionJobResponse ::
+  DeleteTranscriptionJobResponse
+newDeleteTranscriptionJobResponse =
+  DeleteTranscriptionJobResponse'
+
+instance
+  Prelude.NFData
+    DeleteTranscriptionJobResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DeleteVocabulary.hs b/gen/Amazonka/Transcribe/DeleteVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteVocabulary.hs
@@ -0,0 +1,144 @@
+{-# 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.Transcribe.DeleteVocabulary
+-- 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 a custom vocabulary. To use this operation, specify the name of
+-- the custom vocabulary you want to delete using @VocabularyName@. Custom
+-- vocabulary names are case sensitive.
+module Amazonka.Transcribe.DeleteVocabulary
+  ( -- * Creating a Request
+    DeleteVocabulary (..),
+    newDeleteVocabulary,
+
+    -- * Request Lenses
+    deleteVocabulary_vocabularyName,
+
+    -- * Destructuring the Response
+    DeleteVocabularyResponse (..),
+    newDeleteVocabularyResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteVocabulary' smart constructor.
+data DeleteVocabulary = DeleteVocabulary'
+  { -- | The name of the custom vocabulary you want to delete. Custom vocabulary
+    -- names are case sensitive.
+    vocabularyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVocabulary' 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:
+--
+-- 'vocabularyName', 'deleteVocabulary_vocabularyName' - The name of the custom vocabulary you want to delete. Custom vocabulary
+-- names are case sensitive.
+newDeleteVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  DeleteVocabulary
+newDeleteVocabulary pVocabularyName_ =
+  DeleteVocabulary'
+    { vocabularyName =
+        pVocabularyName_
+    }
+
+-- | The name of the custom vocabulary you want to delete. Custom vocabulary
+-- names are case sensitive.
+deleteVocabulary_vocabularyName :: Lens.Lens' DeleteVocabulary Prelude.Text
+deleteVocabulary_vocabularyName = Lens.lens (\DeleteVocabulary' {vocabularyName} -> vocabularyName) (\s@DeleteVocabulary' {} a -> s {vocabularyName = a} :: DeleteVocabulary)
+
+instance Core.AWSRequest DeleteVocabulary where
+  type
+    AWSResponse DeleteVocabulary =
+      DeleteVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteVocabularyResponse'
+
+instance Prelude.Hashable DeleteVocabulary where
+  hashWithSalt _salt DeleteVocabulary' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData DeleteVocabulary where
+  rnf DeleteVocabulary' {..} =
+    Prelude.rnf vocabularyName
+
+instance Data.ToHeaders DeleteVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteVocabulary where
+  toJSON DeleteVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VocabularyName" Data..= vocabularyName)
+          ]
+      )
+
+instance Data.ToPath DeleteVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteVocabularyResponse' smart constructor.
+data DeleteVocabularyResponse = DeleteVocabularyResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVocabularyResponse' 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.
+newDeleteVocabularyResponse ::
+  DeleteVocabularyResponse
+newDeleteVocabularyResponse =
+  DeleteVocabularyResponse'
+
+instance Prelude.NFData DeleteVocabularyResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DeleteVocabularyFilter.hs b/gen/Amazonka/Transcribe/DeleteVocabularyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DeleteVocabularyFilter.hs
@@ -0,0 +1,151 @@
+{-# 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.Transcribe.DeleteVocabularyFilter
+-- 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 a custom vocabulary filter. To use this operation, specify the
+-- name of the custom vocabulary filter you want to delete using
+-- @VocabularyFilterName@. Custom vocabulary filter names are case
+-- sensitive.
+module Amazonka.Transcribe.DeleteVocabularyFilter
+  ( -- * Creating a Request
+    DeleteVocabularyFilter (..),
+    newDeleteVocabularyFilter,
+
+    -- * Request Lenses
+    deleteVocabularyFilter_vocabularyFilterName,
+
+    -- * Destructuring the Response
+    DeleteVocabularyFilterResponse (..),
+    newDeleteVocabularyFilterResponse,
+  )
+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.Transcribe.Types
+
+-- | /See:/ 'newDeleteVocabularyFilter' smart constructor.
+data DeleteVocabularyFilter = DeleteVocabularyFilter'
+  { -- | The name of the custom vocabulary filter you want to delete. Custom
+    -- vocabulary filter names are case sensitive.
+    vocabularyFilterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVocabularyFilter' 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:
+--
+-- 'vocabularyFilterName', 'deleteVocabularyFilter_vocabularyFilterName' - The name of the custom vocabulary filter you want to delete. Custom
+-- vocabulary filter names are case sensitive.
+newDeleteVocabularyFilter ::
+  -- | 'vocabularyFilterName'
+  Prelude.Text ->
+  DeleteVocabularyFilter
+newDeleteVocabularyFilter pVocabularyFilterName_ =
+  DeleteVocabularyFilter'
+    { vocabularyFilterName =
+        pVocabularyFilterName_
+    }
+
+-- | The name of the custom vocabulary filter you want to delete. Custom
+-- vocabulary filter names are case sensitive.
+deleteVocabularyFilter_vocabularyFilterName :: Lens.Lens' DeleteVocabularyFilter Prelude.Text
+deleteVocabularyFilter_vocabularyFilterName = Lens.lens (\DeleteVocabularyFilter' {vocabularyFilterName} -> vocabularyFilterName) (\s@DeleteVocabularyFilter' {} a -> s {vocabularyFilterName = a} :: DeleteVocabularyFilter)
+
+instance Core.AWSRequest DeleteVocabularyFilter where
+  type
+    AWSResponse DeleteVocabularyFilter =
+      DeleteVocabularyFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteVocabularyFilterResponse'
+
+instance Prelude.Hashable DeleteVocabularyFilter where
+  hashWithSalt _salt DeleteVocabularyFilter' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyFilterName
+
+instance Prelude.NFData DeleteVocabularyFilter where
+  rnf DeleteVocabularyFilter' {..} =
+    Prelude.rnf vocabularyFilterName
+
+instance Data.ToHeaders DeleteVocabularyFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DeleteVocabularyFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteVocabularyFilter where
+  toJSON DeleteVocabularyFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "VocabularyFilterName"
+                  Data..= vocabularyFilterName
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteVocabularyFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteVocabularyFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteVocabularyFilterResponse' smart constructor.
+data DeleteVocabularyFilterResponse = DeleteVocabularyFilterResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteVocabularyFilterResponse' 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.
+newDeleteVocabularyFilterResponse ::
+  DeleteVocabularyFilterResponse
+newDeleteVocabularyFilterResponse =
+  DeleteVocabularyFilterResponse'
+
+instance
+  Prelude.NFData
+    DeleteVocabularyFilterResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Transcribe/DescribeLanguageModel.hs b/gen/Amazonka/Transcribe/DescribeLanguageModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/DescribeLanguageModel.hs
@@ -0,0 +1,208 @@
+{-# 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.Transcribe.DescribeLanguageModel
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified custom language model.
+--
+-- This operation also shows if the base language model that you used to
+-- create your custom language model has been updated. If Amazon Transcribe
+-- has updated the base model, you can create a new custom language model
+-- using the updated base model.
+--
+-- If you tried to create a new custom language model and the request
+-- wasn\'t successful, you can use @DescribeLanguageModel@ to help identify
+-- the reason for this failure.
+module Amazonka.Transcribe.DescribeLanguageModel
+  ( -- * Creating a Request
+    DescribeLanguageModel (..),
+    newDescribeLanguageModel,
+
+    -- * Request Lenses
+    describeLanguageModel_modelName,
+
+    -- * Destructuring the Response
+    DescribeLanguageModelResponse (..),
+    newDescribeLanguageModelResponse,
+
+    -- * Response Lenses
+    describeLanguageModelResponse_languageModel,
+    describeLanguageModelResponse_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.Transcribe.Types
+
+-- | /See:/ 'newDescribeLanguageModel' smart constructor.
+data DescribeLanguageModel = DescribeLanguageModel'
+  { -- | The name of the custom language model you want information about. Model
+    -- names are case sensitive.
+    modelName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeLanguageModel' 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:
+--
+-- 'modelName', 'describeLanguageModel_modelName' - The name of the custom language model you want information about. Model
+-- names are case sensitive.
+newDescribeLanguageModel ::
+  -- | 'modelName'
+  Prelude.Text ->
+  DescribeLanguageModel
+newDescribeLanguageModel pModelName_ =
+  DescribeLanguageModel' {modelName = pModelName_}
+
+-- | The name of the custom language model you want information about. Model
+-- names are case sensitive.
+describeLanguageModel_modelName :: Lens.Lens' DescribeLanguageModel Prelude.Text
+describeLanguageModel_modelName = Lens.lens (\DescribeLanguageModel' {modelName} -> modelName) (\s@DescribeLanguageModel' {} a -> s {modelName = a} :: DescribeLanguageModel)
+
+instance Core.AWSRequest DescribeLanguageModel where
+  type
+    AWSResponse DescribeLanguageModel =
+      DescribeLanguageModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeLanguageModelResponse'
+            Prelude.<$> (x Data..?> "LanguageModel")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeLanguageModel where
+  hashWithSalt _salt DescribeLanguageModel' {..} =
+    _salt `Prelude.hashWithSalt` modelName
+
+instance Prelude.NFData DescribeLanguageModel where
+  rnf DescribeLanguageModel' {..} =
+    Prelude.rnf modelName
+
+instance Data.ToHeaders DescribeLanguageModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.DescribeLanguageModel" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeLanguageModel where
+  toJSON DescribeLanguageModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ModelName" Data..= modelName)]
+      )
+
+instance Data.ToPath DescribeLanguageModel where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeLanguageModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeLanguageModelResponse' smart constructor.
+data DescribeLanguageModelResponse = DescribeLanguageModelResponse'
+  { -- | Provides information about the specified custom language model.
+    --
+    -- This parameter also shows if the base language model you used to create
+    -- your custom language model has been updated. If Amazon Transcribe has
+    -- updated the base model, you can create a new custom language model using
+    -- the updated base model.
+    --
+    -- If you tried to create a new custom language model and the request
+    -- wasn\'t successful, you can use this @DescribeLanguageModel@ to help
+    -- identify the reason for this failure.
+    languageModel :: Prelude.Maybe LanguageModel,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeLanguageModelResponse' 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:
+--
+-- 'languageModel', 'describeLanguageModelResponse_languageModel' - Provides information about the specified custom language model.
+--
+-- This parameter also shows if the base language model you used to create
+-- your custom language model has been updated. If Amazon Transcribe has
+-- updated the base model, you can create a new custom language model using
+-- the updated base model.
+--
+-- If you tried to create a new custom language model and the request
+-- wasn\'t successful, you can use this @DescribeLanguageModel@ to help
+-- identify the reason for this failure.
+--
+-- 'httpStatus', 'describeLanguageModelResponse_httpStatus' - The response's http status code.
+newDescribeLanguageModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeLanguageModelResponse
+newDescribeLanguageModelResponse pHttpStatus_ =
+  DescribeLanguageModelResponse'
+    { languageModel =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides information about the specified custom language model.
+--
+-- This parameter also shows if the base language model you used to create
+-- your custom language model has been updated. If Amazon Transcribe has
+-- updated the base model, you can create a new custom language model using
+-- the updated base model.
+--
+-- If you tried to create a new custom language model and the request
+-- wasn\'t successful, you can use this @DescribeLanguageModel@ to help
+-- identify the reason for this failure.
+describeLanguageModelResponse_languageModel :: Lens.Lens' DescribeLanguageModelResponse (Prelude.Maybe LanguageModel)
+describeLanguageModelResponse_languageModel = Lens.lens (\DescribeLanguageModelResponse' {languageModel} -> languageModel) (\s@DescribeLanguageModelResponse' {} a -> s {languageModel = a} :: DescribeLanguageModelResponse)
+
+-- | The response's http status code.
+describeLanguageModelResponse_httpStatus :: Lens.Lens' DescribeLanguageModelResponse Prelude.Int
+describeLanguageModelResponse_httpStatus = Lens.lens (\DescribeLanguageModelResponse' {httpStatus} -> httpStatus) (\s@DescribeLanguageModelResponse' {} a -> s {httpStatus = a} :: DescribeLanguageModelResponse)
+
+instance Prelude.NFData DescribeLanguageModelResponse where
+  rnf DescribeLanguageModelResponse' {..} =
+    Prelude.rnf languageModel
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetCallAnalyticsCategory.hs b/gen/Amazonka/Transcribe/GetCallAnalyticsCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetCallAnalyticsCategory.hs
@@ -0,0 +1,183 @@
+{-# 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.Transcribe.GetCallAnalyticsCategory
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified Call Analytics category.
+--
+-- To get a list of your Call Analytics categories, use the operation.
+module Amazonka.Transcribe.GetCallAnalyticsCategory
+  ( -- * Creating a Request
+    GetCallAnalyticsCategory (..),
+    newGetCallAnalyticsCategory,
+
+    -- * Request Lenses
+    getCallAnalyticsCategory_categoryName,
+
+    -- * Destructuring the Response
+    GetCallAnalyticsCategoryResponse (..),
+    newGetCallAnalyticsCategoryResponse,
+
+    -- * Response Lenses
+    getCallAnalyticsCategoryResponse_categoryProperties,
+    getCallAnalyticsCategoryResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetCallAnalyticsCategory' smart constructor.
+data GetCallAnalyticsCategory = GetCallAnalyticsCategory'
+  { -- | The name of the Call Analytics category you want information about.
+    -- Category names are case sensitive.
+    categoryName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCallAnalyticsCategory' 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:
+--
+-- 'categoryName', 'getCallAnalyticsCategory_categoryName' - The name of the Call Analytics category you want information about.
+-- Category names are case sensitive.
+newGetCallAnalyticsCategory ::
+  -- | 'categoryName'
+  Prelude.Text ->
+  GetCallAnalyticsCategory
+newGetCallAnalyticsCategory pCategoryName_ =
+  GetCallAnalyticsCategory'
+    { categoryName =
+        pCategoryName_
+    }
+
+-- | The name of the Call Analytics category you want information about.
+-- Category names are case sensitive.
+getCallAnalyticsCategory_categoryName :: Lens.Lens' GetCallAnalyticsCategory Prelude.Text
+getCallAnalyticsCategory_categoryName = Lens.lens (\GetCallAnalyticsCategory' {categoryName} -> categoryName) (\s@GetCallAnalyticsCategory' {} a -> s {categoryName = a} :: GetCallAnalyticsCategory)
+
+instance Core.AWSRequest GetCallAnalyticsCategory where
+  type
+    AWSResponse GetCallAnalyticsCategory =
+      GetCallAnalyticsCategoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetCallAnalyticsCategoryResponse'
+            Prelude.<$> (x Data..?> "CategoryProperties")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetCallAnalyticsCategory where
+  hashWithSalt _salt GetCallAnalyticsCategory' {..} =
+    _salt `Prelude.hashWithSalt` categoryName
+
+instance Prelude.NFData GetCallAnalyticsCategory where
+  rnf GetCallAnalyticsCategory' {..} =
+    Prelude.rnf categoryName
+
+instance Data.ToHeaders GetCallAnalyticsCategory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetCallAnalyticsCategory" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetCallAnalyticsCategory where
+  toJSON GetCallAnalyticsCategory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("CategoryName" Data..= categoryName)]
+      )
+
+instance Data.ToPath GetCallAnalyticsCategory where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetCallAnalyticsCategory where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetCallAnalyticsCategoryResponse' smart constructor.
+data GetCallAnalyticsCategoryResponse = GetCallAnalyticsCategoryResponse'
+  { -- | Provides you with the properties of the Call Analytics category you
+    -- specified in your @GetCallAnalyticsCategory@ request.
+    categoryProperties :: Prelude.Maybe CategoryProperties,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCallAnalyticsCategoryResponse' 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:
+--
+-- 'categoryProperties', 'getCallAnalyticsCategoryResponse_categoryProperties' - Provides you with the properties of the Call Analytics category you
+-- specified in your @GetCallAnalyticsCategory@ request.
+--
+-- 'httpStatus', 'getCallAnalyticsCategoryResponse_httpStatus' - The response's http status code.
+newGetCallAnalyticsCategoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetCallAnalyticsCategoryResponse
+newGetCallAnalyticsCategoryResponse pHttpStatus_ =
+  GetCallAnalyticsCategoryResponse'
+    { categoryProperties =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides you with the properties of the Call Analytics category you
+-- specified in your @GetCallAnalyticsCategory@ request.
+getCallAnalyticsCategoryResponse_categoryProperties :: Lens.Lens' GetCallAnalyticsCategoryResponse (Prelude.Maybe CategoryProperties)
+getCallAnalyticsCategoryResponse_categoryProperties = Lens.lens (\GetCallAnalyticsCategoryResponse' {categoryProperties} -> categoryProperties) (\s@GetCallAnalyticsCategoryResponse' {} a -> s {categoryProperties = a} :: GetCallAnalyticsCategoryResponse)
+
+-- | The response's http status code.
+getCallAnalyticsCategoryResponse_httpStatus :: Lens.Lens' GetCallAnalyticsCategoryResponse Prelude.Int
+getCallAnalyticsCategoryResponse_httpStatus = Lens.lens (\GetCallAnalyticsCategoryResponse' {httpStatus} -> httpStatus) (\s@GetCallAnalyticsCategoryResponse' {} a -> s {httpStatus = a} :: GetCallAnalyticsCategoryResponse)
+
+instance
+  Prelude.NFData
+    GetCallAnalyticsCategoryResponse
+  where
+  rnf GetCallAnalyticsCategoryResponse' {..} =
+    Prelude.rnf categoryProperties
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetCallAnalyticsJob.hs b/gen/Amazonka/Transcribe/GetCallAnalyticsJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetCallAnalyticsJob.hs
@@ -0,0 +1,197 @@
+{-# 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.Transcribe.GetCallAnalyticsJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified Call Analytics job.
+--
+-- To view the job\'s status, refer to @CallAnalyticsJobStatus@. If the
+-- status is @COMPLETED@, the job is finished. You can find your completed
+-- transcript at the URI specified in @TranscriptFileUri@. If the status is
+-- @FAILED@, @FailureReason@ provides details on why your transcription job
+-- failed.
+--
+-- If you enabled personally identifiable information (PII) redaction, the
+-- redacted transcript appears at the location specified in
+-- @RedactedTranscriptFileUri@.
+--
+-- If you chose to redact the audio in your media file, you can find your
+-- redacted media file at the location specified in @RedactedMediaFileUri@.
+--
+-- To get a list of your Call Analytics jobs, use the operation.
+module Amazonka.Transcribe.GetCallAnalyticsJob
+  ( -- * Creating a Request
+    GetCallAnalyticsJob (..),
+    newGetCallAnalyticsJob,
+
+    -- * Request Lenses
+    getCallAnalyticsJob_callAnalyticsJobName,
+
+    -- * Destructuring the Response
+    GetCallAnalyticsJobResponse (..),
+    newGetCallAnalyticsJobResponse,
+
+    -- * Response Lenses
+    getCallAnalyticsJobResponse_callAnalyticsJob,
+    getCallAnalyticsJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetCallAnalyticsJob' smart constructor.
+data GetCallAnalyticsJob = GetCallAnalyticsJob'
+  { -- | The name of the Call Analytics job you want information about. Job names
+    -- are case sensitive.
+    callAnalyticsJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCallAnalyticsJob' 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:
+--
+-- 'callAnalyticsJobName', 'getCallAnalyticsJob_callAnalyticsJobName' - The name of the Call Analytics job you want information about. Job names
+-- are case sensitive.
+newGetCallAnalyticsJob ::
+  -- | 'callAnalyticsJobName'
+  Prelude.Text ->
+  GetCallAnalyticsJob
+newGetCallAnalyticsJob pCallAnalyticsJobName_ =
+  GetCallAnalyticsJob'
+    { callAnalyticsJobName =
+        pCallAnalyticsJobName_
+    }
+
+-- | The name of the Call Analytics job you want information about. Job names
+-- are case sensitive.
+getCallAnalyticsJob_callAnalyticsJobName :: Lens.Lens' GetCallAnalyticsJob Prelude.Text
+getCallAnalyticsJob_callAnalyticsJobName = Lens.lens (\GetCallAnalyticsJob' {callAnalyticsJobName} -> callAnalyticsJobName) (\s@GetCallAnalyticsJob' {} a -> s {callAnalyticsJobName = a} :: GetCallAnalyticsJob)
+
+instance Core.AWSRequest GetCallAnalyticsJob where
+  type
+    AWSResponse GetCallAnalyticsJob =
+      GetCallAnalyticsJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetCallAnalyticsJobResponse'
+            Prelude.<$> (x Data..?> "CallAnalyticsJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetCallAnalyticsJob where
+  hashWithSalt _salt GetCallAnalyticsJob' {..} =
+    _salt `Prelude.hashWithSalt` callAnalyticsJobName
+
+instance Prelude.NFData GetCallAnalyticsJob where
+  rnf GetCallAnalyticsJob' {..} =
+    Prelude.rnf callAnalyticsJobName
+
+instance Data.ToHeaders GetCallAnalyticsJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetCallAnalyticsJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetCallAnalyticsJob where
+  toJSON GetCallAnalyticsJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "CallAnalyticsJobName"
+                  Data..= callAnalyticsJobName
+              )
+          ]
+      )
+
+instance Data.ToPath GetCallAnalyticsJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetCallAnalyticsJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetCallAnalyticsJobResponse' smart constructor.
+data GetCallAnalyticsJobResponse = GetCallAnalyticsJobResponse'
+  { -- | Provides detailed information about the specified Call Analytics job,
+    -- including job status and, if applicable, failure reason.
+    callAnalyticsJob :: Prelude.Maybe CallAnalyticsJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetCallAnalyticsJobResponse' 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:
+--
+-- 'callAnalyticsJob', 'getCallAnalyticsJobResponse_callAnalyticsJob' - Provides detailed information about the specified Call Analytics job,
+-- including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'getCallAnalyticsJobResponse_httpStatus' - The response's http status code.
+newGetCallAnalyticsJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetCallAnalyticsJobResponse
+newGetCallAnalyticsJobResponse pHttpStatus_ =
+  GetCallAnalyticsJobResponse'
+    { callAnalyticsJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the specified Call Analytics job,
+-- including job status and, if applicable, failure reason.
+getCallAnalyticsJobResponse_callAnalyticsJob :: Lens.Lens' GetCallAnalyticsJobResponse (Prelude.Maybe CallAnalyticsJob)
+getCallAnalyticsJobResponse_callAnalyticsJob = Lens.lens (\GetCallAnalyticsJobResponse' {callAnalyticsJob} -> callAnalyticsJob) (\s@GetCallAnalyticsJobResponse' {} a -> s {callAnalyticsJob = a} :: GetCallAnalyticsJobResponse)
+
+-- | The response's http status code.
+getCallAnalyticsJobResponse_httpStatus :: Lens.Lens' GetCallAnalyticsJobResponse Prelude.Int
+getCallAnalyticsJobResponse_httpStatus = Lens.lens (\GetCallAnalyticsJobResponse' {httpStatus} -> httpStatus) (\s@GetCallAnalyticsJobResponse' {} a -> s {httpStatus = a} :: GetCallAnalyticsJobResponse)
+
+instance Prelude.NFData GetCallAnalyticsJobResponse where
+  rnf GetCallAnalyticsJobResponse' {..} =
+    Prelude.rnf callAnalyticsJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetMedicalTranscriptionJob.hs b/gen/Amazonka/Transcribe/GetMedicalTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetMedicalTranscriptionJob.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.Transcribe.GetMedicalTranscriptionJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified medical transcription job.
+--
+-- To view the status of the specified medical transcription job, check the
+-- @TranscriptionJobStatus@ field. If the status is @COMPLETED@, the job is
+-- finished. You can find the results at the location specified in
+-- @TranscriptFileUri@. If the status is @FAILED@, @FailureReason@ provides
+-- details on why your transcription job failed.
+--
+-- To get a list of your medical transcription jobs, use the operation.
+module Amazonka.Transcribe.GetMedicalTranscriptionJob
+  ( -- * Creating a Request
+    GetMedicalTranscriptionJob (..),
+    newGetMedicalTranscriptionJob,
+
+    -- * Request Lenses
+    getMedicalTranscriptionJob_medicalTranscriptionJobName,
+
+    -- * Destructuring the Response
+    GetMedicalTranscriptionJobResponse (..),
+    newGetMedicalTranscriptionJobResponse,
+
+    -- * Response Lenses
+    getMedicalTranscriptionJobResponse_medicalTranscriptionJob,
+    getMedicalTranscriptionJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetMedicalTranscriptionJob' smart constructor.
+data GetMedicalTranscriptionJob = GetMedicalTranscriptionJob'
+  { -- | The name of the medical transcription job you want information about.
+    -- Job names are case sensitive.
+    medicalTranscriptionJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMedicalTranscriptionJob' 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:
+--
+-- 'medicalTranscriptionJobName', 'getMedicalTranscriptionJob_medicalTranscriptionJobName' - The name of the medical transcription job you want information about.
+-- Job names are case sensitive.
+newGetMedicalTranscriptionJob ::
+  -- | 'medicalTranscriptionJobName'
+  Prelude.Text ->
+  GetMedicalTranscriptionJob
+newGetMedicalTranscriptionJob
+  pMedicalTranscriptionJobName_ =
+    GetMedicalTranscriptionJob'
+      { medicalTranscriptionJobName =
+          pMedicalTranscriptionJobName_
+      }
+
+-- | The name of the medical transcription job you want information about.
+-- Job names are case sensitive.
+getMedicalTranscriptionJob_medicalTranscriptionJobName :: Lens.Lens' GetMedicalTranscriptionJob Prelude.Text
+getMedicalTranscriptionJob_medicalTranscriptionJobName = Lens.lens (\GetMedicalTranscriptionJob' {medicalTranscriptionJobName} -> medicalTranscriptionJobName) (\s@GetMedicalTranscriptionJob' {} a -> s {medicalTranscriptionJobName = a} :: GetMedicalTranscriptionJob)
+
+instance Core.AWSRequest GetMedicalTranscriptionJob where
+  type
+    AWSResponse GetMedicalTranscriptionJob =
+      GetMedicalTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetMedicalTranscriptionJobResponse'
+            Prelude.<$> (x Data..?> "MedicalTranscriptionJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetMedicalTranscriptionJob where
+  hashWithSalt _salt GetMedicalTranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` medicalTranscriptionJobName
+
+instance Prelude.NFData GetMedicalTranscriptionJob where
+  rnf GetMedicalTranscriptionJob' {..} =
+    Prelude.rnf medicalTranscriptionJobName
+
+instance Data.ToHeaders GetMedicalTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetMedicalTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetMedicalTranscriptionJob where
+  toJSON GetMedicalTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "MedicalTranscriptionJobName"
+                  Data..= medicalTranscriptionJobName
+              )
+          ]
+      )
+
+instance Data.ToPath GetMedicalTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetMedicalTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetMedicalTranscriptionJobResponse' smart constructor.
+data GetMedicalTranscriptionJobResponse = GetMedicalTranscriptionJobResponse'
+  { -- | Provides detailed information about the specified medical transcription
+    -- job, including job status and, if applicable, failure reason.
+    medicalTranscriptionJob :: Prelude.Maybe MedicalTranscriptionJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMedicalTranscriptionJobResponse' 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:
+--
+-- 'medicalTranscriptionJob', 'getMedicalTranscriptionJobResponse_medicalTranscriptionJob' - Provides detailed information about the specified medical transcription
+-- job, including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'getMedicalTranscriptionJobResponse_httpStatus' - The response's http status code.
+newGetMedicalTranscriptionJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetMedicalTranscriptionJobResponse
+newGetMedicalTranscriptionJobResponse pHttpStatus_ =
+  GetMedicalTranscriptionJobResponse'
+    { medicalTranscriptionJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the specified medical transcription
+-- job, including job status and, if applicable, failure reason.
+getMedicalTranscriptionJobResponse_medicalTranscriptionJob :: Lens.Lens' GetMedicalTranscriptionJobResponse (Prelude.Maybe MedicalTranscriptionJob)
+getMedicalTranscriptionJobResponse_medicalTranscriptionJob = Lens.lens (\GetMedicalTranscriptionJobResponse' {medicalTranscriptionJob} -> medicalTranscriptionJob) (\s@GetMedicalTranscriptionJobResponse' {} a -> s {medicalTranscriptionJob = a} :: GetMedicalTranscriptionJobResponse)
+
+-- | The response's http status code.
+getMedicalTranscriptionJobResponse_httpStatus :: Lens.Lens' GetMedicalTranscriptionJobResponse Prelude.Int
+getMedicalTranscriptionJobResponse_httpStatus = Lens.lens (\GetMedicalTranscriptionJobResponse' {httpStatus} -> httpStatus) (\s@GetMedicalTranscriptionJobResponse' {} a -> s {httpStatus = a} :: GetMedicalTranscriptionJobResponse)
+
+instance
+  Prelude.NFData
+    GetMedicalTranscriptionJobResponse
+  where
+  rnf GetMedicalTranscriptionJobResponse' {..} =
+    Prelude.rnf medicalTranscriptionJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetMedicalVocabulary.hs b/gen/Amazonka/Transcribe/GetMedicalVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetMedicalVocabulary.hs
@@ -0,0 +1,283 @@
+{-# 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.Transcribe.GetMedicalVocabulary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified custom medical vocabulary.
+--
+-- To view the status of the specified custom medical vocabulary, check the
+-- @VocabularyState@ field. If the status is @READY@, your custom
+-- vocabulary is available to use. If the status is @FAILED@,
+-- @FailureReason@ provides details on why your vocabulary failed.
+--
+-- To get a list of your custom medical vocabularies, use the operation.
+module Amazonka.Transcribe.GetMedicalVocabulary
+  ( -- * Creating a Request
+    GetMedicalVocabulary (..),
+    newGetMedicalVocabulary,
+
+    -- * Request Lenses
+    getMedicalVocabulary_vocabularyName,
+
+    -- * Destructuring the Response
+    GetMedicalVocabularyResponse (..),
+    newGetMedicalVocabularyResponse,
+
+    -- * Response Lenses
+    getMedicalVocabularyResponse_downloadUri,
+    getMedicalVocabularyResponse_failureReason,
+    getMedicalVocabularyResponse_languageCode,
+    getMedicalVocabularyResponse_lastModifiedTime,
+    getMedicalVocabularyResponse_vocabularyName,
+    getMedicalVocabularyResponse_vocabularyState,
+    getMedicalVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetMedicalVocabulary' smart constructor.
+data GetMedicalVocabulary = GetMedicalVocabulary'
+  { -- | The name of the custom medical vocabulary you want information about.
+    -- Custom medical vocabulary names are case sensitive.
+    vocabularyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMedicalVocabulary' 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:
+--
+-- 'vocabularyName', 'getMedicalVocabulary_vocabularyName' - The name of the custom medical vocabulary you want information about.
+-- Custom medical vocabulary names are case sensitive.
+newGetMedicalVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  GetMedicalVocabulary
+newGetMedicalVocabulary pVocabularyName_ =
+  GetMedicalVocabulary'
+    { vocabularyName =
+        pVocabularyName_
+    }
+
+-- | The name of the custom medical vocabulary you want information about.
+-- Custom medical vocabulary names are case sensitive.
+getMedicalVocabulary_vocabularyName :: Lens.Lens' GetMedicalVocabulary Prelude.Text
+getMedicalVocabulary_vocabularyName = Lens.lens (\GetMedicalVocabulary' {vocabularyName} -> vocabularyName) (\s@GetMedicalVocabulary' {} a -> s {vocabularyName = a} :: GetMedicalVocabulary)
+
+instance Core.AWSRequest GetMedicalVocabulary where
+  type
+    AWSResponse GetMedicalVocabulary =
+      GetMedicalVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetMedicalVocabularyResponse'
+            Prelude.<$> (x Data..?> "DownloadUri")
+            Prelude.<*> (x Data..?> "FailureReason")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetMedicalVocabulary where
+  hashWithSalt _salt GetMedicalVocabulary' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData GetMedicalVocabulary where
+  rnf GetMedicalVocabulary' {..} =
+    Prelude.rnf vocabularyName
+
+instance Data.ToHeaders GetMedicalVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetMedicalVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetMedicalVocabulary where
+  toJSON GetMedicalVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VocabularyName" Data..= vocabularyName)
+          ]
+      )
+
+instance Data.ToPath GetMedicalVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetMedicalVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetMedicalVocabularyResponse' smart constructor.
+data GetMedicalVocabularyResponse = GetMedicalVocabularyResponse'
+  { -- | The S3 location where the specified custom medical vocabulary is stored;
+    -- use this URI to view or download the custom vocabulary.
+    downloadUri :: Prelude.Maybe Prelude.Text,
+    -- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+    -- about why the custom medical vocabulary request failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code you selected for your custom medical vocabulary. US
+    -- English (@en-US@) is the only language supported with Amazon Transcribe
+    -- Medical.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom medical vocabulary was last
+    -- modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the custom medical vocabulary you requested information
+    -- about.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom medical vocabulary. If the state is
+    -- @READY@, you can use the custom vocabulary in a
+    -- @StartMedicalTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetMedicalVocabularyResponse' 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:
+--
+-- 'downloadUri', 'getMedicalVocabularyResponse_downloadUri' - The S3 location where the specified custom medical vocabulary is stored;
+-- use this URI to view or download the custom vocabulary.
+--
+-- 'failureReason', 'getMedicalVocabularyResponse_failureReason' - If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom medical vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'getMedicalVocabularyResponse_languageCode' - The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+--
+-- 'lastModifiedTime', 'getMedicalVocabularyResponse_lastModifiedTime' - The date and time the specified custom medical vocabulary was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'getMedicalVocabularyResponse_vocabularyName' - The name of the custom medical vocabulary you requested information
+-- about.
+--
+-- 'vocabularyState', 'getMedicalVocabularyResponse_vocabularyState' - The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+--
+-- 'httpStatus', 'getMedicalVocabularyResponse_httpStatus' - The response's http status code.
+newGetMedicalVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetMedicalVocabularyResponse
+newGetMedicalVocabularyResponse pHttpStatus_ =
+  GetMedicalVocabularyResponse'
+    { downloadUri =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The S3 location where the specified custom medical vocabulary is stored;
+-- use this URI to view or download the custom vocabulary.
+getMedicalVocabularyResponse_downloadUri :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+getMedicalVocabularyResponse_downloadUri = Lens.lens (\GetMedicalVocabularyResponse' {downloadUri} -> downloadUri) (\s@GetMedicalVocabularyResponse' {} a -> s {downloadUri = a} :: GetMedicalVocabularyResponse)
+
+-- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom medical vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+getMedicalVocabularyResponse_failureReason :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+getMedicalVocabularyResponse_failureReason = Lens.lens (\GetMedicalVocabularyResponse' {failureReason} -> failureReason) (\s@GetMedicalVocabularyResponse' {} a -> s {failureReason = a} :: GetMedicalVocabularyResponse)
+
+-- | The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+getMedicalVocabularyResponse_languageCode :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe LanguageCode)
+getMedicalVocabularyResponse_languageCode = Lens.lens (\GetMedicalVocabularyResponse' {languageCode} -> languageCode) (\s@GetMedicalVocabularyResponse' {} a -> s {languageCode = a} :: GetMedicalVocabularyResponse)
+
+-- | The date and time the specified custom medical vocabulary was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+getMedicalVocabularyResponse_lastModifiedTime :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+getMedicalVocabularyResponse_lastModifiedTime = Lens.lens (\GetMedicalVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetMedicalVocabularyResponse' {} a -> s {lastModifiedTime = a} :: GetMedicalVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the custom medical vocabulary you requested information
+-- about.
+getMedicalVocabularyResponse_vocabularyName :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+getMedicalVocabularyResponse_vocabularyName = Lens.lens (\GetMedicalVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@GetMedicalVocabularyResponse' {} a -> s {vocabularyName = a} :: GetMedicalVocabularyResponse)
+
+-- | The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+getMedicalVocabularyResponse_vocabularyState :: Lens.Lens' GetMedicalVocabularyResponse (Prelude.Maybe VocabularyState)
+getMedicalVocabularyResponse_vocabularyState = Lens.lens (\GetMedicalVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@GetMedicalVocabularyResponse' {} a -> s {vocabularyState = a} :: GetMedicalVocabularyResponse)
+
+-- | The response's http status code.
+getMedicalVocabularyResponse_httpStatus :: Lens.Lens' GetMedicalVocabularyResponse Prelude.Int
+getMedicalVocabularyResponse_httpStatus = Lens.lens (\GetMedicalVocabularyResponse' {httpStatus} -> httpStatus) (\s@GetMedicalVocabularyResponse' {} a -> s {httpStatus = a} :: GetMedicalVocabularyResponse)
+
+instance Prelude.NFData GetMedicalVocabularyResponse where
+  rnf GetMedicalVocabularyResponse' {..} =
+    Prelude.rnf downloadUri
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetTranscriptionJob.hs b/gen/Amazonka/Transcribe/GetTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetTranscriptionJob.hs
@@ -0,0 +1,193 @@
+{-# 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.Transcribe.GetTranscriptionJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified transcription job.
+--
+-- To view the status of the specified transcription job, check the
+-- @TranscriptionJobStatus@ field. If the status is @COMPLETED@, the job is
+-- finished. You can find the results at the location specified in
+-- @TranscriptFileUri@. If the status is @FAILED@, @FailureReason@ provides
+-- details on why your transcription job failed.
+--
+-- If you enabled content redaction, the redacted transcript can be found
+-- at the location specified in @RedactedTranscriptFileUri@.
+--
+-- To get a list of your transcription jobs, use the operation.
+module Amazonka.Transcribe.GetTranscriptionJob
+  ( -- * Creating a Request
+    GetTranscriptionJob (..),
+    newGetTranscriptionJob,
+
+    -- * Request Lenses
+    getTranscriptionJob_transcriptionJobName,
+
+    -- * Destructuring the Response
+    GetTranscriptionJobResponse (..),
+    newGetTranscriptionJobResponse,
+
+    -- * Response Lenses
+    getTranscriptionJobResponse_transcriptionJob,
+    getTranscriptionJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetTranscriptionJob' smart constructor.
+data GetTranscriptionJob = GetTranscriptionJob'
+  { -- | The name of the transcription job you want information about. Job names
+    -- are case sensitive.
+    transcriptionJobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTranscriptionJob' 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:
+--
+-- 'transcriptionJobName', 'getTranscriptionJob_transcriptionJobName' - The name of the transcription job you want information about. Job names
+-- are case sensitive.
+newGetTranscriptionJob ::
+  -- | 'transcriptionJobName'
+  Prelude.Text ->
+  GetTranscriptionJob
+newGetTranscriptionJob pTranscriptionJobName_ =
+  GetTranscriptionJob'
+    { transcriptionJobName =
+        pTranscriptionJobName_
+    }
+
+-- | The name of the transcription job you want information about. Job names
+-- are case sensitive.
+getTranscriptionJob_transcriptionJobName :: Lens.Lens' GetTranscriptionJob Prelude.Text
+getTranscriptionJob_transcriptionJobName = Lens.lens (\GetTranscriptionJob' {transcriptionJobName} -> transcriptionJobName) (\s@GetTranscriptionJob' {} a -> s {transcriptionJobName = a} :: GetTranscriptionJob)
+
+instance Core.AWSRequest GetTranscriptionJob where
+  type
+    AWSResponse GetTranscriptionJob =
+      GetTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetTranscriptionJobResponse'
+            Prelude.<$> (x Data..?> "TranscriptionJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetTranscriptionJob where
+  hashWithSalt _salt GetTranscriptionJob' {..} =
+    _salt `Prelude.hashWithSalt` transcriptionJobName
+
+instance Prelude.NFData GetTranscriptionJob where
+  rnf GetTranscriptionJob' {..} =
+    Prelude.rnf transcriptionJobName
+
+instance Data.ToHeaders GetTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetTranscriptionJob where
+  toJSON GetTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "TranscriptionJobName"
+                  Data..= transcriptionJobName
+              )
+          ]
+      )
+
+instance Data.ToPath GetTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetTranscriptionJobResponse' smart constructor.
+data GetTranscriptionJobResponse = GetTranscriptionJobResponse'
+  { -- | Provides detailed information about the specified transcription job,
+    -- including job status and, if applicable, failure reason.
+    transcriptionJob :: Prelude.Maybe TranscriptionJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetTranscriptionJobResponse' 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:
+--
+-- 'transcriptionJob', 'getTranscriptionJobResponse_transcriptionJob' - Provides detailed information about the specified transcription job,
+-- including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'getTranscriptionJobResponse_httpStatus' - The response's http status code.
+newGetTranscriptionJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetTranscriptionJobResponse
+newGetTranscriptionJobResponse pHttpStatus_ =
+  GetTranscriptionJobResponse'
+    { transcriptionJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the specified transcription job,
+-- including job status and, if applicable, failure reason.
+getTranscriptionJobResponse_transcriptionJob :: Lens.Lens' GetTranscriptionJobResponse (Prelude.Maybe TranscriptionJob)
+getTranscriptionJobResponse_transcriptionJob = Lens.lens (\GetTranscriptionJobResponse' {transcriptionJob} -> transcriptionJob) (\s@GetTranscriptionJobResponse' {} a -> s {transcriptionJob = a} :: GetTranscriptionJobResponse)
+
+-- | The response's http status code.
+getTranscriptionJobResponse_httpStatus :: Lens.Lens' GetTranscriptionJobResponse Prelude.Int
+getTranscriptionJobResponse_httpStatus = Lens.lens (\GetTranscriptionJobResponse' {httpStatus} -> httpStatus) (\s@GetTranscriptionJobResponse' {} a -> s {httpStatus = a} :: GetTranscriptionJobResponse)
+
+instance Prelude.NFData GetTranscriptionJobResponse where
+  rnf GetTranscriptionJobResponse' {..} =
+    Prelude.rnf transcriptionJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetVocabulary.hs b/gen/Amazonka/Transcribe/GetVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetVocabulary.hs
@@ -0,0 +1,262 @@
+{-# 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.Transcribe.GetVocabulary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified custom vocabulary.
+--
+-- To view the status of the specified custom vocabulary, check the
+-- @VocabularyState@ field. If the status is @READY@, your custom
+-- vocabulary is available to use. If the status is @FAILED@,
+-- @FailureReason@ provides details on why your custom vocabulary failed.
+--
+-- To get a list of your custom vocabularies, use the operation.
+module Amazonka.Transcribe.GetVocabulary
+  ( -- * Creating a Request
+    GetVocabulary (..),
+    newGetVocabulary,
+
+    -- * Request Lenses
+    getVocabulary_vocabularyName,
+
+    -- * Destructuring the Response
+    GetVocabularyResponse (..),
+    newGetVocabularyResponse,
+
+    -- * Response Lenses
+    getVocabularyResponse_downloadUri,
+    getVocabularyResponse_failureReason,
+    getVocabularyResponse_languageCode,
+    getVocabularyResponse_lastModifiedTime,
+    getVocabularyResponse_vocabularyName,
+    getVocabularyResponse_vocabularyState,
+    getVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetVocabulary' smart constructor.
+data GetVocabulary = GetVocabulary'
+  { -- | The name of the custom vocabulary you want information about. Custom
+    -- vocabulary names are case sensitive.
+    vocabularyName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetVocabulary' 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:
+--
+-- 'vocabularyName', 'getVocabulary_vocabularyName' - The name of the custom vocabulary you want information about. Custom
+-- vocabulary names are case sensitive.
+newGetVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  GetVocabulary
+newGetVocabulary pVocabularyName_ =
+  GetVocabulary' {vocabularyName = pVocabularyName_}
+
+-- | The name of the custom vocabulary you want information about. Custom
+-- vocabulary names are case sensitive.
+getVocabulary_vocabularyName :: Lens.Lens' GetVocabulary Prelude.Text
+getVocabulary_vocabularyName = Lens.lens (\GetVocabulary' {vocabularyName} -> vocabularyName) (\s@GetVocabulary' {} a -> s {vocabularyName = a} :: GetVocabulary)
+
+instance Core.AWSRequest GetVocabulary where
+  type
+    AWSResponse GetVocabulary =
+      GetVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetVocabularyResponse'
+            Prelude.<$> (x Data..?> "DownloadUri")
+            Prelude.<*> (x Data..?> "FailureReason")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetVocabulary where
+  hashWithSalt _salt GetVocabulary' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData GetVocabulary where
+  rnf GetVocabulary' {..} = Prelude.rnf vocabularyName
+
+instance Data.ToHeaders GetVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ("Transcribe.GetVocabulary" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetVocabulary where
+  toJSON GetVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VocabularyName" Data..= vocabularyName)
+          ]
+      )
+
+instance Data.ToPath GetVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetVocabularyResponse' smart constructor.
+data GetVocabularyResponse = GetVocabularyResponse'
+  { -- | The S3 location where the custom vocabulary is stored; use this URI to
+    -- view or download the custom vocabulary.
+    downloadUri :: Prelude.Maybe Prelude.Text,
+    -- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+    -- about why the custom vocabulary request failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code you selected for your custom vocabulary.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary was last modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the custom vocabulary you requested information about.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom vocabulary. If the state is @READY@,
+    -- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetVocabularyResponse' 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:
+--
+-- 'downloadUri', 'getVocabularyResponse_downloadUri' - The S3 location where the custom vocabulary is stored; use this URI to
+-- view or download the custom vocabulary.
+--
+-- 'failureReason', 'getVocabularyResponse_failureReason' - If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'getVocabularyResponse_languageCode' - The language code you selected for your custom vocabulary.
+--
+-- 'lastModifiedTime', 'getVocabularyResponse_lastModifiedTime' - The date and time the specified custom vocabulary was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'getVocabularyResponse_vocabularyName' - The name of the custom vocabulary you requested information about.
+--
+-- 'vocabularyState', 'getVocabularyResponse_vocabularyState' - The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+--
+-- 'httpStatus', 'getVocabularyResponse_httpStatus' - The response's http status code.
+newGetVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetVocabularyResponse
+newGetVocabularyResponse pHttpStatus_ =
+  GetVocabularyResponse'
+    { downloadUri =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The S3 location where the custom vocabulary is stored; use this URI to
+-- view or download the custom vocabulary.
+getVocabularyResponse_downloadUri :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe Prelude.Text)
+getVocabularyResponse_downloadUri = Lens.lens (\GetVocabularyResponse' {downloadUri} -> downloadUri) (\s@GetVocabularyResponse' {} a -> s {downloadUri = a} :: GetVocabularyResponse)
+
+-- | If @VocabularyState@ is @FAILED@, @FailureReason@ contains information
+-- about why the custom vocabulary request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+getVocabularyResponse_failureReason :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe Prelude.Text)
+getVocabularyResponse_failureReason = Lens.lens (\GetVocabularyResponse' {failureReason} -> failureReason) (\s@GetVocabularyResponse' {} a -> s {failureReason = a} :: GetVocabularyResponse)
+
+-- | The language code you selected for your custom vocabulary.
+getVocabularyResponse_languageCode :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe LanguageCode)
+getVocabularyResponse_languageCode = Lens.lens (\GetVocabularyResponse' {languageCode} -> languageCode) (\s@GetVocabularyResponse' {} a -> s {languageCode = a} :: GetVocabularyResponse)
+
+-- | The date and time the specified custom vocabulary was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+getVocabularyResponse_lastModifiedTime :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+getVocabularyResponse_lastModifiedTime = Lens.lens (\GetVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetVocabularyResponse' {} a -> s {lastModifiedTime = a} :: GetVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the custom vocabulary you requested information about.
+getVocabularyResponse_vocabularyName :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe Prelude.Text)
+getVocabularyResponse_vocabularyName = Lens.lens (\GetVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@GetVocabularyResponse' {} a -> s {vocabularyName = a} :: GetVocabularyResponse)
+
+-- | The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+getVocabularyResponse_vocabularyState :: Lens.Lens' GetVocabularyResponse (Prelude.Maybe VocabularyState)
+getVocabularyResponse_vocabularyState = Lens.lens (\GetVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@GetVocabularyResponse' {} a -> s {vocabularyState = a} :: GetVocabularyResponse)
+
+-- | The response's http status code.
+getVocabularyResponse_httpStatus :: Lens.Lens' GetVocabularyResponse Prelude.Int
+getVocabularyResponse_httpStatus = Lens.lens (\GetVocabularyResponse' {httpStatus} -> httpStatus) (\s@GetVocabularyResponse' {} a -> s {httpStatus = a} :: GetVocabularyResponse)
+
+instance Prelude.NFData GetVocabularyResponse where
+  rnf GetVocabularyResponse' {..} =
+    Prelude.rnf downloadUri
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/GetVocabularyFilter.hs b/gen/Amazonka/Transcribe/GetVocabularyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/GetVocabularyFilter.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.Transcribe.GetVocabularyFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides information about the specified custom vocabulary filter.
+--
+-- To get a list of your custom vocabulary filters, use the operation.
+module Amazonka.Transcribe.GetVocabularyFilter
+  ( -- * Creating a Request
+    GetVocabularyFilter (..),
+    newGetVocabularyFilter,
+
+    -- * Request Lenses
+    getVocabularyFilter_vocabularyFilterName,
+
+    -- * Destructuring the Response
+    GetVocabularyFilterResponse (..),
+    newGetVocabularyFilterResponse,
+
+    -- * Response Lenses
+    getVocabularyFilterResponse_downloadUri,
+    getVocabularyFilterResponse_languageCode,
+    getVocabularyFilterResponse_lastModifiedTime,
+    getVocabularyFilterResponse_vocabularyFilterName,
+    getVocabularyFilterResponse_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.Transcribe.Types
+
+-- | /See:/ 'newGetVocabularyFilter' smart constructor.
+data GetVocabularyFilter = GetVocabularyFilter'
+  { -- | The name of the custom vocabulary filter you want information about.
+    -- Custom vocabulary filter names are case sensitive.
+    vocabularyFilterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetVocabularyFilter' 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:
+--
+-- 'vocabularyFilterName', 'getVocabularyFilter_vocabularyFilterName' - The name of the custom vocabulary filter you want information about.
+-- Custom vocabulary filter names are case sensitive.
+newGetVocabularyFilter ::
+  -- | 'vocabularyFilterName'
+  Prelude.Text ->
+  GetVocabularyFilter
+newGetVocabularyFilter pVocabularyFilterName_ =
+  GetVocabularyFilter'
+    { vocabularyFilterName =
+        pVocabularyFilterName_
+    }
+
+-- | The name of the custom vocabulary filter you want information about.
+-- Custom vocabulary filter names are case sensitive.
+getVocabularyFilter_vocabularyFilterName :: Lens.Lens' GetVocabularyFilter Prelude.Text
+getVocabularyFilter_vocabularyFilterName = Lens.lens (\GetVocabularyFilter' {vocabularyFilterName} -> vocabularyFilterName) (\s@GetVocabularyFilter' {} a -> s {vocabularyFilterName = a} :: GetVocabularyFilter)
+
+instance Core.AWSRequest GetVocabularyFilter where
+  type
+    AWSResponse GetVocabularyFilter =
+      GetVocabularyFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetVocabularyFilterResponse'
+            Prelude.<$> (x Data..?> "DownloadUri")
+            Prelude.<*> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyFilterName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetVocabularyFilter where
+  hashWithSalt _salt GetVocabularyFilter' {..} =
+    _salt `Prelude.hashWithSalt` vocabularyFilterName
+
+instance Prelude.NFData GetVocabularyFilter where
+  rnf GetVocabularyFilter' {..} =
+    Prelude.rnf vocabularyFilterName
+
+instance Data.ToHeaders GetVocabularyFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.GetVocabularyFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetVocabularyFilter where
+  toJSON GetVocabularyFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "VocabularyFilterName"
+                  Data..= vocabularyFilterName
+              )
+          ]
+      )
+
+instance Data.ToPath GetVocabularyFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetVocabularyFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetVocabularyFilterResponse' smart constructor.
+data GetVocabularyFilterResponse = GetVocabularyFilterResponse'
+  { -- | The Amazon S3 location where the custom vocabulary filter is stored; use
+    -- this URI to view or download the custom vocabulary filter.
+    downloadUri :: Prelude.Maybe Prelude.Text,
+    -- | The language code you selected for your custom vocabulary filter.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary filter was last
+    -- modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the custom vocabulary filter you requested information
+    -- about.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetVocabularyFilterResponse' 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:
+--
+-- 'downloadUri', 'getVocabularyFilterResponse_downloadUri' - The Amazon S3 location where the custom vocabulary filter is stored; use
+-- this URI to view or download the custom vocabulary filter.
+--
+-- 'languageCode', 'getVocabularyFilterResponse_languageCode' - The language code you selected for your custom vocabulary filter.
+--
+-- 'lastModifiedTime', 'getVocabularyFilterResponse_lastModifiedTime' - The date and time the specified custom vocabulary filter was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyFilterName', 'getVocabularyFilterResponse_vocabularyFilterName' - The name of the custom vocabulary filter you requested information
+-- about.
+--
+-- 'httpStatus', 'getVocabularyFilterResponse_httpStatus' - The response's http status code.
+newGetVocabularyFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetVocabularyFilterResponse
+newGetVocabularyFilterResponse pHttpStatus_ =
+  GetVocabularyFilterResponse'
+    { downloadUri =
+        Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon S3 location where the custom vocabulary filter is stored; use
+-- this URI to view or download the custom vocabulary filter.
+getVocabularyFilterResponse_downloadUri :: Lens.Lens' GetVocabularyFilterResponse (Prelude.Maybe Prelude.Text)
+getVocabularyFilterResponse_downloadUri = Lens.lens (\GetVocabularyFilterResponse' {downloadUri} -> downloadUri) (\s@GetVocabularyFilterResponse' {} a -> s {downloadUri = a} :: GetVocabularyFilterResponse)
+
+-- | The language code you selected for your custom vocabulary filter.
+getVocabularyFilterResponse_languageCode :: Lens.Lens' GetVocabularyFilterResponse (Prelude.Maybe LanguageCode)
+getVocabularyFilterResponse_languageCode = Lens.lens (\GetVocabularyFilterResponse' {languageCode} -> languageCode) (\s@GetVocabularyFilterResponse' {} a -> s {languageCode = a} :: GetVocabularyFilterResponse)
+
+-- | The date and time the specified custom vocabulary filter was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+getVocabularyFilterResponse_lastModifiedTime :: Lens.Lens' GetVocabularyFilterResponse (Prelude.Maybe Prelude.UTCTime)
+getVocabularyFilterResponse_lastModifiedTime = Lens.lens (\GetVocabularyFilterResponse' {lastModifiedTime} -> lastModifiedTime) (\s@GetVocabularyFilterResponse' {} a -> s {lastModifiedTime = a} :: GetVocabularyFilterResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the custom vocabulary filter you requested information
+-- about.
+getVocabularyFilterResponse_vocabularyFilterName :: Lens.Lens' GetVocabularyFilterResponse (Prelude.Maybe Prelude.Text)
+getVocabularyFilterResponse_vocabularyFilterName = Lens.lens (\GetVocabularyFilterResponse' {vocabularyFilterName} -> vocabularyFilterName) (\s@GetVocabularyFilterResponse' {} a -> s {vocabularyFilterName = a} :: GetVocabularyFilterResponse)
+
+-- | The response's http status code.
+getVocabularyFilterResponse_httpStatus :: Lens.Lens' GetVocabularyFilterResponse Prelude.Int
+getVocabularyFilterResponse_httpStatus = Lens.lens (\GetVocabularyFilterResponse' {httpStatus} -> httpStatus) (\s@GetVocabularyFilterResponse' {} a -> s {httpStatus = a} :: GetVocabularyFilterResponse)
+
+instance Prelude.NFData GetVocabularyFilterResponse where
+  rnf GetVocabularyFilterResponse' {..} =
+    Prelude.rnf downloadUri
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/Lens.hs b/gen/Amazonka/Transcribe/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Lens.hs
@@ -0,0 +1,660 @@
+{-# 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.Transcribe.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.Transcribe.Lens
+  ( -- * Operations
+
+    -- ** CreateCallAnalyticsCategory
+    createCallAnalyticsCategory_inputType,
+    createCallAnalyticsCategory_categoryName,
+    createCallAnalyticsCategory_rules,
+    createCallAnalyticsCategoryResponse_categoryProperties,
+    createCallAnalyticsCategoryResponse_httpStatus,
+
+    -- ** CreateLanguageModel
+    createLanguageModel_tags,
+    createLanguageModel_languageCode,
+    createLanguageModel_baseModelName,
+    createLanguageModel_modelName,
+    createLanguageModel_inputDataConfig,
+    createLanguageModelResponse_baseModelName,
+    createLanguageModelResponse_inputDataConfig,
+    createLanguageModelResponse_languageCode,
+    createLanguageModelResponse_modelName,
+    createLanguageModelResponse_modelStatus,
+    createLanguageModelResponse_httpStatus,
+
+    -- ** CreateMedicalVocabulary
+    createMedicalVocabulary_tags,
+    createMedicalVocabulary_vocabularyName,
+    createMedicalVocabulary_languageCode,
+    createMedicalVocabulary_vocabularyFileUri,
+    createMedicalVocabularyResponse_failureReason,
+    createMedicalVocabularyResponse_languageCode,
+    createMedicalVocabularyResponse_lastModifiedTime,
+    createMedicalVocabularyResponse_vocabularyName,
+    createMedicalVocabularyResponse_vocabularyState,
+    createMedicalVocabularyResponse_httpStatus,
+
+    -- ** CreateVocabulary
+    createVocabulary_phrases,
+    createVocabulary_tags,
+    createVocabulary_vocabularyFileUri,
+    createVocabulary_vocabularyName,
+    createVocabulary_languageCode,
+    createVocabularyResponse_failureReason,
+    createVocabularyResponse_languageCode,
+    createVocabularyResponse_lastModifiedTime,
+    createVocabularyResponse_vocabularyName,
+    createVocabularyResponse_vocabularyState,
+    createVocabularyResponse_httpStatus,
+
+    -- ** CreateVocabularyFilter
+    createVocabularyFilter_tags,
+    createVocabularyFilter_vocabularyFilterFileUri,
+    createVocabularyFilter_words,
+    createVocabularyFilter_vocabularyFilterName,
+    createVocabularyFilter_languageCode,
+    createVocabularyFilterResponse_languageCode,
+    createVocabularyFilterResponse_lastModifiedTime,
+    createVocabularyFilterResponse_vocabularyFilterName,
+    createVocabularyFilterResponse_httpStatus,
+
+    -- ** DeleteCallAnalyticsCategory
+    deleteCallAnalyticsCategory_categoryName,
+    deleteCallAnalyticsCategoryResponse_httpStatus,
+
+    -- ** DeleteCallAnalyticsJob
+    deleteCallAnalyticsJob_callAnalyticsJobName,
+    deleteCallAnalyticsJobResponse_httpStatus,
+
+    -- ** DeleteLanguageModel
+    deleteLanguageModel_modelName,
+
+    -- ** DeleteMedicalTranscriptionJob
+    deleteMedicalTranscriptionJob_medicalTranscriptionJobName,
+
+    -- ** DeleteMedicalVocabulary
+    deleteMedicalVocabulary_vocabularyName,
+
+    -- ** DeleteTranscriptionJob
+    deleteTranscriptionJob_transcriptionJobName,
+
+    -- ** DeleteVocabulary
+    deleteVocabulary_vocabularyName,
+
+    -- ** DeleteVocabularyFilter
+    deleteVocabularyFilter_vocabularyFilterName,
+
+    -- ** DescribeLanguageModel
+    describeLanguageModel_modelName,
+    describeLanguageModelResponse_languageModel,
+    describeLanguageModelResponse_httpStatus,
+
+    -- ** GetCallAnalyticsCategory
+    getCallAnalyticsCategory_categoryName,
+    getCallAnalyticsCategoryResponse_categoryProperties,
+    getCallAnalyticsCategoryResponse_httpStatus,
+
+    -- ** GetCallAnalyticsJob
+    getCallAnalyticsJob_callAnalyticsJobName,
+    getCallAnalyticsJobResponse_callAnalyticsJob,
+    getCallAnalyticsJobResponse_httpStatus,
+
+    -- ** GetMedicalTranscriptionJob
+    getMedicalTranscriptionJob_medicalTranscriptionJobName,
+    getMedicalTranscriptionJobResponse_medicalTranscriptionJob,
+    getMedicalTranscriptionJobResponse_httpStatus,
+
+    -- ** GetMedicalVocabulary
+    getMedicalVocabulary_vocabularyName,
+    getMedicalVocabularyResponse_downloadUri,
+    getMedicalVocabularyResponse_failureReason,
+    getMedicalVocabularyResponse_languageCode,
+    getMedicalVocabularyResponse_lastModifiedTime,
+    getMedicalVocabularyResponse_vocabularyName,
+    getMedicalVocabularyResponse_vocabularyState,
+    getMedicalVocabularyResponse_httpStatus,
+
+    -- ** GetTranscriptionJob
+    getTranscriptionJob_transcriptionJobName,
+    getTranscriptionJobResponse_transcriptionJob,
+    getTranscriptionJobResponse_httpStatus,
+
+    -- ** GetVocabulary
+    getVocabulary_vocabularyName,
+    getVocabularyResponse_downloadUri,
+    getVocabularyResponse_failureReason,
+    getVocabularyResponse_languageCode,
+    getVocabularyResponse_lastModifiedTime,
+    getVocabularyResponse_vocabularyName,
+    getVocabularyResponse_vocabularyState,
+    getVocabularyResponse_httpStatus,
+
+    -- ** GetVocabularyFilter
+    getVocabularyFilter_vocabularyFilterName,
+    getVocabularyFilterResponse_downloadUri,
+    getVocabularyFilterResponse_languageCode,
+    getVocabularyFilterResponse_lastModifiedTime,
+    getVocabularyFilterResponse_vocabularyFilterName,
+    getVocabularyFilterResponse_httpStatus,
+
+    -- ** ListCallAnalyticsCategories
+    listCallAnalyticsCategories_maxResults,
+    listCallAnalyticsCategories_nextToken,
+    listCallAnalyticsCategoriesResponse_categories,
+    listCallAnalyticsCategoriesResponse_nextToken,
+    listCallAnalyticsCategoriesResponse_httpStatus,
+
+    -- ** ListCallAnalyticsJobs
+    listCallAnalyticsJobs_jobNameContains,
+    listCallAnalyticsJobs_maxResults,
+    listCallAnalyticsJobs_nextToken,
+    listCallAnalyticsJobs_status,
+    listCallAnalyticsJobsResponse_callAnalyticsJobSummaries,
+    listCallAnalyticsJobsResponse_nextToken,
+    listCallAnalyticsJobsResponse_status,
+    listCallAnalyticsJobsResponse_httpStatus,
+
+    -- ** ListLanguageModels
+    listLanguageModels_maxResults,
+    listLanguageModels_nameContains,
+    listLanguageModels_nextToken,
+    listLanguageModels_statusEquals,
+    listLanguageModelsResponse_models,
+    listLanguageModelsResponse_nextToken,
+    listLanguageModelsResponse_httpStatus,
+
+    -- ** ListMedicalTranscriptionJobs
+    listMedicalTranscriptionJobs_jobNameContains,
+    listMedicalTranscriptionJobs_maxResults,
+    listMedicalTranscriptionJobs_nextToken,
+    listMedicalTranscriptionJobs_status,
+    listMedicalTranscriptionJobsResponse_medicalTranscriptionJobSummaries,
+    listMedicalTranscriptionJobsResponse_nextToken,
+    listMedicalTranscriptionJobsResponse_status,
+    listMedicalTranscriptionJobsResponse_httpStatus,
+
+    -- ** ListMedicalVocabularies
+    listMedicalVocabularies_maxResults,
+    listMedicalVocabularies_nameContains,
+    listMedicalVocabularies_nextToken,
+    listMedicalVocabularies_stateEquals,
+    listMedicalVocabulariesResponse_nextToken,
+    listMedicalVocabulariesResponse_status,
+    listMedicalVocabulariesResponse_vocabularies,
+    listMedicalVocabulariesResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** ListTranscriptionJobs
+    listTranscriptionJobs_jobNameContains,
+    listTranscriptionJobs_maxResults,
+    listTranscriptionJobs_nextToken,
+    listTranscriptionJobs_status,
+    listTranscriptionJobsResponse_nextToken,
+    listTranscriptionJobsResponse_status,
+    listTranscriptionJobsResponse_transcriptionJobSummaries,
+    listTranscriptionJobsResponse_httpStatus,
+
+    -- ** ListVocabularies
+    listVocabularies_maxResults,
+    listVocabularies_nameContains,
+    listVocabularies_nextToken,
+    listVocabularies_stateEquals,
+    listVocabulariesResponse_nextToken,
+    listVocabulariesResponse_status,
+    listVocabulariesResponse_vocabularies,
+    listVocabulariesResponse_httpStatus,
+
+    -- ** ListVocabularyFilters
+    listVocabularyFilters_maxResults,
+    listVocabularyFilters_nameContains,
+    listVocabularyFilters_nextToken,
+    listVocabularyFiltersResponse_nextToken,
+    listVocabularyFiltersResponse_vocabularyFilters,
+    listVocabularyFiltersResponse_httpStatus,
+
+    -- ** StartCallAnalyticsJob
+    startCallAnalyticsJob_channelDefinitions,
+    startCallAnalyticsJob_dataAccessRoleArn,
+    startCallAnalyticsJob_outputEncryptionKMSKeyId,
+    startCallAnalyticsJob_outputLocation,
+    startCallAnalyticsJob_settings,
+    startCallAnalyticsJob_callAnalyticsJobName,
+    startCallAnalyticsJob_media,
+    startCallAnalyticsJobResponse_callAnalyticsJob,
+    startCallAnalyticsJobResponse_httpStatus,
+
+    -- ** StartMedicalTranscriptionJob
+    startMedicalTranscriptionJob_contentIdentificationType,
+    startMedicalTranscriptionJob_kmsEncryptionContext,
+    startMedicalTranscriptionJob_mediaFormat,
+    startMedicalTranscriptionJob_mediaSampleRateHertz,
+    startMedicalTranscriptionJob_outputEncryptionKMSKeyId,
+    startMedicalTranscriptionJob_outputKey,
+    startMedicalTranscriptionJob_settings,
+    startMedicalTranscriptionJob_tags,
+    startMedicalTranscriptionJob_medicalTranscriptionJobName,
+    startMedicalTranscriptionJob_languageCode,
+    startMedicalTranscriptionJob_media,
+    startMedicalTranscriptionJob_outputBucketName,
+    startMedicalTranscriptionJob_specialty,
+    startMedicalTranscriptionJob_type,
+    startMedicalTranscriptionJobResponse_medicalTranscriptionJob,
+    startMedicalTranscriptionJobResponse_httpStatus,
+
+    -- ** StartTranscriptionJob
+    startTranscriptionJob_contentRedaction,
+    startTranscriptionJob_identifyLanguage,
+    startTranscriptionJob_identifyMultipleLanguages,
+    startTranscriptionJob_jobExecutionSettings,
+    startTranscriptionJob_kmsEncryptionContext,
+    startTranscriptionJob_languageCode,
+    startTranscriptionJob_languageIdSettings,
+    startTranscriptionJob_languageOptions,
+    startTranscriptionJob_mediaFormat,
+    startTranscriptionJob_mediaSampleRateHertz,
+    startTranscriptionJob_modelSettings,
+    startTranscriptionJob_outputBucketName,
+    startTranscriptionJob_outputEncryptionKMSKeyId,
+    startTranscriptionJob_outputKey,
+    startTranscriptionJob_settings,
+    startTranscriptionJob_subtitles,
+    startTranscriptionJob_tags,
+    startTranscriptionJob_transcriptionJobName,
+    startTranscriptionJob_media,
+    startTranscriptionJobResponse_transcriptionJob,
+    startTranscriptionJobResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateCallAnalyticsCategory
+    updateCallAnalyticsCategory_inputType,
+    updateCallAnalyticsCategory_categoryName,
+    updateCallAnalyticsCategory_rules,
+    updateCallAnalyticsCategoryResponse_categoryProperties,
+    updateCallAnalyticsCategoryResponse_httpStatus,
+
+    -- ** UpdateMedicalVocabulary
+    updateMedicalVocabulary_vocabularyName,
+    updateMedicalVocabulary_languageCode,
+    updateMedicalVocabulary_vocabularyFileUri,
+    updateMedicalVocabularyResponse_languageCode,
+    updateMedicalVocabularyResponse_lastModifiedTime,
+    updateMedicalVocabularyResponse_vocabularyName,
+    updateMedicalVocabularyResponse_vocabularyState,
+    updateMedicalVocabularyResponse_httpStatus,
+
+    -- ** UpdateVocabulary
+    updateVocabulary_phrases,
+    updateVocabulary_vocabularyFileUri,
+    updateVocabulary_vocabularyName,
+    updateVocabulary_languageCode,
+    updateVocabularyResponse_languageCode,
+    updateVocabularyResponse_lastModifiedTime,
+    updateVocabularyResponse_vocabularyName,
+    updateVocabularyResponse_vocabularyState,
+    updateVocabularyResponse_httpStatus,
+
+    -- ** UpdateVocabularyFilter
+    updateVocabularyFilter_vocabularyFilterFileUri,
+    updateVocabularyFilter_words,
+    updateVocabularyFilter_vocabularyFilterName,
+    updateVocabularyFilterResponse_languageCode,
+    updateVocabularyFilterResponse_lastModifiedTime,
+    updateVocabularyFilterResponse_vocabularyFilterName,
+    updateVocabularyFilterResponse_httpStatus,
+
+    -- * Types
+
+    -- ** AbsoluteTimeRange
+    absoluteTimeRange_endTime,
+    absoluteTimeRange_first,
+    absoluteTimeRange_last,
+    absoluteTimeRange_startTime,
+
+    -- ** CallAnalyticsJob
+    callAnalyticsJob_callAnalyticsJobName,
+    callAnalyticsJob_callAnalyticsJobStatus,
+    callAnalyticsJob_channelDefinitions,
+    callAnalyticsJob_completionTime,
+    callAnalyticsJob_creationTime,
+    callAnalyticsJob_dataAccessRoleArn,
+    callAnalyticsJob_failureReason,
+    callAnalyticsJob_identifiedLanguageScore,
+    callAnalyticsJob_languageCode,
+    callAnalyticsJob_media,
+    callAnalyticsJob_mediaFormat,
+    callAnalyticsJob_mediaSampleRateHertz,
+    callAnalyticsJob_settings,
+    callAnalyticsJob_startTime,
+    callAnalyticsJob_transcript,
+
+    -- ** CallAnalyticsJobSettings
+    callAnalyticsJobSettings_contentRedaction,
+    callAnalyticsJobSettings_languageIdSettings,
+    callAnalyticsJobSettings_languageModelName,
+    callAnalyticsJobSettings_languageOptions,
+    callAnalyticsJobSettings_vocabularyFilterMethod,
+    callAnalyticsJobSettings_vocabularyFilterName,
+    callAnalyticsJobSettings_vocabularyName,
+
+    -- ** CallAnalyticsJobSummary
+    callAnalyticsJobSummary_callAnalyticsJobName,
+    callAnalyticsJobSummary_callAnalyticsJobStatus,
+    callAnalyticsJobSummary_completionTime,
+    callAnalyticsJobSummary_creationTime,
+    callAnalyticsJobSummary_failureReason,
+    callAnalyticsJobSummary_languageCode,
+    callAnalyticsJobSummary_startTime,
+
+    -- ** CategoryProperties
+    categoryProperties_categoryName,
+    categoryProperties_createTime,
+    categoryProperties_inputType,
+    categoryProperties_lastUpdateTime,
+    categoryProperties_rules,
+
+    -- ** ChannelDefinition
+    channelDefinition_channelId,
+    channelDefinition_participantRole,
+
+    -- ** ContentRedaction
+    contentRedaction_piiEntityTypes,
+    contentRedaction_redactionType,
+    contentRedaction_redactionOutput,
+
+    -- ** InputDataConfig
+    inputDataConfig_tuningDataS3Uri,
+    inputDataConfig_s3Uri,
+    inputDataConfig_dataAccessRoleArn,
+
+    -- ** InterruptionFilter
+    interruptionFilter_absoluteTimeRange,
+    interruptionFilter_negate,
+    interruptionFilter_participantRole,
+    interruptionFilter_relativeTimeRange,
+    interruptionFilter_threshold,
+
+    -- ** JobExecutionSettings
+    jobExecutionSettings_allowDeferredExecution,
+    jobExecutionSettings_dataAccessRoleArn,
+
+    -- ** LanguageCodeItem
+    languageCodeItem_durationInSeconds,
+    languageCodeItem_languageCode,
+
+    -- ** LanguageIdSettings
+    languageIdSettings_languageModelName,
+    languageIdSettings_vocabularyFilterName,
+    languageIdSettings_vocabularyName,
+
+    -- ** LanguageModel
+    languageModel_baseModelName,
+    languageModel_createTime,
+    languageModel_failureReason,
+    languageModel_inputDataConfig,
+    languageModel_languageCode,
+    languageModel_lastModifiedTime,
+    languageModel_modelName,
+    languageModel_modelStatus,
+    languageModel_upgradeAvailability,
+
+    -- ** Media
+    media_mediaFileUri,
+    media_redactedMediaFileUri,
+
+    -- ** MedicalTranscript
+    medicalTranscript_transcriptFileUri,
+
+    -- ** MedicalTranscriptionJob
+    medicalTranscriptionJob_completionTime,
+    medicalTranscriptionJob_contentIdentificationType,
+    medicalTranscriptionJob_creationTime,
+    medicalTranscriptionJob_failureReason,
+    medicalTranscriptionJob_languageCode,
+    medicalTranscriptionJob_media,
+    medicalTranscriptionJob_mediaFormat,
+    medicalTranscriptionJob_mediaSampleRateHertz,
+    medicalTranscriptionJob_medicalTranscriptionJobName,
+    medicalTranscriptionJob_settings,
+    medicalTranscriptionJob_specialty,
+    medicalTranscriptionJob_startTime,
+    medicalTranscriptionJob_tags,
+    medicalTranscriptionJob_transcript,
+    medicalTranscriptionJob_transcriptionJobStatus,
+    medicalTranscriptionJob_type,
+
+    -- ** MedicalTranscriptionJobSummary
+    medicalTranscriptionJobSummary_completionTime,
+    medicalTranscriptionJobSummary_contentIdentificationType,
+    medicalTranscriptionJobSummary_creationTime,
+    medicalTranscriptionJobSummary_failureReason,
+    medicalTranscriptionJobSummary_languageCode,
+    medicalTranscriptionJobSummary_medicalTranscriptionJobName,
+    medicalTranscriptionJobSummary_outputLocationType,
+    medicalTranscriptionJobSummary_specialty,
+    medicalTranscriptionJobSummary_startTime,
+    medicalTranscriptionJobSummary_transcriptionJobStatus,
+    medicalTranscriptionJobSummary_type,
+
+    -- ** MedicalTranscriptionSetting
+    medicalTranscriptionSetting_channelIdentification,
+    medicalTranscriptionSetting_maxAlternatives,
+    medicalTranscriptionSetting_maxSpeakerLabels,
+    medicalTranscriptionSetting_showAlternatives,
+    medicalTranscriptionSetting_showSpeakerLabels,
+    medicalTranscriptionSetting_vocabularyName,
+
+    -- ** ModelSettings
+    modelSettings_languageModelName,
+
+    -- ** NonTalkTimeFilter
+    nonTalkTimeFilter_absoluteTimeRange,
+    nonTalkTimeFilter_negate,
+    nonTalkTimeFilter_relativeTimeRange,
+    nonTalkTimeFilter_threshold,
+
+    -- ** RelativeTimeRange
+    relativeTimeRange_endPercentage,
+    relativeTimeRange_first,
+    relativeTimeRange_last,
+    relativeTimeRange_startPercentage,
+
+    -- ** Rule
+    rule_interruptionFilter,
+    rule_nonTalkTimeFilter,
+    rule_sentimentFilter,
+    rule_transcriptFilter,
+
+    -- ** SentimentFilter
+    sentimentFilter_absoluteTimeRange,
+    sentimentFilter_negate,
+    sentimentFilter_participantRole,
+    sentimentFilter_relativeTimeRange,
+    sentimentFilter_sentiments,
+
+    -- ** Settings
+    settings_channelIdentification,
+    settings_maxAlternatives,
+    settings_maxSpeakerLabels,
+    settings_showAlternatives,
+    settings_showSpeakerLabels,
+    settings_vocabularyFilterMethod,
+    settings_vocabularyFilterName,
+    settings_vocabularyName,
+
+    -- ** Subtitles
+    subtitles_formats,
+    subtitles_outputStartIndex,
+
+    -- ** SubtitlesOutput
+    subtitlesOutput_formats,
+    subtitlesOutput_outputStartIndex,
+    subtitlesOutput_subtitleFileUris,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** Transcript
+    transcript_redactedTranscriptFileUri,
+    transcript_transcriptFileUri,
+
+    -- ** TranscriptFilter
+    transcriptFilter_absoluteTimeRange,
+    transcriptFilter_negate,
+    transcriptFilter_participantRole,
+    transcriptFilter_relativeTimeRange,
+    transcriptFilter_transcriptFilterType,
+    transcriptFilter_targets,
+
+    -- ** TranscriptionJob
+    transcriptionJob_completionTime,
+    transcriptionJob_contentRedaction,
+    transcriptionJob_creationTime,
+    transcriptionJob_failureReason,
+    transcriptionJob_identifiedLanguageScore,
+    transcriptionJob_identifyLanguage,
+    transcriptionJob_identifyMultipleLanguages,
+    transcriptionJob_jobExecutionSettings,
+    transcriptionJob_languageCode,
+    transcriptionJob_languageCodes,
+    transcriptionJob_languageIdSettings,
+    transcriptionJob_languageOptions,
+    transcriptionJob_media,
+    transcriptionJob_mediaFormat,
+    transcriptionJob_mediaSampleRateHertz,
+    transcriptionJob_modelSettings,
+    transcriptionJob_settings,
+    transcriptionJob_startTime,
+    transcriptionJob_subtitles,
+    transcriptionJob_tags,
+    transcriptionJob_transcript,
+    transcriptionJob_transcriptionJobName,
+    transcriptionJob_transcriptionJobStatus,
+
+    -- ** TranscriptionJobSummary
+    transcriptionJobSummary_completionTime,
+    transcriptionJobSummary_contentRedaction,
+    transcriptionJobSummary_creationTime,
+    transcriptionJobSummary_failureReason,
+    transcriptionJobSummary_identifiedLanguageScore,
+    transcriptionJobSummary_identifyLanguage,
+    transcriptionJobSummary_identifyMultipleLanguages,
+    transcriptionJobSummary_languageCode,
+    transcriptionJobSummary_languageCodes,
+    transcriptionJobSummary_modelSettings,
+    transcriptionJobSummary_outputLocationType,
+    transcriptionJobSummary_startTime,
+    transcriptionJobSummary_transcriptionJobName,
+    transcriptionJobSummary_transcriptionJobStatus,
+
+    -- ** VocabularyFilterInfo
+    vocabularyFilterInfo_languageCode,
+    vocabularyFilterInfo_lastModifiedTime,
+    vocabularyFilterInfo_vocabularyFilterName,
+
+    -- ** VocabularyInfo
+    vocabularyInfo_languageCode,
+    vocabularyInfo_lastModifiedTime,
+    vocabularyInfo_vocabularyName,
+    vocabularyInfo_vocabularyState,
+  )
+where
+
+import Amazonka.Transcribe.CreateCallAnalyticsCategory
+import Amazonka.Transcribe.CreateLanguageModel
+import Amazonka.Transcribe.CreateMedicalVocabulary
+import Amazonka.Transcribe.CreateVocabulary
+import Amazonka.Transcribe.CreateVocabularyFilter
+import Amazonka.Transcribe.DeleteCallAnalyticsCategory
+import Amazonka.Transcribe.DeleteCallAnalyticsJob
+import Amazonka.Transcribe.DeleteLanguageModel
+import Amazonka.Transcribe.DeleteMedicalTranscriptionJob
+import Amazonka.Transcribe.DeleteMedicalVocabulary
+import Amazonka.Transcribe.DeleteTranscriptionJob
+import Amazonka.Transcribe.DeleteVocabulary
+import Amazonka.Transcribe.DeleteVocabularyFilter
+import Amazonka.Transcribe.DescribeLanguageModel
+import Amazonka.Transcribe.GetCallAnalyticsCategory
+import Amazonka.Transcribe.GetCallAnalyticsJob
+import Amazonka.Transcribe.GetMedicalTranscriptionJob
+import Amazonka.Transcribe.GetMedicalVocabulary
+import Amazonka.Transcribe.GetTranscriptionJob
+import Amazonka.Transcribe.GetVocabulary
+import Amazonka.Transcribe.GetVocabularyFilter
+import Amazonka.Transcribe.ListCallAnalyticsCategories
+import Amazonka.Transcribe.ListCallAnalyticsJobs
+import Amazonka.Transcribe.ListLanguageModels
+import Amazonka.Transcribe.ListMedicalTranscriptionJobs
+import Amazonka.Transcribe.ListMedicalVocabularies
+import Amazonka.Transcribe.ListTagsForResource
+import Amazonka.Transcribe.ListTranscriptionJobs
+import Amazonka.Transcribe.ListVocabularies
+import Amazonka.Transcribe.ListVocabularyFilters
+import Amazonka.Transcribe.StartCallAnalyticsJob
+import Amazonka.Transcribe.StartMedicalTranscriptionJob
+import Amazonka.Transcribe.StartTranscriptionJob
+import Amazonka.Transcribe.TagResource
+import Amazonka.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.CallAnalyticsJob
+import Amazonka.Transcribe.Types.CallAnalyticsJobSettings
+import Amazonka.Transcribe.Types.CallAnalyticsJobSummary
+import Amazonka.Transcribe.Types.CategoryProperties
+import Amazonka.Transcribe.Types.ChannelDefinition
+import Amazonka.Transcribe.Types.ContentRedaction
+import Amazonka.Transcribe.Types.InputDataConfig
+import Amazonka.Transcribe.Types.InterruptionFilter
+import Amazonka.Transcribe.Types.JobExecutionSettings
+import Amazonka.Transcribe.Types.LanguageCodeItem
+import Amazonka.Transcribe.Types.LanguageIdSettings
+import Amazonka.Transcribe.Types.LanguageModel
+import Amazonka.Transcribe.Types.Media
+import Amazonka.Transcribe.Types.MedicalTranscript
+import Amazonka.Transcribe.Types.MedicalTranscriptionJob
+import Amazonka.Transcribe.Types.MedicalTranscriptionJobSummary
+import Amazonka.Transcribe.Types.MedicalTranscriptionSetting
+import Amazonka.Transcribe.Types.ModelSettings
+import Amazonka.Transcribe.Types.NonTalkTimeFilter
+import Amazonka.Transcribe.Types.RelativeTimeRange
+import Amazonka.Transcribe.Types.Rule
+import Amazonka.Transcribe.Types.SentimentFilter
+import Amazonka.Transcribe.Types.Settings
+import Amazonka.Transcribe.Types.Subtitles
+import Amazonka.Transcribe.Types.SubtitlesOutput
+import Amazonka.Transcribe.Types.Tag
+import Amazonka.Transcribe.Types.Transcript
+import Amazonka.Transcribe.Types.TranscriptFilter
+import Amazonka.Transcribe.Types.TranscriptionJob
+import Amazonka.Transcribe.Types.TranscriptionJobSummary
+import Amazonka.Transcribe.Types.VocabularyFilterInfo
+import Amazonka.Transcribe.Types.VocabularyInfo
+import Amazonka.Transcribe.UntagResource
+import Amazonka.Transcribe.UpdateCallAnalyticsCategory
+import Amazonka.Transcribe.UpdateMedicalVocabulary
+import Amazonka.Transcribe.UpdateVocabulary
+import Amazonka.Transcribe.UpdateVocabularyFilter
diff --git a/gen/Amazonka/Transcribe/ListCallAnalyticsCategories.hs b/gen/Amazonka/Transcribe/ListCallAnalyticsCategories.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListCallAnalyticsCategories.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.Transcribe.ListCallAnalyticsCategories
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of Call Analytics categories, including all rules that
+-- make up each category.
+--
+-- To get detailed information about a specific Call Analytics category,
+-- use the operation.
+module Amazonka.Transcribe.ListCallAnalyticsCategories
+  ( -- * Creating a Request
+    ListCallAnalyticsCategories (..),
+    newListCallAnalyticsCategories,
+
+    -- * Request Lenses
+    listCallAnalyticsCategories_maxResults,
+    listCallAnalyticsCategories_nextToken,
+
+    -- * Destructuring the Response
+    ListCallAnalyticsCategoriesResponse (..),
+    newListCallAnalyticsCategoriesResponse,
+
+    -- * Response Lenses
+    listCallAnalyticsCategoriesResponse_categories,
+    listCallAnalyticsCategoriesResponse_nextToken,
+    listCallAnalyticsCategoriesResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListCallAnalyticsCategories' smart constructor.
+data ListCallAnalyticsCategories = ListCallAnalyticsCategories'
+  { -- | The maximum number of Call Analytics categories to return in each page
+    -- of results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If your @ListCallAnalyticsCategories@ request returns more results than
+    -- can be displayed, @NextToken@ is displayed in the response with an
+    -- associated string. To get the next page of results, copy this string and
+    -- repeat your request, including @NextToken@ with the value of the copied
+    -- string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCallAnalyticsCategories' 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', 'listCallAnalyticsCategories_maxResults' - The maximum number of Call Analytics categories to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nextToken', 'listCallAnalyticsCategories_nextToken' - If your @ListCallAnalyticsCategories@ request returns more results than
+-- can be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+newListCallAnalyticsCategories ::
+  ListCallAnalyticsCategories
+newListCallAnalyticsCategories =
+  ListCallAnalyticsCategories'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of Call Analytics categories to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listCallAnalyticsCategories_maxResults :: Lens.Lens' ListCallAnalyticsCategories (Prelude.Maybe Prelude.Natural)
+listCallAnalyticsCategories_maxResults = Lens.lens (\ListCallAnalyticsCategories' {maxResults} -> maxResults) (\s@ListCallAnalyticsCategories' {} a -> s {maxResults = a} :: ListCallAnalyticsCategories)
+
+-- | If your @ListCallAnalyticsCategories@ request returns more results than
+-- can be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+listCallAnalyticsCategories_nextToken :: Lens.Lens' ListCallAnalyticsCategories (Prelude.Maybe Prelude.Text)
+listCallAnalyticsCategories_nextToken = Lens.lens (\ListCallAnalyticsCategories' {nextToken} -> nextToken) (\s@ListCallAnalyticsCategories' {} a -> s {nextToken = a} :: ListCallAnalyticsCategories)
+
+instance Core.AWSRequest ListCallAnalyticsCategories where
+  type
+    AWSResponse ListCallAnalyticsCategories =
+      ListCallAnalyticsCategoriesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListCallAnalyticsCategoriesResponse'
+            Prelude.<$> (x Data..?> "Categories" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListCallAnalyticsCategories where
+  hashWithSalt _salt ListCallAnalyticsCategories' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListCallAnalyticsCategories where
+  rnf ListCallAnalyticsCategories' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListCallAnalyticsCategories where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListCallAnalyticsCategories" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListCallAnalyticsCategories where
+  toJSON ListCallAnalyticsCategories' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListCallAnalyticsCategories where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListCallAnalyticsCategories where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListCallAnalyticsCategoriesResponse' smart constructor.
+data ListCallAnalyticsCategoriesResponse = ListCallAnalyticsCategoriesResponse'
+  { -- | Provides detailed information about your Call Analytics categories,
+    -- including all the rules associated with each category.
+    categories :: Prelude.Maybe [CategoryProperties],
+    -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCallAnalyticsCategoriesResponse' 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:
+--
+-- 'categories', 'listCallAnalyticsCategoriesResponse_categories' - Provides detailed information about your Call Analytics categories,
+-- including all the rules associated with each category.
+--
+-- 'nextToken', 'listCallAnalyticsCategoriesResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'httpStatus', 'listCallAnalyticsCategoriesResponse_httpStatus' - The response's http status code.
+newListCallAnalyticsCategoriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListCallAnalyticsCategoriesResponse
+newListCallAnalyticsCategoriesResponse pHttpStatus_ =
+  ListCallAnalyticsCategoriesResponse'
+    { categories =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about your Call Analytics categories,
+-- including all the rules associated with each category.
+listCallAnalyticsCategoriesResponse_categories :: Lens.Lens' ListCallAnalyticsCategoriesResponse (Prelude.Maybe [CategoryProperties])
+listCallAnalyticsCategoriesResponse_categories = Lens.lens (\ListCallAnalyticsCategoriesResponse' {categories} -> categories) (\s@ListCallAnalyticsCategoriesResponse' {} a -> s {categories = a} :: ListCallAnalyticsCategoriesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listCallAnalyticsCategoriesResponse_nextToken :: Lens.Lens' ListCallAnalyticsCategoriesResponse (Prelude.Maybe Prelude.Text)
+listCallAnalyticsCategoriesResponse_nextToken = Lens.lens (\ListCallAnalyticsCategoriesResponse' {nextToken} -> nextToken) (\s@ListCallAnalyticsCategoriesResponse' {} a -> s {nextToken = a} :: ListCallAnalyticsCategoriesResponse)
+
+-- | The response's http status code.
+listCallAnalyticsCategoriesResponse_httpStatus :: Lens.Lens' ListCallAnalyticsCategoriesResponse Prelude.Int
+listCallAnalyticsCategoriesResponse_httpStatus = Lens.lens (\ListCallAnalyticsCategoriesResponse' {httpStatus} -> httpStatus) (\s@ListCallAnalyticsCategoriesResponse' {} a -> s {httpStatus = a} :: ListCallAnalyticsCategoriesResponse)
+
+instance
+  Prelude.NFData
+    ListCallAnalyticsCategoriesResponse
+  where
+  rnf ListCallAnalyticsCategoriesResponse' {..} =
+    Prelude.rnf categories
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListCallAnalyticsJobs.hs b/gen/Amazonka/Transcribe/ListCallAnalyticsJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListCallAnalyticsJobs.hs
@@ -0,0 +1,289 @@
+{-# 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.Transcribe.ListCallAnalyticsJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of Call Analytics jobs that match the specified
+-- criteria. If no criteria are specified, all Call Analytics jobs are
+-- returned.
+--
+-- To get detailed information about a specific Call Analytics job, use the
+-- operation.
+module Amazonka.Transcribe.ListCallAnalyticsJobs
+  ( -- * Creating a Request
+    ListCallAnalyticsJobs (..),
+    newListCallAnalyticsJobs,
+
+    -- * Request Lenses
+    listCallAnalyticsJobs_jobNameContains,
+    listCallAnalyticsJobs_maxResults,
+    listCallAnalyticsJobs_nextToken,
+    listCallAnalyticsJobs_status,
+
+    -- * Destructuring the Response
+    ListCallAnalyticsJobsResponse (..),
+    newListCallAnalyticsJobsResponse,
+
+    -- * Response Lenses
+    listCallAnalyticsJobsResponse_callAnalyticsJobSummaries,
+    listCallAnalyticsJobsResponse_nextToken,
+    listCallAnalyticsJobsResponse_status,
+    listCallAnalyticsJobsResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListCallAnalyticsJobs' smart constructor.
+data ListCallAnalyticsJobs = ListCallAnalyticsJobs'
+  { -- | Returns only the Call Analytics jobs that contain the specified string.
+    -- The search is not case sensitive.
+    jobNameContains :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of Call Analytics jobs to return in each page of
+    -- results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If your @ListCallAnalyticsJobs@ request returns more results than can be
+    -- displayed, @NextToken@ is displayed in the response with an associated
+    -- string. To get the next page of results, copy this string and repeat
+    -- your request, including @NextToken@ with the value of the copied string.
+    -- Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only Call Analytics jobs with the specified status. Jobs are
+    -- ordered by creation date, with the newest job first. If you don\'t
+    -- include @Status@, all Call Analytics jobs are returned.
+    status :: Prelude.Maybe CallAnalyticsJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCallAnalyticsJobs' 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:
+--
+-- 'jobNameContains', 'listCallAnalyticsJobs_jobNameContains' - Returns only the Call Analytics jobs that contain the specified string.
+-- The search is not case sensitive.
+--
+-- 'maxResults', 'listCallAnalyticsJobs_maxResults' - The maximum number of Call Analytics jobs to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nextToken', 'listCallAnalyticsJobs_nextToken' - If your @ListCallAnalyticsJobs@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+--
+-- 'status', 'listCallAnalyticsJobs_status' - Returns only Call Analytics jobs with the specified status. Jobs are
+-- ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all Call Analytics jobs are returned.
+newListCallAnalyticsJobs ::
+  ListCallAnalyticsJobs
+newListCallAnalyticsJobs =
+  ListCallAnalyticsJobs'
+    { jobNameContains =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Returns only the Call Analytics jobs that contain the specified string.
+-- The search is not case sensitive.
+listCallAnalyticsJobs_jobNameContains :: Lens.Lens' ListCallAnalyticsJobs (Prelude.Maybe Prelude.Text)
+listCallAnalyticsJobs_jobNameContains = Lens.lens (\ListCallAnalyticsJobs' {jobNameContains} -> jobNameContains) (\s@ListCallAnalyticsJobs' {} a -> s {jobNameContains = a} :: ListCallAnalyticsJobs)
+
+-- | The maximum number of Call Analytics jobs to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listCallAnalyticsJobs_maxResults :: Lens.Lens' ListCallAnalyticsJobs (Prelude.Maybe Prelude.Natural)
+listCallAnalyticsJobs_maxResults = Lens.lens (\ListCallAnalyticsJobs' {maxResults} -> maxResults) (\s@ListCallAnalyticsJobs' {} a -> s {maxResults = a} :: ListCallAnalyticsJobs)
+
+-- | If your @ListCallAnalyticsJobs@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+listCallAnalyticsJobs_nextToken :: Lens.Lens' ListCallAnalyticsJobs (Prelude.Maybe Prelude.Text)
+listCallAnalyticsJobs_nextToken = Lens.lens (\ListCallAnalyticsJobs' {nextToken} -> nextToken) (\s@ListCallAnalyticsJobs' {} a -> s {nextToken = a} :: ListCallAnalyticsJobs)
+
+-- | Returns only Call Analytics jobs with the specified status. Jobs are
+-- ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all Call Analytics jobs are returned.
+listCallAnalyticsJobs_status :: Lens.Lens' ListCallAnalyticsJobs (Prelude.Maybe CallAnalyticsJobStatus)
+listCallAnalyticsJobs_status = Lens.lens (\ListCallAnalyticsJobs' {status} -> status) (\s@ListCallAnalyticsJobs' {} a -> s {status = a} :: ListCallAnalyticsJobs)
+
+instance Core.AWSRequest ListCallAnalyticsJobs where
+  type
+    AWSResponse ListCallAnalyticsJobs =
+      ListCallAnalyticsJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListCallAnalyticsJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "CallAnalyticsJobSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListCallAnalyticsJobs where
+  hashWithSalt _salt ListCallAnalyticsJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobNameContains
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ListCallAnalyticsJobs where
+  rnf ListCallAnalyticsJobs' {..} =
+    Prelude.rnf jobNameContains
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+
+instance Data.ToHeaders ListCallAnalyticsJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListCallAnalyticsJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListCallAnalyticsJobs where
+  toJSON ListCallAnalyticsJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobNameContains" Data..=)
+              Prelude.<$> jobNameContains,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Status" Data..=) Prelude.<$> status
+          ]
+      )
+
+instance Data.ToPath ListCallAnalyticsJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListCallAnalyticsJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListCallAnalyticsJobsResponse' smart constructor.
+data ListCallAnalyticsJobsResponse = ListCallAnalyticsJobsResponse'
+  { -- | Provides a summary of information about each result.
+    callAnalyticsJobSummaries :: Prelude.Maybe [CallAnalyticsJobSummary],
+    -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists all Call Analytics jobs that have the status specified in your
+    -- request. Jobs are ordered by creation date, with the newest job first.
+    status :: Prelude.Maybe CallAnalyticsJobStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCallAnalyticsJobsResponse' 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:
+--
+-- 'callAnalyticsJobSummaries', 'listCallAnalyticsJobsResponse_callAnalyticsJobSummaries' - Provides a summary of information about each result.
+--
+-- 'nextToken', 'listCallAnalyticsJobsResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'status', 'listCallAnalyticsJobsResponse_status' - Lists all Call Analytics jobs that have the status specified in your
+-- request. Jobs are ordered by creation date, with the newest job first.
+--
+-- 'httpStatus', 'listCallAnalyticsJobsResponse_httpStatus' - The response's http status code.
+newListCallAnalyticsJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListCallAnalyticsJobsResponse
+newListCallAnalyticsJobsResponse pHttpStatus_ =
+  ListCallAnalyticsJobsResponse'
+    { callAnalyticsJobSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides a summary of information about each result.
+listCallAnalyticsJobsResponse_callAnalyticsJobSummaries :: Lens.Lens' ListCallAnalyticsJobsResponse (Prelude.Maybe [CallAnalyticsJobSummary])
+listCallAnalyticsJobsResponse_callAnalyticsJobSummaries = Lens.lens (\ListCallAnalyticsJobsResponse' {callAnalyticsJobSummaries} -> callAnalyticsJobSummaries) (\s@ListCallAnalyticsJobsResponse' {} a -> s {callAnalyticsJobSummaries = a} :: ListCallAnalyticsJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listCallAnalyticsJobsResponse_nextToken :: Lens.Lens' ListCallAnalyticsJobsResponse (Prelude.Maybe Prelude.Text)
+listCallAnalyticsJobsResponse_nextToken = Lens.lens (\ListCallAnalyticsJobsResponse' {nextToken} -> nextToken) (\s@ListCallAnalyticsJobsResponse' {} a -> s {nextToken = a} :: ListCallAnalyticsJobsResponse)
+
+-- | Lists all Call Analytics jobs that have the status specified in your
+-- request. Jobs are ordered by creation date, with the newest job first.
+listCallAnalyticsJobsResponse_status :: Lens.Lens' ListCallAnalyticsJobsResponse (Prelude.Maybe CallAnalyticsJobStatus)
+listCallAnalyticsJobsResponse_status = Lens.lens (\ListCallAnalyticsJobsResponse' {status} -> status) (\s@ListCallAnalyticsJobsResponse' {} a -> s {status = a} :: ListCallAnalyticsJobsResponse)
+
+-- | The response's http status code.
+listCallAnalyticsJobsResponse_httpStatus :: Lens.Lens' ListCallAnalyticsJobsResponse Prelude.Int
+listCallAnalyticsJobsResponse_httpStatus = Lens.lens (\ListCallAnalyticsJobsResponse' {httpStatus} -> httpStatus) (\s@ListCallAnalyticsJobsResponse' {} a -> s {httpStatus = a} :: ListCallAnalyticsJobsResponse)
+
+instance Prelude.NFData ListCallAnalyticsJobsResponse where
+  rnf ListCallAnalyticsJobsResponse' {..} =
+    Prelude.rnf callAnalyticsJobSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListLanguageModels.hs b/gen/Amazonka/Transcribe/ListLanguageModels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListLanguageModels.hs
@@ -0,0 +1,272 @@
+{-# 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.Transcribe.ListLanguageModels
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of custom language models that match the specified
+-- criteria. If no criteria are specified, all custom language models are
+-- returned.
+--
+-- To get detailed information about a specific custom language model, use
+-- the operation.
+module Amazonka.Transcribe.ListLanguageModels
+  ( -- * Creating a Request
+    ListLanguageModels (..),
+    newListLanguageModels,
+
+    -- * Request Lenses
+    listLanguageModels_maxResults,
+    listLanguageModels_nameContains,
+    listLanguageModels_nextToken,
+    listLanguageModels_statusEquals,
+
+    -- * Destructuring the Response
+    ListLanguageModelsResponse (..),
+    newListLanguageModelsResponse,
+
+    -- * Response Lenses
+    listLanguageModelsResponse_models,
+    listLanguageModelsResponse_nextToken,
+    listLanguageModelsResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListLanguageModels' smart constructor.
+data ListLanguageModels = ListLanguageModels'
+  { -- | The maximum number of custom language models to return in each page of
+    -- results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Returns only the custom language models that contain the specified
+    -- string. The search is not case sensitive.
+    nameContains :: Prelude.Maybe Prelude.Text,
+    -- | If your @ListLanguageModels@ request returns more results than can be
+    -- displayed, @NextToken@ is displayed in the response with an associated
+    -- string. To get the next page of results, copy this string and repeat
+    -- your request, including @NextToken@ with the value of the copied string.
+    -- Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only custom language models with the specified status. Language
+    -- models are ordered by creation date, with the newest model first. If you
+    -- don\'t include @StatusEquals@, all custom language models are returned.
+    statusEquals :: Prelude.Maybe ModelStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListLanguageModels' 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', 'listLanguageModels_maxResults' - The maximum number of custom language models to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nameContains', 'listLanguageModels_nameContains' - Returns only the custom language models that contain the specified
+-- string. The search is not case sensitive.
+--
+-- 'nextToken', 'listLanguageModels_nextToken' - If your @ListLanguageModels@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+--
+-- 'statusEquals', 'listLanguageModels_statusEquals' - Returns only custom language models with the specified status. Language
+-- models are ordered by creation date, with the newest model first. If you
+-- don\'t include @StatusEquals@, all custom language models are returned.
+newListLanguageModels ::
+  ListLanguageModels
+newListLanguageModels =
+  ListLanguageModels'
+    { maxResults = Prelude.Nothing,
+      nameContains = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      statusEquals = Prelude.Nothing
+    }
+
+-- | The maximum number of custom language models to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listLanguageModels_maxResults :: Lens.Lens' ListLanguageModels (Prelude.Maybe Prelude.Natural)
+listLanguageModels_maxResults = Lens.lens (\ListLanguageModels' {maxResults} -> maxResults) (\s@ListLanguageModels' {} a -> s {maxResults = a} :: ListLanguageModels)
+
+-- | Returns only the custom language models that contain the specified
+-- string. The search is not case sensitive.
+listLanguageModels_nameContains :: Lens.Lens' ListLanguageModels (Prelude.Maybe Prelude.Text)
+listLanguageModels_nameContains = Lens.lens (\ListLanguageModels' {nameContains} -> nameContains) (\s@ListLanguageModels' {} a -> s {nameContains = a} :: ListLanguageModels)
+
+-- | If your @ListLanguageModels@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+listLanguageModels_nextToken :: Lens.Lens' ListLanguageModels (Prelude.Maybe Prelude.Text)
+listLanguageModels_nextToken = Lens.lens (\ListLanguageModels' {nextToken} -> nextToken) (\s@ListLanguageModels' {} a -> s {nextToken = a} :: ListLanguageModels)
+
+-- | Returns only custom language models with the specified status. Language
+-- models are ordered by creation date, with the newest model first. If you
+-- don\'t include @StatusEquals@, all custom language models are returned.
+listLanguageModels_statusEquals :: Lens.Lens' ListLanguageModels (Prelude.Maybe ModelStatus)
+listLanguageModels_statusEquals = Lens.lens (\ListLanguageModels' {statusEquals} -> statusEquals) (\s@ListLanguageModels' {} a -> s {statusEquals = a} :: ListLanguageModels)
+
+instance Core.AWSRequest ListLanguageModels where
+  type
+    AWSResponse ListLanguageModels =
+      ListLanguageModelsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListLanguageModelsResponse'
+            Prelude.<$> (x Data..?> "Models" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListLanguageModels where
+  hashWithSalt _salt ListLanguageModels' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nameContains
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` statusEquals
+
+instance Prelude.NFData ListLanguageModels where
+  rnf ListLanguageModels' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nameContains
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf statusEquals
+
+instance Data.ToHeaders ListLanguageModels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListLanguageModels" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListLanguageModels where
+  toJSON ListLanguageModels' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NameContains" Data..=) Prelude.<$> nameContains,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("StatusEquals" Data..=) Prelude.<$> statusEquals
+          ]
+      )
+
+instance Data.ToPath ListLanguageModels where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListLanguageModels where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListLanguageModelsResponse' smart constructor.
+data ListLanguageModelsResponse = ListLanguageModelsResponse'
+  { -- | Provides information about the custom language models that match the
+    -- criteria specified in your request.
+    models :: Prelude.Maybe [LanguageModel],
+    -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListLanguageModelsResponse' 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:
+--
+-- 'models', 'listLanguageModelsResponse_models' - Provides information about the custom language models that match the
+-- criteria specified in your request.
+--
+-- 'nextToken', 'listLanguageModelsResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'httpStatus', 'listLanguageModelsResponse_httpStatus' - The response's http status code.
+newListLanguageModelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListLanguageModelsResponse
+newListLanguageModelsResponse pHttpStatus_ =
+  ListLanguageModelsResponse'
+    { models =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides information about the custom language models that match the
+-- criteria specified in your request.
+listLanguageModelsResponse_models :: Lens.Lens' ListLanguageModelsResponse (Prelude.Maybe [LanguageModel])
+listLanguageModelsResponse_models = Lens.lens (\ListLanguageModelsResponse' {models} -> models) (\s@ListLanguageModelsResponse' {} a -> s {models = a} :: ListLanguageModelsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listLanguageModelsResponse_nextToken :: Lens.Lens' ListLanguageModelsResponse (Prelude.Maybe Prelude.Text)
+listLanguageModelsResponse_nextToken = Lens.lens (\ListLanguageModelsResponse' {nextToken} -> nextToken) (\s@ListLanguageModelsResponse' {} a -> s {nextToken = a} :: ListLanguageModelsResponse)
+
+-- | The response's http status code.
+listLanguageModelsResponse_httpStatus :: Lens.Lens' ListLanguageModelsResponse Prelude.Int
+listLanguageModelsResponse_httpStatus = Lens.lens (\ListLanguageModelsResponse' {httpStatus} -> httpStatus) (\s@ListLanguageModelsResponse' {} a -> s {httpStatus = a} :: ListLanguageModelsResponse)
+
+instance Prelude.NFData ListLanguageModelsResponse where
+  rnf ListLanguageModelsResponse' {..} =
+    Prelude.rnf models
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListMedicalTranscriptionJobs.hs b/gen/Amazonka/Transcribe/ListMedicalTranscriptionJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListMedicalTranscriptionJobs.hs
@@ -0,0 +1,298 @@
+{-# 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.Transcribe.ListMedicalTranscriptionJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of medical transcription jobs that match the specified
+-- criteria. If no criteria are specified, all medical transcription jobs
+-- are returned.
+--
+-- To get detailed information about a specific medical transcription job,
+-- use the operation.
+module Amazonka.Transcribe.ListMedicalTranscriptionJobs
+  ( -- * Creating a Request
+    ListMedicalTranscriptionJobs (..),
+    newListMedicalTranscriptionJobs,
+
+    -- * Request Lenses
+    listMedicalTranscriptionJobs_jobNameContains,
+    listMedicalTranscriptionJobs_maxResults,
+    listMedicalTranscriptionJobs_nextToken,
+    listMedicalTranscriptionJobs_status,
+
+    -- * Destructuring the Response
+    ListMedicalTranscriptionJobsResponse (..),
+    newListMedicalTranscriptionJobsResponse,
+
+    -- * Response Lenses
+    listMedicalTranscriptionJobsResponse_medicalTranscriptionJobSummaries,
+    listMedicalTranscriptionJobsResponse_nextToken,
+    listMedicalTranscriptionJobsResponse_status,
+    listMedicalTranscriptionJobsResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListMedicalTranscriptionJobs' smart constructor.
+data ListMedicalTranscriptionJobs = ListMedicalTranscriptionJobs'
+  { -- | Returns only the medical transcription jobs that contain the specified
+    -- string. The search is not case sensitive.
+    jobNameContains :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of medical transcription jobs to return in each page
+    -- of results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If your @ListMedicalTranscriptionJobs@ request returns more results than
+    -- can be displayed, @NextToken@ is displayed in the response with an
+    -- associated string. To get the next page of results, copy this string and
+    -- repeat your request, including @NextToken@ with the value of the copied
+    -- string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only medical transcription jobs with the specified status. Jobs
+    -- are ordered by creation date, with the newest job first. If you don\'t
+    -- include @Status@, all medical transcription jobs are returned.
+    status :: Prelude.Maybe TranscriptionJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMedicalTranscriptionJobs' 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:
+--
+-- 'jobNameContains', 'listMedicalTranscriptionJobs_jobNameContains' - Returns only the medical transcription jobs that contain the specified
+-- string. The search is not case sensitive.
+--
+-- 'maxResults', 'listMedicalTranscriptionJobs_maxResults' - The maximum number of medical transcription jobs to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nextToken', 'listMedicalTranscriptionJobs_nextToken' - If your @ListMedicalTranscriptionJobs@ request returns more results than
+-- can be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+--
+-- 'status', 'listMedicalTranscriptionJobs_status' - Returns only medical transcription jobs with the specified status. Jobs
+-- are ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all medical transcription jobs are returned.
+newListMedicalTranscriptionJobs ::
+  ListMedicalTranscriptionJobs
+newListMedicalTranscriptionJobs =
+  ListMedicalTranscriptionJobs'
+    { jobNameContains =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Returns only the medical transcription jobs that contain the specified
+-- string. The search is not case sensitive.
+listMedicalTranscriptionJobs_jobNameContains :: Lens.Lens' ListMedicalTranscriptionJobs (Prelude.Maybe Prelude.Text)
+listMedicalTranscriptionJobs_jobNameContains = Lens.lens (\ListMedicalTranscriptionJobs' {jobNameContains} -> jobNameContains) (\s@ListMedicalTranscriptionJobs' {} a -> s {jobNameContains = a} :: ListMedicalTranscriptionJobs)
+
+-- | The maximum number of medical transcription jobs to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listMedicalTranscriptionJobs_maxResults :: Lens.Lens' ListMedicalTranscriptionJobs (Prelude.Maybe Prelude.Natural)
+listMedicalTranscriptionJobs_maxResults = Lens.lens (\ListMedicalTranscriptionJobs' {maxResults} -> maxResults) (\s@ListMedicalTranscriptionJobs' {} a -> s {maxResults = a} :: ListMedicalTranscriptionJobs)
+
+-- | If your @ListMedicalTranscriptionJobs@ request returns more results than
+-- can be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+listMedicalTranscriptionJobs_nextToken :: Lens.Lens' ListMedicalTranscriptionJobs (Prelude.Maybe Prelude.Text)
+listMedicalTranscriptionJobs_nextToken = Lens.lens (\ListMedicalTranscriptionJobs' {nextToken} -> nextToken) (\s@ListMedicalTranscriptionJobs' {} a -> s {nextToken = a} :: ListMedicalTranscriptionJobs)
+
+-- | Returns only medical transcription jobs with the specified status. Jobs
+-- are ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all medical transcription jobs are returned.
+listMedicalTranscriptionJobs_status :: Lens.Lens' ListMedicalTranscriptionJobs (Prelude.Maybe TranscriptionJobStatus)
+listMedicalTranscriptionJobs_status = Lens.lens (\ListMedicalTranscriptionJobs' {status} -> status) (\s@ListMedicalTranscriptionJobs' {} a -> s {status = a} :: ListMedicalTranscriptionJobs)
+
+instance Core.AWSRequest ListMedicalTranscriptionJobs where
+  type
+    AWSResponse ListMedicalTranscriptionJobs =
+      ListMedicalTranscriptionJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMedicalTranscriptionJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "MedicalTranscriptionJobSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListMedicalTranscriptionJobs
+  where
+  hashWithSalt _salt ListMedicalTranscriptionJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobNameContains
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ListMedicalTranscriptionJobs where
+  rnf ListMedicalTranscriptionJobs' {..} =
+    Prelude.rnf jobNameContains
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+
+instance Data.ToHeaders ListMedicalTranscriptionJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListMedicalTranscriptionJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListMedicalTranscriptionJobs where
+  toJSON ListMedicalTranscriptionJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobNameContains" Data..=)
+              Prelude.<$> jobNameContains,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Status" Data..=) Prelude.<$> status
+          ]
+      )
+
+instance Data.ToPath ListMedicalTranscriptionJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListMedicalTranscriptionJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListMedicalTranscriptionJobsResponse' smart constructor.
+data ListMedicalTranscriptionJobsResponse = ListMedicalTranscriptionJobsResponse'
+  { -- | Provides a summary of information about each result.
+    medicalTranscriptionJobSummaries :: Prelude.Maybe [MedicalTranscriptionJobSummary],
+    -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists all medical transcription jobs that have the status specified in
+    -- your request. Jobs are ordered by creation date, with the newest job
+    -- first.
+    status :: Prelude.Maybe TranscriptionJobStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMedicalTranscriptionJobsResponse' 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:
+--
+-- 'medicalTranscriptionJobSummaries', 'listMedicalTranscriptionJobsResponse_medicalTranscriptionJobSummaries' - Provides a summary of information about each result.
+--
+-- 'nextToken', 'listMedicalTranscriptionJobsResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'status', 'listMedicalTranscriptionJobsResponse_status' - Lists all medical transcription jobs that have the status specified in
+-- your request. Jobs are ordered by creation date, with the newest job
+-- first.
+--
+-- 'httpStatus', 'listMedicalTranscriptionJobsResponse_httpStatus' - The response's http status code.
+newListMedicalTranscriptionJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMedicalTranscriptionJobsResponse
+newListMedicalTranscriptionJobsResponse pHttpStatus_ =
+  ListMedicalTranscriptionJobsResponse'
+    { medicalTranscriptionJobSummaries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides a summary of information about each result.
+listMedicalTranscriptionJobsResponse_medicalTranscriptionJobSummaries :: Lens.Lens' ListMedicalTranscriptionJobsResponse (Prelude.Maybe [MedicalTranscriptionJobSummary])
+listMedicalTranscriptionJobsResponse_medicalTranscriptionJobSummaries = Lens.lens (\ListMedicalTranscriptionJobsResponse' {medicalTranscriptionJobSummaries} -> medicalTranscriptionJobSummaries) (\s@ListMedicalTranscriptionJobsResponse' {} a -> s {medicalTranscriptionJobSummaries = a} :: ListMedicalTranscriptionJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listMedicalTranscriptionJobsResponse_nextToken :: Lens.Lens' ListMedicalTranscriptionJobsResponse (Prelude.Maybe Prelude.Text)
+listMedicalTranscriptionJobsResponse_nextToken = Lens.lens (\ListMedicalTranscriptionJobsResponse' {nextToken} -> nextToken) (\s@ListMedicalTranscriptionJobsResponse' {} a -> s {nextToken = a} :: ListMedicalTranscriptionJobsResponse)
+
+-- | Lists all medical transcription jobs that have the status specified in
+-- your request. Jobs are ordered by creation date, with the newest job
+-- first.
+listMedicalTranscriptionJobsResponse_status :: Lens.Lens' ListMedicalTranscriptionJobsResponse (Prelude.Maybe TranscriptionJobStatus)
+listMedicalTranscriptionJobsResponse_status = Lens.lens (\ListMedicalTranscriptionJobsResponse' {status} -> status) (\s@ListMedicalTranscriptionJobsResponse' {} a -> s {status = a} :: ListMedicalTranscriptionJobsResponse)
+
+-- | The response's http status code.
+listMedicalTranscriptionJobsResponse_httpStatus :: Lens.Lens' ListMedicalTranscriptionJobsResponse Prelude.Int
+listMedicalTranscriptionJobsResponse_httpStatus = Lens.lens (\ListMedicalTranscriptionJobsResponse' {httpStatus} -> httpStatus) (\s@ListMedicalTranscriptionJobsResponse' {} a -> s {httpStatus = a} :: ListMedicalTranscriptionJobsResponse)
+
+instance
+  Prelude.NFData
+    ListMedicalTranscriptionJobsResponse
+  where
+  rnf ListMedicalTranscriptionJobsResponse' {..} =
+    Prelude.rnf medicalTranscriptionJobSummaries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListMedicalVocabularies.hs b/gen/Amazonka/Transcribe/ListMedicalVocabularies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListMedicalVocabularies.hs
@@ -0,0 +1,297 @@
+{-# 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.Transcribe.ListMedicalVocabularies
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of custom medical vocabularies that match the specified
+-- criteria. If no criteria are specified, all custom medical vocabularies
+-- are returned.
+--
+-- To get detailed information about a specific custom medical vocabulary,
+-- use the operation.
+module Amazonka.Transcribe.ListMedicalVocabularies
+  ( -- * Creating a Request
+    ListMedicalVocabularies (..),
+    newListMedicalVocabularies,
+
+    -- * Request Lenses
+    listMedicalVocabularies_maxResults,
+    listMedicalVocabularies_nameContains,
+    listMedicalVocabularies_nextToken,
+    listMedicalVocabularies_stateEquals,
+
+    -- * Destructuring the Response
+    ListMedicalVocabulariesResponse (..),
+    newListMedicalVocabulariesResponse,
+
+    -- * Response Lenses
+    listMedicalVocabulariesResponse_nextToken,
+    listMedicalVocabulariesResponse_status,
+    listMedicalVocabulariesResponse_vocabularies,
+    listMedicalVocabulariesResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListMedicalVocabularies' smart constructor.
+data ListMedicalVocabularies = ListMedicalVocabularies'
+  { -- | The maximum number of custom medical vocabularies to return in each page
+    -- of results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Returns only the custom medical vocabularies that contain the specified
+    -- string. The search is not case sensitive.
+    nameContains :: Prelude.Maybe Prelude.Text,
+    -- | If your @ListMedicalVocabularies@ request returns more results than can
+    -- be displayed, @NextToken@ is displayed in the response with an
+    -- associated string. To get the next page of results, copy this string and
+    -- repeat your request, including @NextToken@ with the value of the copied
+    -- string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only custom medical vocabularies with the specified state.
+    -- Custom vocabularies are ordered by creation date, with the newest
+    -- vocabulary first. If you don\'t include @StateEquals@, all custom
+    -- medical vocabularies are returned.
+    stateEquals :: Prelude.Maybe VocabularyState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMedicalVocabularies' 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', 'listMedicalVocabularies_maxResults' - The maximum number of custom medical vocabularies to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nameContains', 'listMedicalVocabularies_nameContains' - Returns only the custom medical vocabularies that contain the specified
+-- string. The search is not case sensitive.
+--
+-- 'nextToken', 'listMedicalVocabularies_nextToken' - If your @ListMedicalVocabularies@ request returns more results than can
+-- be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+--
+-- 'stateEquals', 'listMedicalVocabularies_stateEquals' - Returns only custom medical vocabularies with the specified state.
+-- Custom vocabularies are ordered by creation date, with the newest
+-- vocabulary first. If you don\'t include @StateEquals@, all custom
+-- medical vocabularies are returned.
+newListMedicalVocabularies ::
+  ListMedicalVocabularies
+newListMedicalVocabularies =
+  ListMedicalVocabularies'
+    { maxResults =
+        Prelude.Nothing,
+      nameContains = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      stateEquals = Prelude.Nothing
+    }
+
+-- | The maximum number of custom medical vocabularies to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listMedicalVocabularies_maxResults :: Lens.Lens' ListMedicalVocabularies (Prelude.Maybe Prelude.Natural)
+listMedicalVocabularies_maxResults = Lens.lens (\ListMedicalVocabularies' {maxResults} -> maxResults) (\s@ListMedicalVocabularies' {} a -> s {maxResults = a} :: ListMedicalVocabularies)
+
+-- | Returns only the custom medical vocabularies that contain the specified
+-- string. The search is not case sensitive.
+listMedicalVocabularies_nameContains :: Lens.Lens' ListMedicalVocabularies (Prelude.Maybe Prelude.Text)
+listMedicalVocabularies_nameContains = Lens.lens (\ListMedicalVocabularies' {nameContains} -> nameContains) (\s@ListMedicalVocabularies' {} a -> s {nameContains = a} :: ListMedicalVocabularies)
+
+-- | If your @ListMedicalVocabularies@ request returns more results than can
+-- be displayed, @NextToken@ is displayed in the response with an
+-- associated string. To get the next page of results, copy this string and
+-- repeat your request, including @NextToken@ with the value of the copied
+-- string. Repeat as needed to view all your results.
+listMedicalVocabularies_nextToken :: Lens.Lens' ListMedicalVocabularies (Prelude.Maybe Prelude.Text)
+listMedicalVocabularies_nextToken = Lens.lens (\ListMedicalVocabularies' {nextToken} -> nextToken) (\s@ListMedicalVocabularies' {} a -> s {nextToken = a} :: ListMedicalVocabularies)
+
+-- | Returns only custom medical vocabularies with the specified state.
+-- Custom vocabularies are ordered by creation date, with the newest
+-- vocabulary first. If you don\'t include @StateEquals@, all custom
+-- medical vocabularies are returned.
+listMedicalVocabularies_stateEquals :: Lens.Lens' ListMedicalVocabularies (Prelude.Maybe VocabularyState)
+listMedicalVocabularies_stateEquals = Lens.lens (\ListMedicalVocabularies' {stateEquals} -> stateEquals) (\s@ListMedicalVocabularies' {} a -> s {stateEquals = a} :: ListMedicalVocabularies)
+
+instance Core.AWSRequest ListMedicalVocabularies where
+  type
+    AWSResponse ListMedicalVocabularies =
+      ListMedicalVocabulariesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMedicalVocabulariesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "Vocabularies" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListMedicalVocabularies where
+  hashWithSalt _salt ListMedicalVocabularies' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nameContains
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` stateEquals
+
+instance Prelude.NFData ListMedicalVocabularies where
+  rnf ListMedicalVocabularies' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nameContains
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf stateEquals
+
+instance Data.ToHeaders ListMedicalVocabularies where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListMedicalVocabularies" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListMedicalVocabularies where
+  toJSON ListMedicalVocabularies' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NameContains" Data..=) Prelude.<$> nameContains,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("StateEquals" Data..=) Prelude.<$> stateEquals
+          ]
+      )
+
+instance Data.ToPath ListMedicalVocabularies where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListMedicalVocabularies where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListMedicalVocabulariesResponse' smart constructor.
+data ListMedicalVocabulariesResponse = ListMedicalVocabulariesResponse'
+  { -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists all custom medical vocabularies that have the status specified in
+    -- your request. Custom vocabularies are ordered by creation date, with the
+    -- newest vocabulary first.
+    status :: Prelude.Maybe VocabularyState,
+    -- | Provides information about the custom medical vocabularies that match
+    -- the criteria specified in your request.
+    vocabularies :: Prelude.Maybe [VocabularyInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMedicalVocabulariesResponse' 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', 'listMedicalVocabulariesResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'status', 'listMedicalVocabulariesResponse_status' - Lists all custom medical vocabularies that have the status specified in
+-- your request. Custom vocabularies are ordered by creation date, with the
+-- newest vocabulary first.
+--
+-- 'vocabularies', 'listMedicalVocabulariesResponse_vocabularies' - Provides information about the custom medical vocabularies that match
+-- the criteria specified in your request.
+--
+-- 'httpStatus', 'listMedicalVocabulariesResponse_httpStatus' - The response's http status code.
+newListMedicalVocabulariesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMedicalVocabulariesResponse
+newListMedicalVocabulariesResponse pHttpStatus_ =
+  ListMedicalVocabulariesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      status = Prelude.Nothing,
+      vocabularies = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listMedicalVocabulariesResponse_nextToken :: Lens.Lens' ListMedicalVocabulariesResponse (Prelude.Maybe Prelude.Text)
+listMedicalVocabulariesResponse_nextToken = Lens.lens (\ListMedicalVocabulariesResponse' {nextToken} -> nextToken) (\s@ListMedicalVocabulariesResponse' {} a -> s {nextToken = a} :: ListMedicalVocabulariesResponse)
+
+-- | Lists all custom medical vocabularies that have the status specified in
+-- your request. Custom vocabularies are ordered by creation date, with the
+-- newest vocabulary first.
+listMedicalVocabulariesResponse_status :: Lens.Lens' ListMedicalVocabulariesResponse (Prelude.Maybe VocabularyState)
+listMedicalVocabulariesResponse_status = Lens.lens (\ListMedicalVocabulariesResponse' {status} -> status) (\s@ListMedicalVocabulariesResponse' {} a -> s {status = a} :: ListMedicalVocabulariesResponse)
+
+-- | Provides information about the custom medical vocabularies that match
+-- the criteria specified in your request.
+listMedicalVocabulariesResponse_vocabularies :: Lens.Lens' ListMedicalVocabulariesResponse (Prelude.Maybe [VocabularyInfo])
+listMedicalVocabulariesResponse_vocabularies = Lens.lens (\ListMedicalVocabulariesResponse' {vocabularies} -> vocabularies) (\s@ListMedicalVocabulariesResponse' {} a -> s {vocabularies = a} :: ListMedicalVocabulariesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listMedicalVocabulariesResponse_httpStatus :: Lens.Lens' ListMedicalVocabulariesResponse Prelude.Int
+listMedicalVocabulariesResponse_httpStatus = Lens.lens (\ListMedicalVocabulariesResponse' {httpStatus} -> httpStatus) (\s@ListMedicalVocabulariesResponse' {} a -> s {httpStatus = a} :: ListMedicalVocabulariesResponse)
+
+instance
+  Prelude.NFData
+    ListMedicalVocabulariesResponse
+  where
+  rnf ListMedicalVocabulariesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf vocabularies
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListTagsForResource.hs b/gen/Amazonka/Transcribe/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListTagsForResource.hs
@@ -0,0 +1,215 @@
+{-# 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.Transcribe.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 the specified transcription job,
+-- vocabulary, model, or resource.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+module Amazonka.Transcribe.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_resourceArn,
+    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.Transcribe.Types
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | Returns a list of all tags associated with the specified Amazon Resource
+    -- Name (ARN). ARNs have the format
+    -- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+    --
+    -- For example,
+    -- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+    --
+    -- Valid values for @resource-type@ are: @transcription-job@,
+    -- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+    -- @vocabulary-filter@, and @language-model@.
+    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' - Returns a list of all tags associated with the specified Amazon Resource
+-- Name (ARN). ARNs have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | Returns a list of all tags associated with the specified Amazon Resource
+-- Name (ARN). ARNs have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+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..?> "ResourceArn")
+            Prelude.<*> (x Data..?> "Tags")
+            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.=# ( "Transcribe.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          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 Amazon Resource Name (ARN) specified in your request.
+    resourceArn :: Prelude.Maybe Prelude.Text,
+    -- | Lists all tags associated with the given transcription job, vocabulary,
+    -- model, or resource.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, 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:
+--
+-- 'resourceArn', 'listTagsForResourceResponse_resourceArn' - The Amazon Resource Name (ARN) specified in your request.
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - Lists all tags associated with the given transcription job, vocabulary,
+-- model, or resource.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { resourceArn =
+        Prelude.Nothing,
+      tags = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) specified in your request.
+listTagsForResourceResponse_resourceArn :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe Prelude.Text)
+listTagsForResourceResponse_resourceArn = Lens.lens (\ListTagsForResourceResponse' {resourceArn} -> resourceArn) (\s@ListTagsForResourceResponse' {} a -> s {resourceArn = a} :: ListTagsForResourceResponse)
+
+-- | Lists all tags associated with the given transcription job, vocabulary,
+-- model, or resource.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe (Prelude.NonEmpty 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 resourceArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListTranscriptionJobs.hs b/gen/Amazonka/Transcribe/ListTranscriptionJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListTranscriptionJobs.hs
@@ -0,0 +1,288 @@
+{-# 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.Transcribe.ListTranscriptionJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of transcription jobs that match the specified criteria.
+-- If no criteria are specified, all transcription jobs are returned.
+--
+-- To get detailed information about a specific transcription job, use the
+-- operation.
+module Amazonka.Transcribe.ListTranscriptionJobs
+  ( -- * Creating a Request
+    ListTranscriptionJobs (..),
+    newListTranscriptionJobs,
+
+    -- * Request Lenses
+    listTranscriptionJobs_jobNameContains,
+    listTranscriptionJobs_maxResults,
+    listTranscriptionJobs_nextToken,
+    listTranscriptionJobs_status,
+
+    -- * Destructuring the Response
+    ListTranscriptionJobsResponse (..),
+    newListTranscriptionJobsResponse,
+
+    -- * Response Lenses
+    listTranscriptionJobsResponse_nextToken,
+    listTranscriptionJobsResponse_status,
+    listTranscriptionJobsResponse_transcriptionJobSummaries,
+    listTranscriptionJobsResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListTranscriptionJobs' smart constructor.
+data ListTranscriptionJobs = ListTranscriptionJobs'
+  { -- | Returns only the transcription jobs that contain the specified string.
+    -- The search is not case sensitive.
+    jobNameContains :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of transcription jobs to return in each page of
+    -- results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If your @ListTranscriptionJobs@ request returns more results than can be
+    -- displayed, @NextToken@ is displayed in the response with an associated
+    -- string. To get the next page of results, copy this string and repeat
+    -- your request, including @NextToken@ with the value of the copied string.
+    -- Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only transcription jobs with the specified status. Jobs are
+    -- ordered by creation date, with the newest job first. If you don\'t
+    -- include @Status@, all transcription jobs are returned.
+    status :: Prelude.Maybe TranscriptionJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTranscriptionJobs' 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:
+--
+-- 'jobNameContains', 'listTranscriptionJobs_jobNameContains' - Returns only the transcription jobs that contain the specified string.
+-- The search is not case sensitive.
+--
+-- 'maxResults', 'listTranscriptionJobs_maxResults' - The maximum number of transcription jobs to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nextToken', 'listTranscriptionJobs_nextToken' - If your @ListTranscriptionJobs@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+--
+-- 'status', 'listTranscriptionJobs_status' - Returns only transcription jobs with the specified status. Jobs are
+-- ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all transcription jobs are returned.
+newListTranscriptionJobs ::
+  ListTranscriptionJobs
+newListTranscriptionJobs =
+  ListTranscriptionJobs'
+    { jobNameContains =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Returns only the transcription jobs that contain the specified string.
+-- The search is not case sensitive.
+listTranscriptionJobs_jobNameContains :: Lens.Lens' ListTranscriptionJobs (Prelude.Maybe Prelude.Text)
+listTranscriptionJobs_jobNameContains = Lens.lens (\ListTranscriptionJobs' {jobNameContains} -> jobNameContains) (\s@ListTranscriptionJobs' {} a -> s {jobNameContains = a} :: ListTranscriptionJobs)
+
+-- | The maximum number of transcription jobs to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listTranscriptionJobs_maxResults :: Lens.Lens' ListTranscriptionJobs (Prelude.Maybe Prelude.Natural)
+listTranscriptionJobs_maxResults = Lens.lens (\ListTranscriptionJobs' {maxResults} -> maxResults) (\s@ListTranscriptionJobs' {} a -> s {maxResults = a} :: ListTranscriptionJobs)
+
+-- | If your @ListTranscriptionJobs@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+listTranscriptionJobs_nextToken :: Lens.Lens' ListTranscriptionJobs (Prelude.Maybe Prelude.Text)
+listTranscriptionJobs_nextToken = Lens.lens (\ListTranscriptionJobs' {nextToken} -> nextToken) (\s@ListTranscriptionJobs' {} a -> s {nextToken = a} :: ListTranscriptionJobs)
+
+-- | Returns only transcription jobs with the specified status. Jobs are
+-- ordered by creation date, with the newest job first. If you don\'t
+-- include @Status@, all transcription jobs are returned.
+listTranscriptionJobs_status :: Lens.Lens' ListTranscriptionJobs (Prelude.Maybe TranscriptionJobStatus)
+listTranscriptionJobs_status = Lens.lens (\ListTranscriptionJobs' {status} -> status) (\s@ListTranscriptionJobs' {} a -> s {status = a} :: ListTranscriptionJobs)
+
+instance Core.AWSRequest ListTranscriptionJobs where
+  type
+    AWSResponse ListTranscriptionJobs =
+      ListTranscriptionJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTranscriptionJobsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> ( x
+                            Data..?> "TranscriptionJobSummaries"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTranscriptionJobs where
+  hashWithSalt _salt ListTranscriptionJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` jobNameContains
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData ListTranscriptionJobs where
+  rnf ListTranscriptionJobs' {..} =
+    Prelude.rnf jobNameContains
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+
+instance Data.ToHeaders ListTranscriptionJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListTranscriptionJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTranscriptionJobs where
+  toJSON ListTranscriptionJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("JobNameContains" Data..=)
+              Prelude.<$> jobNameContains,
+            ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("Status" Data..=) Prelude.<$> status
+          ]
+      )
+
+instance Data.ToPath ListTranscriptionJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTranscriptionJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTranscriptionJobsResponse' smart constructor.
+data ListTranscriptionJobsResponse = ListTranscriptionJobsResponse'
+  { -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists all transcription jobs that have the status specified in your
+    -- request. Jobs are ordered by creation date, with the newest job first.
+    status :: Prelude.Maybe TranscriptionJobStatus,
+    -- | Provides a summary of information about each result.
+    transcriptionJobSummaries :: Prelude.Maybe [TranscriptionJobSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTranscriptionJobsResponse' 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', 'listTranscriptionJobsResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'status', 'listTranscriptionJobsResponse_status' - Lists all transcription jobs that have the status specified in your
+-- request. Jobs are ordered by creation date, with the newest job first.
+--
+-- 'transcriptionJobSummaries', 'listTranscriptionJobsResponse_transcriptionJobSummaries' - Provides a summary of information about each result.
+--
+-- 'httpStatus', 'listTranscriptionJobsResponse_httpStatus' - The response's http status code.
+newListTranscriptionJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTranscriptionJobsResponse
+newListTranscriptionJobsResponse pHttpStatus_ =
+  ListTranscriptionJobsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      status = Prelude.Nothing,
+      transcriptionJobSummaries = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listTranscriptionJobsResponse_nextToken :: Lens.Lens' ListTranscriptionJobsResponse (Prelude.Maybe Prelude.Text)
+listTranscriptionJobsResponse_nextToken = Lens.lens (\ListTranscriptionJobsResponse' {nextToken} -> nextToken) (\s@ListTranscriptionJobsResponse' {} a -> s {nextToken = a} :: ListTranscriptionJobsResponse)
+
+-- | Lists all transcription jobs that have the status specified in your
+-- request. Jobs are ordered by creation date, with the newest job first.
+listTranscriptionJobsResponse_status :: Lens.Lens' ListTranscriptionJobsResponse (Prelude.Maybe TranscriptionJobStatus)
+listTranscriptionJobsResponse_status = Lens.lens (\ListTranscriptionJobsResponse' {status} -> status) (\s@ListTranscriptionJobsResponse' {} a -> s {status = a} :: ListTranscriptionJobsResponse)
+
+-- | Provides a summary of information about each result.
+listTranscriptionJobsResponse_transcriptionJobSummaries :: Lens.Lens' ListTranscriptionJobsResponse (Prelude.Maybe [TranscriptionJobSummary])
+listTranscriptionJobsResponse_transcriptionJobSummaries = Lens.lens (\ListTranscriptionJobsResponse' {transcriptionJobSummaries} -> transcriptionJobSummaries) (\s@ListTranscriptionJobsResponse' {} a -> s {transcriptionJobSummaries = a} :: ListTranscriptionJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTranscriptionJobsResponse_httpStatus :: Lens.Lens' ListTranscriptionJobsResponse Prelude.Int
+listTranscriptionJobsResponse_httpStatus = Lens.lens (\ListTranscriptionJobsResponse' {httpStatus} -> httpStatus) (\s@ListTranscriptionJobsResponse' {} a -> s {httpStatus = a} :: ListTranscriptionJobsResponse)
+
+instance Prelude.NFData ListTranscriptionJobsResponse where
+  rnf ListTranscriptionJobsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf transcriptionJobSummaries
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListVocabularies.hs b/gen/Amazonka/Transcribe/ListVocabularies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListVocabularies.hs
@@ -0,0 +1,293 @@
+{-# 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.Transcribe.ListVocabularies
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of custom vocabularies that match the specified
+-- criteria. If no criteria are specified, all custom vocabularies are
+-- returned.
+--
+-- To get detailed information about a specific custom vocabulary, use the
+-- operation.
+module Amazonka.Transcribe.ListVocabularies
+  ( -- * Creating a Request
+    ListVocabularies (..),
+    newListVocabularies,
+
+    -- * Request Lenses
+    listVocabularies_maxResults,
+    listVocabularies_nameContains,
+    listVocabularies_nextToken,
+    listVocabularies_stateEquals,
+
+    -- * Destructuring the Response
+    ListVocabulariesResponse (..),
+    newListVocabulariesResponse,
+
+    -- * Response Lenses
+    listVocabulariesResponse_nextToken,
+    listVocabulariesResponse_status,
+    listVocabulariesResponse_vocabularies,
+    listVocabulariesResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListVocabularies' smart constructor.
+data ListVocabularies = ListVocabularies'
+  { -- | The maximum number of custom vocabularies to return in each page of
+    -- results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Returns only the custom vocabularies that contain the specified string.
+    -- The search is not case sensitive.
+    nameContains :: Prelude.Maybe Prelude.Text,
+    -- | If your @ListVocabularies@ request returns more results than can be
+    -- displayed, @NextToken@ is displayed in the response with an associated
+    -- string. To get the next page of results, copy this string and repeat
+    -- your request, including @NextToken@ with the value of the copied string.
+    -- Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Returns only custom vocabularies with the specified state. Vocabularies
+    -- are ordered by creation date, with the newest vocabulary first. If you
+    -- don\'t include @StateEquals@, all custom medical vocabularies are
+    -- returned.
+    stateEquals :: Prelude.Maybe VocabularyState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVocabularies' 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', 'listVocabularies_maxResults' - The maximum number of custom vocabularies to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nameContains', 'listVocabularies_nameContains' - Returns only the custom vocabularies that contain the specified string.
+-- The search is not case sensitive.
+--
+-- 'nextToken', 'listVocabularies_nextToken' - If your @ListVocabularies@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+--
+-- 'stateEquals', 'listVocabularies_stateEquals' - Returns only custom vocabularies with the specified state. Vocabularies
+-- are ordered by creation date, with the newest vocabulary first. If you
+-- don\'t include @StateEquals@, all custom medical vocabularies are
+-- returned.
+newListVocabularies ::
+  ListVocabularies
+newListVocabularies =
+  ListVocabularies'
+    { maxResults = Prelude.Nothing,
+      nameContains = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      stateEquals = Prelude.Nothing
+    }
+
+-- | The maximum number of custom vocabularies to return in each page of
+-- results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listVocabularies_maxResults :: Lens.Lens' ListVocabularies (Prelude.Maybe Prelude.Natural)
+listVocabularies_maxResults = Lens.lens (\ListVocabularies' {maxResults} -> maxResults) (\s@ListVocabularies' {} a -> s {maxResults = a} :: ListVocabularies)
+
+-- | Returns only the custom vocabularies that contain the specified string.
+-- The search is not case sensitive.
+listVocabularies_nameContains :: Lens.Lens' ListVocabularies (Prelude.Maybe Prelude.Text)
+listVocabularies_nameContains = Lens.lens (\ListVocabularies' {nameContains} -> nameContains) (\s@ListVocabularies' {} a -> s {nameContains = a} :: ListVocabularies)
+
+-- | If your @ListVocabularies@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+listVocabularies_nextToken :: Lens.Lens' ListVocabularies (Prelude.Maybe Prelude.Text)
+listVocabularies_nextToken = Lens.lens (\ListVocabularies' {nextToken} -> nextToken) (\s@ListVocabularies' {} a -> s {nextToken = a} :: ListVocabularies)
+
+-- | Returns only custom vocabularies with the specified state. Vocabularies
+-- are ordered by creation date, with the newest vocabulary first. If you
+-- don\'t include @StateEquals@, all custom medical vocabularies are
+-- returned.
+listVocabularies_stateEquals :: Lens.Lens' ListVocabularies (Prelude.Maybe VocabularyState)
+listVocabularies_stateEquals = Lens.lens (\ListVocabularies' {stateEquals} -> stateEquals) (\s@ListVocabularies' {} a -> s {stateEquals = a} :: ListVocabularies)
+
+instance Core.AWSRequest ListVocabularies where
+  type
+    AWSResponse ListVocabularies =
+      ListVocabulariesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVocabulariesResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Status")
+            Prelude.<*> (x Data..?> "Vocabularies" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListVocabularies where
+  hashWithSalt _salt ListVocabularies' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nameContains
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` stateEquals
+
+instance Prelude.NFData ListVocabularies where
+  rnf ListVocabularies' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nameContains
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf stateEquals
+
+instance Data.ToHeaders ListVocabularies where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListVocabularies" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListVocabularies where
+  toJSON ListVocabularies' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NameContains" Data..=) Prelude.<$> nameContains,
+            ("NextToken" Data..=) Prelude.<$> nextToken,
+            ("StateEquals" Data..=) Prelude.<$> stateEquals
+          ]
+      )
+
+instance Data.ToPath ListVocabularies where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListVocabularies where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListVocabulariesResponse' smart constructor.
+data ListVocabulariesResponse = ListVocabulariesResponse'
+  { -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Lists all custom vocabularies that have the status specified in your
+    -- request. Vocabularies are ordered by creation date, with the newest
+    -- vocabulary first.
+    status :: Prelude.Maybe VocabularyState,
+    -- | Provides information about the custom vocabularies that match the
+    -- criteria specified in your request.
+    vocabularies :: Prelude.Maybe [VocabularyInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVocabulariesResponse' 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', 'listVocabulariesResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'status', 'listVocabulariesResponse_status' - Lists all custom vocabularies that have the status specified in your
+-- request. Vocabularies are ordered by creation date, with the newest
+-- vocabulary first.
+--
+-- 'vocabularies', 'listVocabulariesResponse_vocabularies' - Provides information about the custom vocabularies that match the
+-- criteria specified in your request.
+--
+-- 'httpStatus', 'listVocabulariesResponse_httpStatus' - The response's http status code.
+newListVocabulariesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVocabulariesResponse
+newListVocabulariesResponse pHttpStatus_ =
+  ListVocabulariesResponse'
+    { nextToken =
+        Prelude.Nothing,
+      status = Prelude.Nothing,
+      vocabularies = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listVocabulariesResponse_nextToken :: Lens.Lens' ListVocabulariesResponse (Prelude.Maybe Prelude.Text)
+listVocabulariesResponse_nextToken = Lens.lens (\ListVocabulariesResponse' {nextToken} -> nextToken) (\s@ListVocabulariesResponse' {} a -> s {nextToken = a} :: ListVocabulariesResponse)
+
+-- | Lists all custom vocabularies that have the status specified in your
+-- request. Vocabularies are ordered by creation date, with the newest
+-- vocabulary first.
+listVocabulariesResponse_status :: Lens.Lens' ListVocabulariesResponse (Prelude.Maybe VocabularyState)
+listVocabulariesResponse_status = Lens.lens (\ListVocabulariesResponse' {status} -> status) (\s@ListVocabulariesResponse' {} a -> s {status = a} :: ListVocabulariesResponse)
+
+-- | Provides information about the custom vocabularies that match the
+-- criteria specified in your request.
+listVocabulariesResponse_vocabularies :: Lens.Lens' ListVocabulariesResponse (Prelude.Maybe [VocabularyInfo])
+listVocabulariesResponse_vocabularies = Lens.lens (\ListVocabulariesResponse' {vocabularies} -> vocabularies) (\s@ListVocabulariesResponse' {} a -> s {vocabularies = a} :: ListVocabulariesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listVocabulariesResponse_httpStatus :: Lens.Lens' ListVocabulariesResponse Prelude.Int
+listVocabulariesResponse_httpStatus = Lens.lens (\ListVocabulariesResponse' {httpStatus} -> httpStatus) (\s@ListVocabulariesResponse' {} a -> s {httpStatus = a} :: ListVocabulariesResponse)
+
+instance Prelude.NFData ListVocabulariesResponse where
+  rnf ListVocabulariesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf vocabularies
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/ListVocabularyFilters.hs b/gen/Amazonka/Transcribe/ListVocabularyFilters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/ListVocabularyFilters.hs
@@ -0,0 +1,257 @@
+{-# 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.Transcribe.ListVocabularyFilters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Provides a list of custom vocabulary filters that match the specified
+-- criteria. If no criteria are specified, all custom vocabularies are
+-- returned.
+--
+-- To get detailed information about a specific custom vocabulary filter,
+-- use the operation.
+module Amazonka.Transcribe.ListVocabularyFilters
+  ( -- * Creating a Request
+    ListVocabularyFilters (..),
+    newListVocabularyFilters,
+
+    -- * Request Lenses
+    listVocabularyFilters_maxResults,
+    listVocabularyFilters_nameContains,
+    listVocabularyFilters_nextToken,
+
+    -- * Destructuring the Response
+    ListVocabularyFiltersResponse (..),
+    newListVocabularyFiltersResponse,
+
+    -- * Response Lenses
+    listVocabularyFiltersResponse_nextToken,
+    listVocabularyFiltersResponse_vocabularyFilters,
+    listVocabularyFiltersResponse_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.Transcribe.Types
+
+-- | /See:/ 'newListVocabularyFilters' smart constructor.
+data ListVocabularyFilters = ListVocabularyFilters'
+  { -- | The maximum number of custom vocabulary filters to return in each page
+    -- of results. If there are fewer results than the value that you specify,
+    -- only the actual results are returned. If you don\'t specify a value, a
+    -- default of 5 is used.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Returns only the custom vocabulary filters that contain the specified
+    -- string. The search is not case sensitive.
+    nameContains :: Prelude.Maybe Prelude.Text,
+    -- | If your @ListVocabularyFilters@ request returns more results than can be
+    -- displayed, @NextToken@ is displayed in the response with an associated
+    -- string. To get the next page of results, copy this string and repeat
+    -- your request, including @NextToken@ with the value of the copied string.
+    -- Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVocabularyFilters' 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', 'listVocabularyFilters_maxResults' - The maximum number of custom vocabulary filters to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+--
+-- 'nameContains', 'listVocabularyFilters_nameContains' - Returns only the custom vocabulary filters that contain the specified
+-- string. The search is not case sensitive.
+--
+-- 'nextToken', 'listVocabularyFilters_nextToken' - If your @ListVocabularyFilters@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+newListVocabularyFilters ::
+  ListVocabularyFilters
+newListVocabularyFilters =
+  ListVocabularyFilters'
+    { maxResults =
+        Prelude.Nothing,
+      nameContains = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of custom vocabulary filters to return in each page
+-- of results. If there are fewer results than the value that you specify,
+-- only the actual results are returned. If you don\'t specify a value, a
+-- default of 5 is used.
+listVocabularyFilters_maxResults :: Lens.Lens' ListVocabularyFilters (Prelude.Maybe Prelude.Natural)
+listVocabularyFilters_maxResults = Lens.lens (\ListVocabularyFilters' {maxResults} -> maxResults) (\s@ListVocabularyFilters' {} a -> s {maxResults = a} :: ListVocabularyFilters)
+
+-- | Returns only the custom vocabulary filters that contain the specified
+-- string. The search is not case sensitive.
+listVocabularyFilters_nameContains :: Lens.Lens' ListVocabularyFilters (Prelude.Maybe Prelude.Text)
+listVocabularyFilters_nameContains = Lens.lens (\ListVocabularyFilters' {nameContains} -> nameContains) (\s@ListVocabularyFilters' {} a -> s {nameContains = a} :: ListVocabularyFilters)
+
+-- | If your @ListVocabularyFilters@ request returns more results than can be
+-- displayed, @NextToken@ is displayed in the response with an associated
+-- string. To get the next page of results, copy this string and repeat
+-- your request, including @NextToken@ with the value of the copied string.
+-- Repeat as needed to view all your results.
+listVocabularyFilters_nextToken :: Lens.Lens' ListVocabularyFilters (Prelude.Maybe Prelude.Text)
+listVocabularyFilters_nextToken = Lens.lens (\ListVocabularyFilters' {nextToken} -> nextToken) (\s@ListVocabularyFilters' {} a -> s {nextToken = a} :: ListVocabularyFilters)
+
+instance Core.AWSRequest ListVocabularyFilters where
+  type
+    AWSResponse ListVocabularyFilters =
+      ListVocabularyFiltersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListVocabularyFiltersResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> ( x
+                            Data..?> "VocabularyFilters"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListVocabularyFilters where
+  hashWithSalt _salt ListVocabularyFilters' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nameContains
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListVocabularyFilters where
+  rnf ListVocabularyFilters' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nameContains
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListVocabularyFilters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.ListVocabularyFilters" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListVocabularyFilters where
+  toJSON ListVocabularyFilters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxResults" Data..=) Prelude.<$> maxResults,
+            ("NameContains" Data..=) Prelude.<$> nameContains,
+            ("NextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListVocabularyFilters where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListVocabularyFilters where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListVocabularyFiltersResponse' smart constructor.
+data ListVocabularyFiltersResponse = ListVocabularyFiltersResponse'
+  { -- | If @NextToken@ is present in your response, it indicates that not all
+    -- results are displayed. To view the next set of results, copy the string
+    -- associated with the @NextToken@ parameter in your results output, then
+    -- run your request again including @NextToken@ with the value of the
+    -- copied string. Repeat as needed to view all your results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Provides information about the custom vocabulary filters that match the
+    -- criteria specified in your request.
+    vocabularyFilters :: Prelude.Maybe [VocabularyFilterInfo],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListVocabularyFiltersResponse' 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', 'listVocabularyFiltersResponse_nextToken' - If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+--
+-- 'vocabularyFilters', 'listVocabularyFiltersResponse_vocabularyFilters' - Provides information about the custom vocabulary filters that match the
+-- criteria specified in your request.
+--
+-- 'httpStatus', 'listVocabularyFiltersResponse_httpStatus' - The response's http status code.
+newListVocabularyFiltersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListVocabularyFiltersResponse
+newListVocabularyFiltersResponse pHttpStatus_ =
+  ListVocabularyFiltersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      vocabularyFilters = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If @NextToken@ is present in your response, it indicates that not all
+-- results are displayed. To view the next set of results, copy the string
+-- associated with the @NextToken@ parameter in your results output, then
+-- run your request again including @NextToken@ with the value of the
+-- copied string. Repeat as needed to view all your results.
+listVocabularyFiltersResponse_nextToken :: Lens.Lens' ListVocabularyFiltersResponse (Prelude.Maybe Prelude.Text)
+listVocabularyFiltersResponse_nextToken = Lens.lens (\ListVocabularyFiltersResponse' {nextToken} -> nextToken) (\s@ListVocabularyFiltersResponse' {} a -> s {nextToken = a} :: ListVocabularyFiltersResponse)
+
+-- | Provides information about the custom vocabulary filters that match the
+-- criteria specified in your request.
+listVocabularyFiltersResponse_vocabularyFilters :: Lens.Lens' ListVocabularyFiltersResponse (Prelude.Maybe [VocabularyFilterInfo])
+listVocabularyFiltersResponse_vocabularyFilters = Lens.lens (\ListVocabularyFiltersResponse' {vocabularyFilters} -> vocabularyFilters) (\s@ListVocabularyFiltersResponse' {} a -> s {vocabularyFilters = a} :: ListVocabularyFiltersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listVocabularyFiltersResponse_httpStatus :: Lens.Lens' ListVocabularyFiltersResponse Prelude.Int
+listVocabularyFiltersResponse_httpStatus = Lens.lens (\ListVocabularyFiltersResponse' {httpStatus} -> httpStatus) (\s@ListVocabularyFiltersResponse' {} a -> s {httpStatus = a} :: ListVocabularyFiltersResponse)
+
+instance Prelude.NFData ListVocabularyFiltersResponse where
+  rnf ListVocabularyFiltersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf vocabularyFilters
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/StartCallAnalyticsJob.hs b/gen/Amazonka/Transcribe/StartCallAnalyticsJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/StartCallAnalyticsJob.hs
@@ -0,0 +1,536 @@
+{-# 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.Transcribe.StartCallAnalyticsJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Transcribes the audio from a customer service call and applies any
+-- additional Request Parameters you choose to include in your request.
+--
+-- In addition to many standard transcription features, Call Analytics
+-- provides you with call characteristics, call summarization, speaker
+-- sentiment, and optional redaction of your text transcript and your audio
+-- file. You can also apply custom categories to flag specified conditions.
+-- To learn more about these features and insights, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/call-analytics.html Analyzing call center audio with Call Analytics>.
+--
+-- If you want to apply categories to your Call Analytics job, you must
+-- create them before submitting your job request. Categories cannot be
+-- retroactively applied to a job. To create a new category, use the
+-- operation. To learn more about Call Analytics categories, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html Creating categories for batch transcriptions>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-stream.html Creating categories for streaming transcriptions>.
+--
+-- To make a @StartCallAnalyticsJob@ request, you must first upload your
+-- media file into an Amazon S3 bucket; you can then specify the Amazon S3
+-- location of the file using the @Media@ parameter.
+--
+-- You must include the following parameters in your
+-- @StartCallAnalyticsJob@ request:
+--
+-- -   @region@: The Amazon Web Services Region where you are making your
+--     request. For a list of Amazon Web Services Regions supported with
+--     Amazon Transcribe, refer to
+--     <https://docs.aws.amazon.com/general/latest/gr/transcribe.html Amazon Transcribe endpoints and quotas>.
+--
+-- -   @CallAnalyticsJobName@: A custom name that you create for your
+--     transcription job that\'s unique within your Amazon Web Services
+--     account.
+--
+-- -   @DataAccessRoleArn@: The Amazon Resource Name (ARN) of an IAM role
+--     that has permissions to access the Amazon S3 bucket that contains
+--     your input files.
+--
+-- -   @Media@ (@MediaFileUri@ or @RedactedMediaFileUri@): The Amazon S3
+--     location of your media file.
+--
+-- With Call Analytics, you can redact the audio contained in your media
+-- file by including @RedactedMediaFileUri@, instead of @MediaFileUri@, to
+-- specify the location of your input audio. If you choose to redact your
+-- audio, you can find your redacted media at the location specified in the
+-- @RedactedMediaFileUri@ field of your response.
+module Amazonka.Transcribe.StartCallAnalyticsJob
+  ( -- * Creating a Request
+    StartCallAnalyticsJob (..),
+    newStartCallAnalyticsJob,
+
+    -- * Request Lenses
+    startCallAnalyticsJob_channelDefinitions,
+    startCallAnalyticsJob_dataAccessRoleArn,
+    startCallAnalyticsJob_outputEncryptionKMSKeyId,
+    startCallAnalyticsJob_outputLocation,
+    startCallAnalyticsJob_settings,
+    startCallAnalyticsJob_callAnalyticsJobName,
+    startCallAnalyticsJob_media,
+
+    -- * Destructuring the Response
+    StartCallAnalyticsJobResponse (..),
+    newStartCallAnalyticsJobResponse,
+
+    -- * Response Lenses
+    startCallAnalyticsJobResponse_callAnalyticsJob,
+    startCallAnalyticsJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newStartCallAnalyticsJob' smart constructor.
+data StartCallAnalyticsJob = StartCallAnalyticsJob'
+  { -- | Makes it possible to specify which speaker is on which channel. For
+    -- example, if your agent is the first participant to speak, you would set
+    -- @ChannelId@ to @0@ (to indicate the first channel) and @ParticipantRole@
+    -- to @AGENT@ (to indicate that it\'s the agent speaking).
+    channelDefinitions :: Prelude.Maybe (Prelude.NonEmpty ChannelDefinition),
+    -- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+    -- access the Amazon S3 bucket that contains your input files. If the role
+    -- that you specify doesn’t have the appropriate permissions to access the
+    -- specified Amazon S3 location, your request fails.
+    --
+    -- IAM role ARNs have the format
+    -- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+    -- @arn:aws:iam::111122223333:role\/Admin@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+    dataAccessRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key you want to use to encrypt your Call Analytics output.
+    --
+    -- If using a key located in the __current__ Amazon Web Services account,
+    -- you can specify your KMS key in one of four ways:
+    --
+    -- 1.  Use the KMS key ID itself. For example,
+    --     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+    --
+    -- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 4.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If using a key located in a __different__ Amazon Web Services account
+    -- than the current Amazon Web Services account, you can specify your KMS
+    -- key in one of two ways:
+    --
+    -- 1.  Use the ARN for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If you don\'t specify an encryption key, your output is encrypted with
+    -- the default Amazon S3 key (SSE-S3).
+    --
+    -- If you specify a KMS key to encrypt your output, you must also specify
+    -- an output location using the @OutputLocation@ parameter.
+    --
+    -- Note that the user making the request must have permission to use the
+    -- specified KMS key.
+    outputEncryptionKMSKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 location where you want your Call Analytics transcription
+    -- output stored. You can use any of the following formats to specify the
+    -- output location:
+    --
+    -- 1.  s3:\/\/DOC-EXAMPLE-BUCKET
+    --
+    -- 2.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/
+    --
+    -- 3.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/my-call-analytics-job.json
+    --
+    -- Unless you specify a file name (option 3), the name of your output file
+    -- has a default value that matches the name you specified for your
+    -- transcription job using the @CallAnalyticsJobName@ parameter.
+    --
+    -- You can specify a KMS key to encrypt your output using the
+    -- @OutputEncryptionKMSKeyId@ parameter. If you don\'t specify a KMS key,
+    -- Amazon Transcribe uses the default Amazon S3 key for server-side
+    -- encryption.
+    --
+    -- If you don\'t specify @OutputLocation@, your transcript is placed in a
+    -- service-managed Amazon S3 bucket and you are provided with a URI to
+    -- access your transcript.
+    outputLocation :: Prelude.Maybe Prelude.Text,
+    -- | Specify additional optional settings in your request, including content
+    -- redaction; allows you to apply custom language models, vocabulary
+    -- filters, and custom vocabularies to your Call Analytics job.
+    settings :: Prelude.Maybe CallAnalyticsJobSettings,
+    -- | A unique name, chosen by you, for your Call Analytics job.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new job
+    -- with the same name as an existing job, you get a @ConflictException@
+    -- error.
+    callAnalyticsJobName :: Prelude.Text,
+    -- | Describes the Amazon S3 location of the media file you want to use in
+    -- your Call Analytics request.
+    media :: Media
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartCallAnalyticsJob' 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:
+--
+-- 'channelDefinitions', 'startCallAnalyticsJob_channelDefinitions' - Makes it possible to specify which speaker is on which channel. For
+-- example, if your agent is the first participant to speak, you would set
+-- @ChannelId@ to @0@ (to indicate the first channel) and @ParticipantRole@
+-- to @AGENT@ (to indicate that it\'s the agent speaking).
+--
+-- 'dataAccessRoleArn', 'startCallAnalyticsJob_dataAccessRoleArn' - The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+--
+-- 'outputEncryptionKMSKeyId', 'startCallAnalyticsJob_outputEncryptionKMSKeyId' - The KMS key you want to use to encrypt your Call Analytics output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+--
+-- 'outputLocation', 'startCallAnalyticsJob_outputLocation' - The Amazon S3 location where you want your Call Analytics transcription
+-- output stored. You can use any of the following formats to specify the
+-- output location:
+--
+-- 1.  s3:\/\/DOC-EXAMPLE-BUCKET
+--
+-- 2.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/
+--
+-- 3.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/my-call-analytics-job.json
+--
+-- Unless you specify a file name (option 3), the name of your output file
+-- has a default value that matches the name you specified for your
+-- transcription job using the @CallAnalyticsJobName@ parameter.
+--
+-- You can specify a KMS key to encrypt your output using the
+-- @OutputEncryptionKMSKeyId@ parameter. If you don\'t specify a KMS key,
+-- Amazon Transcribe uses the default Amazon S3 key for server-side
+-- encryption.
+--
+-- If you don\'t specify @OutputLocation@, your transcript is placed in a
+-- service-managed Amazon S3 bucket and you are provided with a URI to
+-- access your transcript.
+--
+-- 'settings', 'startCallAnalyticsJob_settings' - Specify additional optional settings in your request, including content
+-- redaction; allows you to apply custom language models, vocabulary
+-- filters, and custom vocabularies to your Call Analytics job.
+--
+-- 'callAnalyticsJobName', 'startCallAnalyticsJob_callAnalyticsJobName' - A unique name, chosen by you, for your Call Analytics job.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+--
+-- 'media', 'startCallAnalyticsJob_media' - Describes the Amazon S3 location of the media file you want to use in
+-- your Call Analytics request.
+newStartCallAnalyticsJob ::
+  -- | 'callAnalyticsJobName'
+  Prelude.Text ->
+  -- | 'media'
+  Media ->
+  StartCallAnalyticsJob
+newStartCallAnalyticsJob
+  pCallAnalyticsJobName_
+  pMedia_ =
+    StartCallAnalyticsJob'
+      { channelDefinitions =
+          Prelude.Nothing,
+        dataAccessRoleArn = Prelude.Nothing,
+        outputEncryptionKMSKeyId = Prelude.Nothing,
+        outputLocation = Prelude.Nothing,
+        settings = Prelude.Nothing,
+        callAnalyticsJobName = pCallAnalyticsJobName_,
+        media = pMedia_
+      }
+
+-- | Makes it possible to specify which speaker is on which channel. For
+-- example, if your agent is the first participant to speak, you would set
+-- @ChannelId@ to @0@ (to indicate the first channel) and @ParticipantRole@
+-- to @AGENT@ (to indicate that it\'s the agent speaking).
+startCallAnalyticsJob_channelDefinitions :: Lens.Lens' StartCallAnalyticsJob (Prelude.Maybe (Prelude.NonEmpty ChannelDefinition))
+startCallAnalyticsJob_channelDefinitions = Lens.lens (\StartCallAnalyticsJob' {channelDefinitions} -> channelDefinitions) (\s@StartCallAnalyticsJob' {} a -> s {channelDefinitions = a} :: StartCallAnalyticsJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+startCallAnalyticsJob_dataAccessRoleArn :: Lens.Lens' StartCallAnalyticsJob (Prelude.Maybe Prelude.Text)
+startCallAnalyticsJob_dataAccessRoleArn = Lens.lens (\StartCallAnalyticsJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@StartCallAnalyticsJob' {} a -> s {dataAccessRoleArn = a} :: StartCallAnalyticsJob)
+
+-- | The KMS key you want to use to encrypt your Call Analytics output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+startCallAnalyticsJob_outputEncryptionKMSKeyId :: Lens.Lens' StartCallAnalyticsJob (Prelude.Maybe Prelude.Text)
+startCallAnalyticsJob_outputEncryptionKMSKeyId = Lens.lens (\StartCallAnalyticsJob' {outputEncryptionKMSKeyId} -> outputEncryptionKMSKeyId) (\s@StartCallAnalyticsJob' {} a -> s {outputEncryptionKMSKeyId = a} :: StartCallAnalyticsJob)
+
+-- | The Amazon S3 location where you want your Call Analytics transcription
+-- output stored. You can use any of the following formats to specify the
+-- output location:
+--
+-- 1.  s3:\/\/DOC-EXAMPLE-BUCKET
+--
+-- 2.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/
+--
+-- 3.  s3:\/\/DOC-EXAMPLE-BUCKET\/my-output-folder\/my-call-analytics-job.json
+--
+-- Unless you specify a file name (option 3), the name of your output file
+-- has a default value that matches the name you specified for your
+-- transcription job using the @CallAnalyticsJobName@ parameter.
+--
+-- You can specify a KMS key to encrypt your output using the
+-- @OutputEncryptionKMSKeyId@ parameter. If you don\'t specify a KMS key,
+-- Amazon Transcribe uses the default Amazon S3 key for server-side
+-- encryption.
+--
+-- If you don\'t specify @OutputLocation@, your transcript is placed in a
+-- service-managed Amazon S3 bucket and you are provided with a URI to
+-- access your transcript.
+startCallAnalyticsJob_outputLocation :: Lens.Lens' StartCallAnalyticsJob (Prelude.Maybe Prelude.Text)
+startCallAnalyticsJob_outputLocation = Lens.lens (\StartCallAnalyticsJob' {outputLocation} -> outputLocation) (\s@StartCallAnalyticsJob' {} a -> s {outputLocation = a} :: StartCallAnalyticsJob)
+
+-- | Specify additional optional settings in your request, including content
+-- redaction; allows you to apply custom language models, vocabulary
+-- filters, and custom vocabularies to your Call Analytics job.
+startCallAnalyticsJob_settings :: Lens.Lens' StartCallAnalyticsJob (Prelude.Maybe CallAnalyticsJobSettings)
+startCallAnalyticsJob_settings = Lens.lens (\StartCallAnalyticsJob' {settings} -> settings) (\s@StartCallAnalyticsJob' {} a -> s {settings = a} :: StartCallAnalyticsJob)
+
+-- | A unique name, chosen by you, for your Call Analytics job.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+startCallAnalyticsJob_callAnalyticsJobName :: Lens.Lens' StartCallAnalyticsJob Prelude.Text
+startCallAnalyticsJob_callAnalyticsJobName = Lens.lens (\StartCallAnalyticsJob' {callAnalyticsJobName} -> callAnalyticsJobName) (\s@StartCallAnalyticsJob' {} a -> s {callAnalyticsJobName = a} :: StartCallAnalyticsJob)
+
+-- | Describes the Amazon S3 location of the media file you want to use in
+-- your Call Analytics request.
+startCallAnalyticsJob_media :: Lens.Lens' StartCallAnalyticsJob Media
+startCallAnalyticsJob_media = Lens.lens (\StartCallAnalyticsJob' {media} -> media) (\s@StartCallAnalyticsJob' {} a -> s {media = a} :: StartCallAnalyticsJob)
+
+instance Core.AWSRequest StartCallAnalyticsJob where
+  type
+    AWSResponse StartCallAnalyticsJob =
+      StartCallAnalyticsJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartCallAnalyticsJobResponse'
+            Prelude.<$> (x Data..?> "CallAnalyticsJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartCallAnalyticsJob where
+  hashWithSalt _salt StartCallAnalyticsJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelDefinitions
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` outputEncryptionKMSKeyId
+      `Prelude.hashWithSalt` outputLocation
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` callAnalyticsJobName
+      `Prelude.hashWithSalt` media
+
+instance Prelude.NFData StartCallAnalyticsJob where
+  rnf StartCallAnalyticsJob' {..} =
+    Prelude.rnf channelDefinitions
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf outputEncryptionKMSKeyId
+      `Prelude.seq` Prelude.rnf outputLocation
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf callAnalyticsJobName
+      `Prelude.seq` Prelude.rnf media
+
+instance Data.ToHeaders StartCallAnalyticsJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.StartCallAnalyticsJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartCallAnalyticsJob where
+  toJSON StartCallAnalyticsJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ChannelDefinitions" Data..=)
+              Prelude.<$> channelDefinitions,
+            ("DataAccessRoleArn" Data..=)
+              Prelude.<$> dataAccessRoleArn,
+            ("OutputEncryptionKMSKeyId" Data..=)
+              Prelude.<$> outputEncryptionKMSKeyId,
+            ("OutputLocation" Data..=)
+              Prelude.<$> outputLocation,
+            ("Settings" Data..=) Prelude.<$> settings,
+            Prelude.Just
+              ( "CallAnalyticsJobName"
+                  Data..= callAnalyticsJobName
+              ),
+            Prelude.Just ("Media" Data..= media)
+          ]
+      )
+
+instance Data.ToPath StartCallAnalyticsJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartCallAnalyticsJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartCallAnalyticsJobResponse' smart constructor.
+data StartCallAnalyticsJobResponse = StartCallAnalyticsJobResponse'
+  { -- | Provides detailed information about the current Call Analytics job,
+    -- including job status and, if applicable, failure reason.
+    callAnalyticsJob :: Prelude.Maybe CallAnalyticsJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartCallAnalyticsJobResponse' 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:
+--
+-- 'callAnalyticsJob', 'startCallAnalyticsJobResponse_callAnalyticsJob' - Provides detailed information about the current Call Analytics job,
+-- including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'startCallAnalyticsJobResponse_httpStatus' - The response's http status code.
+newStartCallAnalyticsJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartCallAnalyticsJobResponse
+newStartCallAnalyticsJobResponse pHttpStatus_ =
+  StartCallAnalyticsJobResponse'
+    { callAnalyticsJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the current Call Analytics job,
+-- including job status and, if applicable, failure reason.
+startCallAnalyticsJobResponse_callAnalyticsJob :: Lens.Lens' StartCallAnalyticsJobResponse (Prelude.Maybe CallAnalyticsJob)
+startCallAnalyticsJobResponse_callAnalyticsJob = Lens.lens (\StartCallAnalyticsJobResponse' {callAnalyticsJob} -> callAnalyticsJob) (\s@StartCallAnalyticsJobResponse' {} a -> s {callAnalyticsJob = a} :: StartCallAnalyticsJobResponse)
+
+-- | The response's http status code.
+startCallAnalyticsJobResponse_httpStatus :: Lens.Lens' StartCallAnalyticsJobResponse Prelude.Int
+startCallAnalyticsJobResponse_httpStatus = Lens.lens (\StartCallAnalyticsJobResponse' {httpStatus} -> httpStatus) (\s@StartCallAnalyticsJobResponse' {} a -> s {httpStatus = a} :: StartCallAnalyticsJobResponse)
+
+instance Prelude.NFData StartCallAnalyticsJobResponse where
+  rnf StartCallAnalyticsJobResponse' {..} =
+    Prelude.rnf callAnalyticsJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/StartMedicalTranscriptionJob.hs b/gen/Amazonka/Transcribe/StartMedicalTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/StartMedicalTranscriptionJob.hs
@@ -0,0 +1,778 @@
+{-# 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.Transcribe.StartMedicalTranscriptionJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Transcribes the audio from a medical dictation or conversation and
+-- applies any additional Request Parameters you choose to include in your
+-- request.
+--
+-- In addition to many standard transcription features, Amazon Transcribe
+-- Medical provides you with a robust medical vocabulary and, optionally,
+-- content identification, which adds flags to personal health information
+-- (PHI). To learn more about these features, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-it-works-med.html How Amazon Transcribe Medical works>.
+--
+-- To make a @StartMedicalTranscriptionJob@ request, you must first upload
+-- your media file into an Amazon S3 bucket; you can then specify the S3
+-- location of the file using the @Media@ parameter.
+--
+-- You must include the following parameters in your
+-- @StartMedicalTranscriptionJob@ request:
+--
+-- -   @region@: The Amazon Web Services Region where you are making your
+--     request. For a list of Amazon Web Services Regions supported with
+--     Amazon Transcribe, refer to
+--     <https://docs.aws.amazon.com/general/latest/gr/transcribe.html Amazon Transcribe endpoints and quotas>.
+--
+-- -   @MedicalTranscriptionJobName@: A custom name you create for your
+--     transcription job that is unique within your Amazon Web Services
+--     account.
+--
+-- -   @Media@ (@MediaFileUri@): The Amazon S3 location of your media file.
+--
+-- -   @LanguageCode@: This must be @en-US@.
+--
+-- -   @OutputBucketName@: The Amazon S3 bucket where you want your
+--     transcript stored. If you want your output stored in a sub-folder of
+--     this bucket, you must also include @OutputKey@.
+--
+-- -   @Specialty@: This must be @PRIMARYCARE@.
+--
+-- -   @Type@: Choose whether your audio is a conversation or a dictation.
+module Amazonka.Transcribe.StartMedicalTranscriptionJob
+  ( -- * Creating a Request
+    StartMedicalTranscriptionJob (..),
+    newStartMedicalTranscriptionJob,
+
+    -- * Request Lenses
+    startMedicalTranscriptionJob_contentIdentificationType,
+    startMedicalTranscriptionJob_kmsEncryptionContext,
+    startMedicalTranscriptionJob_mediaFormat,
+    startMedicalTranscriptionJob_mediaSampleRateHertz,
+    startMedicalTranscriptionJob_outputEncryptionKMSKeyId,
+    startMedicalTranscriptionJob_outputKey,
+    startMedicalTranscriptionJob_settings,
+    startMedicalTranscriptionJob_tags,
+    startMedicalTranscriptionJob_medicalTranscriptionJobName,
+    startMedicalTranscriptionJob_languageCode,
+    startMedicalTranscriptionJob_media,
+    startMedicalTranscriptionJob_outputBucketName,
+    startMedicalTranscriptionJob_specialty,
+    startMedicalTranscriptionJob_type,
+
+    -- * Destructuring the Response
+    StartMedicalTranscriptionJobResponse (..),
+    newStartMedicalTranscriptionJobResponse,
+
+    -- * Response Lenses
+    startMedicalTranscriptionJobResponse_medicalTranscriptionJob,
+    startMedicalTranscriptionJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newStartMedicalTranscriptionJob' smart constructor.
+data StartMedicalTranscriptionJob = StartMedicalTranscriptionJob'
+  { -- | Labels all personal health information (PHI) identified in your
+    -- transcript. For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+    contentIdentificationType :: Prelude.Maybe MedicalContentIdentificationType,
+    -- | A map of plain text, non-secret key:value pairs, known as encryption
+    -- context pairs, that provide an added layer of security for your data.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+    -- and
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+    kmsEncryptionContext :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Specify the format of your input media file.
+    mediaFormat :: Prelude.Maybe MediaFormat,
+    -- | The sample rate, in hertz, of the audio track in your input media file.
+    --
+    -- If you don\'t specify the media sample rate, Amazon Transcribe Medical
+    -- determines it for you. If you specify the sample rate, it must match the
+    -- rate detected by Amazon Transcribe Medical; if there\'s a mismatch
+    -- between the value that you specify and the value detected, your job
+    -- fails. Therefore, in most cases, it\'s advised to omit
+    -- @MediaSampleRateHertz@ and let Amazon Transcribe Medical determine the
+    -- sample rate.
+    mediaSampleRateHertz :: Prelude.Maybe Prelude.Natural,
+    -- | The KMS key you want to use to encrypt your medical transcription
+    -- output.
+    --
+    -- If using a key located in the __current__ Amazon Web Services account,
+    -- you can specify your KMS key in one of four ways:
+    --
+    -- 1.  Use the KMS key ID itself. For example,
+    --     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+    --
+    -- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 4.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If using a key located in a __different__ Amazon Web Services account
+    -- than the current Amazon Web Services account, you can specify your KMS
+    -- key in one of two ways:
+    --
+    -- 1.  Use the ARN for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If you don\'t specify an encryption key, your output is encrypted with
+    -- the default Amazon S3 key (SSE-S3).
+    --
+    -- If you specify a KMS key to encrypt your output, you must also specify
+    -- an output location using the @OutputLocation@ parameter.
+    --
+    -- Note that the user making the request must have permission to use the
+    -- specified KMS key.
+    outputEncryptionKMSKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Use in combination with @OutputBucketName@ to specify the output
+    -- location of your transcript and, optionally, a unique name for your
+    -- output file. The default name for your transcription output is the same
+    -- as the name you specified for your medical transcription job
+    -- (@MedicalTranscriptionJobName@).
+    --
+    -- Here are some examples of how you can use @OutputKey@:
+    --
+    -- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+    --     \'my-transcript.json\' as the @OutputKey@, your transcription output
+    --     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+    --
+    -- -   If you specify \'my-first-transcription\' as the
+    --     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+    --     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+    --     transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+    --
+    -- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+    --     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+    --     transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+    --
+    -- -   If you specify \'my-first-transcription\' as the
+    --     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+    --     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+    --     @OutputKey@, your transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+    --
+    -- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+    -- exist, one is created for you.
+    outputKey :: Prelude.Maybe Prelude.Text,
+    -- | Specify additional optional settings in your request, including channel
+    -- identification, alternative transcriptions, and speaker partitioning.
+    -- You can use that to apply custom vocabularies to your transcription job.
+    settings :: Prelude.Maybe MedicalTranscriptionSetting,
+    -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new medical transcription job at the time you start this new job.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | A unique name, chosen by you, for your medical transcription job. The
+    -- name that you specify is also used as the default name of your
+    -- transcription output file. If you want to specify a different name for
+    -- your transcription output, use the @OutputKey@ parameter.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new job
+    -- with the same name as an existing job, you get a @ConflictException@
+    -- error.
+    medicalTranscriptionJobName :: Prelude.Text,
+    -- | The language code that represents the language spoken in the input media
+    -- file. US English (@en-US@) is the only valid value for medical
+    -- transcription jobs. Any other value you enter for language code results
+    -- in a @BadRequestException@ error.
+    languageCode :: LanguageCode,
+    media :: Media,
+    -- | The name of the Amazon S3 bucket where you want your medical
+    -- transcription output stored. Do not include the @S3:\/\/@ prefix of the
+    -- specified bucket.
+    --
+    -- If you want your output to go to a sub-folder of this bucket, specify it
+    -- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+    -- name of a bucket.
+    --
+    -- For example, if you want your output stored in
+    -- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+    -- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+    -- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+    -- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+    --
+    -- Note that Amazon Transcribe must have permission to use the specified
+    -- location. You can change Amazon S3 permissions using the
+    -- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+    -- See also
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+    outputBucketName :: Prelude.Text,
+    -- | Specify the predominant medical specialty represented in your media. For
+    -- batch transcriptions, @PRIMARYCARE@ is the only valid value. If you
+    -- require additional specialties, refer to .
+    specialty :: Specialty,
+    -- | Specify whether your input media contains only one person (@DICTATION@)
+    -- or contains a conversation between two people (@CONVERSATION@).
+    --
+    -- For example, @DICTATION@ could be used for a medical professional
+    -- wanting to transcribe voice memos; @CONVERSATION@ could be used for
+    -- transcribing the doctor-patient dialogue during the patient\'s office
+    -- visit.
+    type' :: Type
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartMedicalTranscriptionJob' 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:
+--
+-- 'contentIdentificationType', 'startMedicalTranscriptionJob_contentIdentificationType' - Labels all personal health information (PHI) identified in your
+-- transcript. For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+--
+-- 'kmsEncryptionContext', 'startMedicalTranscriptionJob_kmsEncryptionContext' - A map of plain text, non-secret key:value pairs, known as encryption
+-- context pairs, that provide an added layer of security for your data.
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+--
+-- 'mediaFormat', 'startMedicalTranscriptionJob_mediaFormat' - Specify the format of your input media file.
+--
+-- 'mediaSampleRateHertz', 'startMedicalTranscriptionJob_mediaSampleRateHertz' - The sample rate, in hertz, of the audio track in your input media file.
+--
+-- If you don\'t specify the media sample rate, Amazon Transcribe Medical
+-- determines it for you. If you specify the sample rate, it must match the
+-- rate detected by Amazon Transcribe Medical; if there\'s a mismatch
+-- between the value that you specify and the value detected, your job
+-- fails. Therefore, in most cases, it\'s advised to omit
+-- @MediaSampleRateHertz@ and let Amazon Transcribe Medical determine the
+-- sample rate.
+--
+-- 'outputEncryptionKMSKeyId', 'startMedicalTranscriptionJob_outputEncryptionKMSKeyId' - The KMS key you want to use to encrypt your medical transcription
+-- output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+--
+-- 'outputKey', 'startMedicalTranscriptionJob_outputKey' - Use in combination with @OutputBucketName@ to specify the output
+-- location of your transcript and, optionally, a unique name for your
+-- output file. The default name for your transcription output is the same
+-- as the name you specified for your medical transcription job
+-- (@MedicalTranscriptionJobName@).
+--
+-- Here are some examples of how you can use @OutputKey@:
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'my-transcript.json\' as the @OutputKey@, your transcription output
+--     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+--     @OutputKey@, your transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+--
+-- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+-- exist, one is created for you.
+--
+-- 'settings', 'startMedicalTranscriptionJob_settings' - Specify additional optional settings in your request, including channel
+-- identification, alternative transcriptions, and speaker partitioning.
+-- You can use that to apply custom vocabularies to your transcription job.
+--
+-- 'tags', 'startMedicalTranscriptionJob_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new medical transcription job at the time you start this new job.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'medicalTranscriptionJobName', 'startMedicalTranscriptionJob_medicalTranscriptionJobName' - A unique name, chosen by you, for your medical transcription job. The
+-- name that you specify is also used as the default name of your
+-- transcription output file. If you want to specify a different name for
+-- your transcription output, use the @OutputKey@ parameter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+--
+-- 'languageCode', 'startMedicalTranscriptionJob_languageCode' - The language code that represents the language spoken in the input media
+-- file. US English (@en-US@) is the only valid value for medical
+-- transcription jobs. Any other value you enter for language code results
+-- in a @BadRequestException@ error.
+--
+-- 'media', 'startMedicalTranscriptionJob_media' - Undocumented member.
+--
+-- 'outputBucketName', 'startMedicalTranscriptionJob_outputBucketName' - The name of the Amazon S3 bucket where you want your medical
+-- transcription output stored. Do not include the @S3:\/\/@ prefix of the
+-- specified bucket.
+--
+-- If you want your output to go to a sub-folder of this bucket, specify it
+-- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+-- name of a bucket.
+--
+-- For example, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+--
+-- Note that Amazon Transcribe must have permission to use the specified
+-- location. You can change Amazon S3 permissions using the
+-- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+-- See also
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+--
+-- 'specialty', 'startMedicalTranscriptionJob_specialty' - Specify the predominant medical specialty represented in your media. For
+-- batch transcriptions, @PRIMARYCARE@ is the only valid value. If you
+-- require additional specialties, refer to .
+--
+-- 'type'', 'startMedicalTranscriptionJob_type' - Specify whether your input media contains only one person (@DICTATION@)
+-- or contains a conversation between two people (@CONVERSATION@).
+--
+-- For example, @DICTATION@ could be used for a medical professional
+-- wanting to transcribe voice memos; @CONVERSATION@ could be used for
+-- transcribing the doctor-patient dialogue during the patient\'s office
+-- visit.
+newStartMedicalTranscriptionJob ::
+  -- | 'medicalTranscriptionJobName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  -- | 'media'
+  Media ->
+  -- | 'outputBucketName'
+  Prelude.Text ->
+  -- | 'specialty'
+  Specialty ->
+  -- | 'type''
+  Type ->
+  StartMedicalTranscriptionJob
+newStartMedicalTranscriptionJob
+  pMedicalTranscriptionJobName_
+  pLanguageCode_
+  pMedia_
+  pOutputBucketName_
+  pSpecialty_
+  pType_ =
+    StartMedicalTranscriptionJob'
+      { contentIdentificationType =
+          Prelude.Nothing,
+        kmsEncryptionContext = Prelude.Nothing,
+        mediaFormat = Prelude.Nothing,
+        mediaSampleRateHertz = Prelude.Nothing,
+        outputEncryptionKMSKeyId = Prelude.Nothing,
+        outputKey = Prelude.Nothing,
+        settings = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        medicalTranscriptionJobName =
+          pMedicalTranscriptionJobName_,
+        languageCode = pLanguageCode_,
+        media = pMedia_,
+        outputBucketName = pOutputBucketName_,
+        specialty = pSpecialty_,
+        type' = pType_
+      }
+
+-- | Labels all personal health information (PHI) identified in your
+-- transcript. For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+startMedicalTranscriptionJob_contentIdentificationType :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe MedicalContentIdentificationType)
+startMedicalTranscriptionJob_contentIdentificationType = Lens.lens (\StartMedicalTranscriptionJob' {contentIdentificationType} -> contentIdentificationType) (\s@StartMedicalTranscriptionJob' {} a -> s {contentIdentificationType = a} :: StartMedicalTranscriptionJob)
+
+-- | A map of plain text, non-secret key:value pairs, known as encryption
+-- context pairs, that provide an added layer of security for your data.
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+startMedicalTranscriptionJob_kmsEncryptionContext :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+startMedicalTranscriptionJob_kmsEncryptionContext = Lens.lens (\StartMedicalTranscriptionJob' {kmsEncryptionContext} -> kmsEncryptionContext) (\s@StartMedicalTranscriptionJob' {} a -> s {kmsEncryptionContext = a} :: StartMedicalTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the format of your input media file.
+startMedicalTranscriptionJob_mediaFormat :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe MediaFormat)
+startMedicalTranscriptionJob_mediaFormat = Lens.lens (\StartMedicalTranscriptionJob' {mediaFormat} -> mediaFormat) (\s@StartMedicalTranscriptionJob' {} a -> s {mediaFormat = a} :: StartMedicalTranscriptionJob)
+
+-- | The sample rate, in hertz, of the audio track in your input media file.
+--
+-- If you don\'t specify the media sample rate, Amazon Transcribe Medical
+-- determines it for you. If you specify the sample rate, it must match the
+-- rate detected by Amazon Transcribe Medical; if there\'s a mismatch
+-- between the value that you specify and the value detected, your job
+-- fails. Therefore, in most cases, it\'s advised to omit
+-- @MediaSampleRateHertz@ and let Amazon Transcribe Medical determine the
+-- sample rate.
+startMedicalTranscriptionJob_mediaSampleRateHertz :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe Prelude.Natural)
+startMedicalTranscriptionJob_mediaSampleRateHertz = Lens.lens (\StartMedicalTranscriptionJob' {mediaSampleRateHertz} -> mediaSampleRateHertz) (\s@StartMedicalTranscriptionJob' {} a -> s {mediaSampleRateHertz = a} :: StartMedicalTranscriptionJob)
+
+-- | The KMS key you want to use to encrypt your medical transcription
+-- output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+startMedicalTranscriptionJob_outputEncryptionKMSKeyId :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe Prelude.Text)
+startMedicalTranscriptionJob_outputEncryptionKMSKeyId = Lens.lens (\StartMedicalTranscriptionJob' {outputEncryptionKMSKeyId} -> outputEncryptionKMSKeyId) (\s@StartMedicalTranscriptionJob' {} a -> s {outputEncryptionKMSKeyId = a} :: StartMedicalTranscriptionJob)
+
+-- | Use in combination with @OutputBucketName@ to specify the output
+-- location of your transcript and, optionally, a unique name for your
+-- output file. The default name for your transcription output is the same
+-- as the name you specified for your medical transcription job
+-- (@MedicalTranscriptionJobName@).
+--
+-- Here are some examples of how you can use @OutputKey@:
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'my-transcript.json\' as the @OutputKey@, your transcription output
+--     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @MedicalTranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+--     @OutputKey@, your transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+--
+-- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+-- exist, one is created for you.
+startMedicalTranscriptionJob_outputKey :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe Prelude.Text)
+startMedicalTranscriptionJob_outputKey = Lens.lens (\StartMedicalTranscriptionJob' {outputKey} -> outputKey) (\s@StartMedicalTranscriptionJob' {} a -> s {outputKey = a} :: StartMedicalTranscriptionJob)
+
+-- | Specify additional optional settings in your request, including channel
+-- identification, alternative transcriptions, and speaker partitioning.
+-- You can use that to apply custom vocabularies to your transcription job.
+startMedicalTranscriptionJob_settings :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe MedicalTranscriptionSetting)
+startMedicalTranscriptionJob_settings = Lens.lens (\StartMedicalTranscriptionJob' {settings} -> settings) (\s@StartMedicalTranscriptionJob' {} a -> s {settings = a} :: StartMedicalTranscriptionJob)
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new medical transcription job at the time you start this new job.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+startMedicalTranscriptionJob_tags :: Lens.Lens' StartMedicalTranscriptionJob (Prelude.Maybe (Prelude.NonEmpty Tag))
+startMedicalTranscriptionJob_tags = Lens.lens (\StartMedicalTranscriptionJob' {tags} -> tags) (\s@StartMedicalTranscriptionJob' {} a -> s {tags = a} :: StartMedicalTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique name, chosen by you, for your medical transcription job. The
+-- name that you specify is also used as the default name of your
+-- transcription output file. If you want to specify a different name for
+-- your transcription output, use the @OutputKey@ parameter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+startMedicalTranscriptionJob_medicalTranscriptionJobName :: Lens.Lens' StartMedicalTranscriptionJob Prelude.Text
+startMedicalTranscriptionJob_medicalTranscriptionJobName = Lens.lens (\StartMedicalTranscriptionJob' {medicalTranscriptionJobName} -> medicalTranscriptionJobName) (\s@StartMedicalTranscriptionJob' {} a -> s {medicalTranscriptionJobName = a} :: StartMedicalTranscriptionJob)
+
+-- | The language code that represents the language spoken in the input media
+-- file. US English (@en-US@) is the only valid value for medical
+-- transcription jobs. Any other value you enter for language code results
+-- in a @BadRequestException@ error.
+startMedicalTranscriptionJob_languageCode :: Lens.Lens' StartMedicalTranscriptionJob LanguageCode
+startMedicalTranscriptionJob_languageCode = Lens.lens (\StartMedicalTranscriptionJob' {languageCode} -> languageCode) (\s@StartMedicalTranscriptionJob' {} a -> s {languageCode = a} :: StartMedicalTranscriptionJob)
+
+-- | Undocumented member.
+startMedicalTranscriptionJob_media :: Lens.Lens' StartMedicalTranscriptionJob Media
+startMedicalTranscriptionJob_media = Lens.lens (\StartMedicalTranscriptionJob' {media} -> media) (\s@StartMedicalTranscriptionJob' {} a -> s {media = a} :: StartMedicalTranscriptionJob)
+
+-- | The name of the Amazon S3 bucket where you want your medical
+-- transcription output stored. Do not include the @S3:\/\/@ prefix of the
+-- specified bucket.
+--
+-- If you want your output to go to a sub-folder of this bucket, specify it
+-- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+-- name of a bucket.
+--
+-- For example, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+--
+-- Note that Amazon Transcribe must have permission to use the specified
+-- location. You can change Amazon S3 permissions using the
+-- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+-- See also
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+startMedicalTranscriptionJob_outputBucketName :: Lens.Lens' StartMedicalTranscriptionJob Prelude.Text
+startMedicalTranscriptionJob_outputBucketName = Lens.lens (\StartMedicalTranscriptionJob' {outputBucketName} -> outputBucketName) (\s@StartMedicalTranscriptionJob' {} a -> s {outputBucketName = a} :: StartMedicalTranscriptionJob)
+
+-- | Specify the predominant medical specialty represented in your media. For
+-- batch transcriptions, @PRIMARYCARE@ is the only valid value. If you
+-- require additional specialties, refer to .
+startMedicalTranscriptionJob_specialty :: Lens.Lens' StartMedicalTranscriptionJob Specialty
+startMedicalTranscriptionJob_specialty = Lens.lens (\StartMedicalTranscriptionJob' {specialty} -> specialty) (\s@StartMedicalTranscriptionJob' {} a -> s {specialty = a} :: StartMedicalTranscriptionJob)
+
+-- | Specify whether your input media contains only one person (@DICTATION@)
+-- or contains a conversation between two people (@CONVERSATION@).
+--
+-- For example, @DICTATION@ could be used for a medical professional
+-- wanting to transcribe voice memos; @CONVERSATION@ could be used for
+-- transcribing the doctor-patient dialogue during the patient\'s office
+-- visit.
+startMedicalTranscriptionJob_type :: Lens.Lens' StartMedicalTranscriptionJob Type
+startMedicalTranscriptionJob_type = Lens.lens (\StartMedicalTranscriptionJob' {type'} -> type') (\s@StartMedicalTranscriptionJob' {} a -> s {type' = a} :: StartMedicalTranscriptionJob)
+
+instance Core.AWSRequest StartMedicalTranscriptionJob where
+  type
+    AWSResponse StartMedicalTranscriptionJob =
+      StartMedicalTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartMedicalTranscriptionJobResponse'
+            Prelude.<$> (x Data..?> "MedicalTranscriptionJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    StartMedicalTranscriptionJob
+  where
+  hashWithSalt _salt StartMedicalTranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` contentIdentificationType
+      `Prelude.hashWithSalt` kmsEncryptionContext
+      `Prelude.hashWithSalt` mediaFormat
+      `Prelude.hashWithSalt` mediaSampleRateHertz
+      `Prelude.hashWithSalt` outputEncryptionKMSKeyId
+      `Prelude.hashWithSalt` outputKey
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` medicalTranscriptionJobName
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` media
+      `Prelude.hashWithSalt` outputBucketName
+      `Prelude.hashWithSalt` specialty
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData StartMedicalTranscriptionJob where
+  rnf StartMedicalTranscriptionJob' {..} =
+    Prelude.rnf contentIdentificationType
+      `Prelude.seq` Prelude.rnf kmsEncryptionContext
+      `Prelude.seq` Prelude.rnf mediaFormat
+      `Prelude.seq` Prelude.rnf mediaSampleRateHertz
+      `Prelude.seq` Prelude.rnf outputEncryptionKMSKeyId
+      `Prelude.seq` Prelude.rnf outputKey
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf medicalTranscriptionJobName
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf media
+      `Prelude.seq` Prelude.rnf outputBucketName
+      `Prelude.seq` Prelude.rnf specialty
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToHeaders StartMedicalTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.StartMedicalTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartMedicalTranscriptionJob where
+  toJSON StartMedicalTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ContentIdentificationType" Data..=)
+              Prelude.<$> contentIdentificationType,
+            ("KMSEncryptionContext" Data..=)
+              Prelude.<$> kmsEncryptionContext,
+            ("MediaFormat" Data..=) Prelude.<$> mediaFormat,
+            ("MediaSampleRateHertz" Data..=)
+              Prelude.<$> mediaSampleRateHertz,
+            ("OutputEncryptionKMSKeyId" Data..=)
+              Prelude.<$> outputEncryptionKMSKeyId,
+            ("OutputKey" Data..=) Prelude.<$> outputKey,
+            ("Settings" Data..=) Prelude.<$> settings,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "MedicalTranscriptionJobName"
+                  Data..= medicalTranscriptionJobName
+              ),
+            Prelude.Just ("LanguageCode" Data..= languageCode),
+            Prelude.Just ("Media" Data..= media),
+            Prelude.Just
+              ("OutputBucketName" Data..= outputBucketName),
+            Prelude.Just ("Specialty" Data..= specialty),
+            Prelude.Just ("Type" Data..= type')
+          ]
+      )
+
+instance Data.ToPath StartMedicalTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartMedicalTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartMedicalTranscriptionJobResponse' smart constructor.
+data StartMedicalTranscriptionJobResponse = StartMedicalTranscriptionJobResponse'
+  { -- | Provides detailed information about the current medical transcription
+    -- job, including job status and, if applicable, failure reason.
+    medicalTranscriptionJob :: Prelude.Maybe MedicalTranscriptionJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartMedicalTranscriptionJobResponse' 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:
+--
+-- 'medicalTranscriptionJob', 'startMedicalTranscriptionJobResponse_medicalTranscriptionJob' - Provides detailed information about the current medical transcription
+-- job, including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'startMedicalTranscriptionJobResponse_httpStatus' - The response's http status code.
+newStartMedicalTranscriptionJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartMedicalTranscriptionJobResponse
+newStartMedicalTranscriptionJobResponse pHttpStatus_ =
+  StartMedicalTranscriptionJobResponse'
+    { medicalTranscriptionJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the current medical transcription
+-- job, including job status and, if applicable, failure reason.
+startMedicalTranscriptionJobResponse_medicalTranscriptionJob :: Lens.Lens' StartMedicalTranscriptionJobResponse (Prelude.Maybe MedicalTranscriptionJob)
+startMedicalTranscriptionJobResponse_medicalTranscriptionJob = Lens.lens (\StartMedicalTranscriptionJobResponse' {medicalTranscriptionJob} -> medicalTranscriptionJob) (\s@StartMedicalTranscriptionJobResponse' {} a -> s {medicalTranscriptionJob = a} :: StartMedicalTranscriptionJobResponse)
+
+-- | The response's http status code.
+startMedicalTranscriptionJobResponse_httpStatus :: Lens.Lens' StartMedicalTranscriptionJobResponse Prelude.Int
+startMedicalTranscriptionJobResponse_httpStatus = Lens.lens (\StartMedicalTranscriptionJobResponse' {httpStatus} -> httpStatus) (\s@StartMedicalTranscriptionJobResponse' {} a -> s {httpStatus = a} :: StartMedicalTranscriptionJobResponse)
+
+instance
+  Prelude.NFData
+    StartMedicalTranscriptionJobResponse
+  where
+  rnf StartMedicalTranscriptionJobResponse' {..} =
+    Prelude.rnf medicalTranscriptionJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/StartTranscriptionJob.hs b/gen/Amazonka/Transcribe/StartTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/StartTranscriptionJob.hs
@@ -0,0 +1,1158 @@
+{-# 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.Transcribe.StartTranscriptionJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Transcribes the audio from a media file and applies any additional
+-- Request Parameters you choose to include in your request.
+--
+-- To make a @StartTranscriptionJob@ request, you must first upload your
+-- media file into an Amazon S3 bucket; you can then specify the Amazon S3
+-- location of the file using the @Media@ parameter.
+--
+-- You must include the following parameters in your
+-- @StartTranscriptionJob@ request:
+--
+-- -   @region@: The Amazon Web Services Region where you are making your
+--     request. For a list of Amazon Web Services Regions supported with
+--     Amazon Transcribe, refer to
+--     <https://docs.aws.amazon.com/general/latest/gr/transcribe.html Amazon Transcribe endpoints and quotas>.
+--
+-- -   @TranscriptionJobName@: A custom name you create for your
+--     transcription job that is unique within your Amazon Web Services
+--     account.
+--
+-- -   @Media@ (@MediaFileUri@): The Amazon S3 location of your media file.
+--
+-- -   One of @LanguageCode@, @IdentifyLanguage@, or
+--     @IdentifyMultipleLanguages@: If you know the language of your media
+--     file, specify it using the @LanguageCode@ parameter; you can find
+--     all valid language codes in the
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+--     table. If you don\'t know the languages spoken in your media, use
+--     either @IdentifyLanguage@ or @IdentifyMultipleLanguages@ and let
+--     Amazon Transcribe identify the languages for you.
+module Amazonka.Transcribe.StartTranscriptionJob
+  ( -- * Creating a Request
+    StartTranscriptionJob (..),
+    newStartTranscriptionJob,
+
+    -- * Request Lenses
+    startTranscriptionJob_contentRedaction,
+    startTranscriptionJob_identifyLanguage,
+    startTranscriptionJob_identifyMultipleLanguages,
+    startTranscriptionJob_jobExecutionSettings,
+    startTranscriptionJob_kmsEncryptionContext,
+    startTranscriptionJob_languageCode,
+    startTranscriptionJob_languageIdSettings,
+    startTranscriptionJob_languageOptions,
+    startTranscriptionJob_mediaFormat,
+    startTranscriptionJob_mediaSampleRateHertz,
+    startTranscriptionJob_modelSettings,
+    startTranscriptionJob_outputBucketName,
+    startTranscriptionJob_outputEncryptionKMSKeyId,
+    startTranscriptionJob_outputKey,
+    startTranscriptionJob_settings,
+    startTranscriptionJob_subtitles,
+    startTranscriptionJob_tags,
+    startTranscriptionJob_transcriptionJobName,
+    startTranscriptionJob_media,
+
+    -- * Destructuring the Response
+    StartTranscriptionJobResponse (..),
+    newStartTranscriptionJobResponse,
+
+    -- * Response Lenses
+    startTranscriptionJobResponse_transcriptionJob,
+    startTranscriptionJobResponse_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.Transcribe.Types
+
+-- | /See:/ 'newStartTranscriptionJob' smart constructor.
+data StartTranscriptionJob = StartTranscriptionJob'
+  { -- | Makes it possible to redact or flag specified personally identifiable
+    -- information (PII) in your transcript. If you use @ContentRedaction@, you
+    -- must also include the sub-parameters: @PiiEntityTypes@,
+    -- @RedactionOutput@, and @RedactionType@.
+    contentRedaction :: Prelude.Maybe ContentRedaction,
+    -- | Enables automatic language identification in your transcription job
+    -- request. Use this parameter if your media file contains only one
+    -- language. If your media contains multiple languages, use
+    -- @IdentifyMultipleLanguages@ instead.
+    --
+    -- If you include @IdentifyLanguage@, you can optionally include a list of
+    -- language codes, using @LanguageOptions@, that you think may be present
+    -- in your media file. Including @LanguageOptions@ restricts
+    -- @IdentifyLanguage@ to only the language options that you specify, which
+    -- can improve transcription accuracy.
+    --
+    -- If you want to apply a custom language model, a custom vocabulary, or a
+    -- custom vocabulary filter to your automatic language identification
+    -- request, include @LanguageIdSettings@ with the relevant sub-parameters
+    -- (@VocabularyName@, @LanguageModelName@, and @VocabularyFilterName@). If
+    -- you include @LanguageIdSettings@, also include @LanguageOptions@.
+    --
+    -- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+    -- @IdentifyMultipleLanguages@ in your request. If you include more than
+    -- one of these parameters, your transcription job fails.
+    identifyLanguage :: Prelude.Maybe Prelude.Bool,
+    -- | Enables automatic multi-language identification in your transcription
+    -- job request. Use this parameter if your media file contains more than
+    -- one language. If your media contains only one language, use
+    -- @IdentifyLanguage@ instead.
+    --
+    -- If you include @IdentifyMultipleLanguages@, you can optionally include a
+    -- list of language codes, using @LanguageOptions@, that you think may be
+    -- present in your media file. Including @LanguageOptions@ restricts
+    -- @IdentifyLanguage@ to only the language options that you specify, which
+    -- can improve transcription accuracy.
+    --
+    -- If you want to apply a custom vocabulary or a custom vocabulary filter
+    -- to your automatic language identification request, include
+    -- @LanguageIdSettings@ with the relevant sub-parameters (@VocabularyName@
+    -- and @VocabularyFilterName@). If you include @LanguageIdSettings@, also
+    -- include @LanguageOptions@.
+    --
+    -- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+    -- @IdentifyMultipleLanguages@ in your request. If you include more than
+    -- one of these parameters, your transcription job fails.
+    identifyMultipleLanguages :: Prelude.Maybe Prelude.Bool,
+    -- | Makes it possible to control how your transcription job is processed.
+    -- Currently, the only @JobExecutionSettings@ modification you can choose
+    -- is enabling job queueing using the @AllowDeferredExecution@
+    -- sub-parameter.
+    --
+    -- If you include @JobExecutionSettings@ in your request, you must also
+    -- include the sub-parameters: @AllowDeferredExecution@ and
+    -- @DataAccessRoleArn@.
+    jobExecutionSettings :: Prelude.Maybe JobExecutionSettings,
+    -- | A map of plain text, non-secret key:value pairs, known as encryption
+    -- context pairs, that provide an added layer of security for your data.
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+    -- and
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+    kmsEncryptionContext :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The language code that represents the language spoken in the input media
+    -- file.
+    --
+    -- If you\'re unsure of the language spoken in your media file, consider
+    -- using @IdentifyLanguage@ or @IdentifyMultipleLanguages@ to enable
+    -- automatic language identification.
+    --
+    -- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+    -- @IdentifyMultipleLanguages@ in your request. If you include more than
+    -- one of these parameters, your transcription job fails.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    --
+    -- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+    -- file must be encoded at a sample rate of 16,000 Hz or higher.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | If using automatic language identification in your request and you want
+    -- to apply a custom language model, a custom vocabulary, or a custom
+    -- vocabulary filter, include @LanguageIdSettings@ with the relevant
+    -- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+    -- @VocabularyFilterName@). Note that multi-language identification
+    -- (@IdentifyMultipleLanguages@) doesn\'t support custom language models.
+    --
+    -- @LanguageIdSettings@ supports two to five language codes. Each language
+    -- code you include can have an associated custom language model, custom
+    -- vocabulary, and custom vocabulary filter. The language codes that you
+    -- specify must match the languages of the associated custom language
+    -- models, custom vocabularies, and custom vocabulary filters.
+    --
+    -- It\'s recommended that you include @LanguageOptions@ when using
+    -- @LanguageIdSettings@ to ensure that the correct language dialect is
+    -- identified. For example, if you specify a custom vocabulary that is in
+    -- @en-US@ but Amazon Transcribe determines that the language spoken in
+    -- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+    -- transcription. If you include @LanguageOptions@ and include @en-US@ as
+    -- the only English language dialect, your custom vocabulary /is/ applied
+    -- to your transcription.
+    --
+    -- If you want to include a custom language model with your request but
+    -- __do not__ want to use automatic language identification, use instead
+    -- the parameter with the @LanguageModelName@ sub-parameter. If you want to
+    -- include a custom vocabulary or a custom vocabulary filter (or both) with
+    -- your request but __do not__ want to use automatic language
+    -- identification, use instead the parameter with the @VocabularyName@ or
+    -- @VocabularyFilterName@ (or both) sub-parameter.
+    languageIdSettings :: Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings),
+    -- | You can specify two or more language codes that represent the languages
+    -- you think may be present in your media. Including more than five is not
+    -- recommended. If you\'re unsure what languages are present, do not
+    -- include this parameter.
+    --
+    -- If you include @LanguageOptions@ in your request, you must also include
+    -- @IdentifyLanguage@.
+    --
+    -- For more information, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>.
+    --
+    -- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+    -- file must be encoded at a sample rate of 16,000 Hz or higher.
+    languageOptions :: Prelude.Maybe (Prelude.NonEmpty LanguageCode),
+    -- | Specify the format of your input media file.
+    mediaFormat :: Prelude.Maybe MediaFormat,
+    -- | The sample rate, in hertz, of the audio track in your input media file.
+    --
+    -- If you don\'t specify the media sample rate, Amazon Transcribe
+    -- determines it for you. If you specify the sample rate, it must match the
+    -- rate detected by Amazon Transcribe. If there\'s a mismatch between the
+    -- value that you specify and the value detected, your job fails. In most
+    -- cases, you can omit @MediaSampleRateHertz@ and let Amazon Transcribe
+    -- determine the sample rate.
+    mediaSampleRateHertz :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the custom language model you want to include with your
+    -- transcription job. If you include @ModelSettings@ in your request, you
+    -- must include the @LanguageModelName@ sub-parameter.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/custom-language-models.html Custom language models>.
+    modelSettings :: Prelude.Maybe ModelSettings,
+    -- | The name of the Amazon S3 bucket where you want your transcription
+    -- output stored. Do not include the @S3:\/\/@ prefix of the specified
+    -- bucket.
+    --
+    -- If you want your output to go to a sub-folder of this bucket, specify it
+    -- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+    -- name of a bucket.
+    --
+    -- For example, if you want your output stored in
+    -- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+    -- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+    -- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+    -- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+    --
+    -- Note that Amazon Transcribe must have permission to use the specified
+    -- location. You can change Amazon S3 permissions using the
+    -- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+    -- See also
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+    --
+    -- If you don\'t specify @OutputBucketName@, your transcript is placed in a
+    -- service-managed Amazon S3 bucket and you are provided with a URI to
+    -- access your transcript.
+    outputBucketName :: Prelude.Maybe Prelude.Text,
+    -- | The KMS key you want to use to encrypt your transcription output.
+    --
+    -- If using a key located in the __current__ Amazon Web Services account,
+    -- you can specify your KMS key in one of four ways:
+    --
+    -- 1.  Use the KMS key ID itself. For example,
+    --     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+    --
+    -- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 4.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If using a key located in a __different__ Amazon Web Services account
+    -- than the current Amazon Web Services account, you can specify your KMS
+    -- key in one of two ways:
+    --
+    -- 1.  Use the ARN for the KMS key ID. For example,
+    --     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+    --
+    -- 2.  Use the ARN for the KMS key alias. For example,
+    --     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+    --
+    -- If you don\'t specify an encryption key, your output is encrypted with
+    -- the default Amazon S3 key (SSE-S3).
+    --
+    -- If you specify a KMS key to encrypt your output, you must also specify
+    -- an output location using the @OutputLocation@ parameter.
+    --
+    -- Note that the user making the request must have permission to use the
+    -- specified KMS key.
+    outputEncryptionKMSKeyId :: Prelude.Maybe Prelude.Text,
+    -- | Use in combination with @OutputBucketName@ to specify the output
+    -- location of your transcript and, optionally, a unique name for your
+    -- output file. The default name for your transcription output is the same
+    -- as the name you specified for your transcription job
+    -- (@TranscriptionJobName@).
+    --
+    -- Here are some examples of how you can use @OutputKey@:
+    --
+    -- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+    --     \'my-transcript.json\' as the @OutputKey@, your transcription output
+    --     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+    --
+    -- -   If you specify \'my-first-transcription\' as the
+    --     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+    --     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+    --     transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+    --
+    -- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+    --     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+    --     transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+    --
+    -- -   If you specify \'my-first-transcription\' as the
+    --     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+    --     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+    --     @OutputKey@, your transcription output path is
+    --     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+    --
+    -- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+    -- exist, one is created for you.
+    outputKey :: Prelude.Maybe Prelude.Text,
+    -- | Specify additional optional settings in your request, including channel
+    -- identification, alternative transcriptions, speaker partitioning. You
+    -- can use that to apply custom vocabularies and vocabulary filters.
+    --
+    -- If you want to include a custom vocabulary or a custom vocabulary filter
+    -- (or both) with your request but __do not__ want to use automatic
+    -- language identification, use @Settings@ with the @VocabularyName@ or
+    -- @VocabularyFilterName@ (or both) sub-parameter.
+    --
+    -- If you\'re using automatic language identification with your request and
+    -- want to include a custom language model, a custom vocabulary, or a
+    -- custom vocabulary filter, use instead the parameter with the
+    -- @LanguageModelName@, @VocabularyName@ or @VocabularyFilterName@
+    -- sub-parameters.
+    settings :: Prelude.Maybe Settings,
+    -- | Produces subtitle files for your input media. You can specify WebVTT
+    -- (*.vtt) and SubRip (*.srt) formats.
+    subtitles :: Prelude.Maybe Subtitles,
+    -- | Adds one or more custom tags, each in the form of a key:value pair, to a
+    -- new transcription job at the time you start this new job.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | A unique name, chosen by you, for your transcription job. The name that
+    -- you specify is also used as the default name of your transcription
+    -- output file. If you want to specify a different name for your
+    -- transcription output, use the @OutputKey@ parameter.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account. If you try to create a new job
+    -- with the same name as an existing job, you get a @ConflictException@
+    -- error.
+    transcriptionJobName :: Prelude.Text,
+    -- | Describes the Amazon S3 location of the media file you want to use in
+    -- your request.
+    media :: Media
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartTranscriptionJob' 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:
+--
+-- 'contentRedaction', 'startTranscriptionJob_contentRedaction' - Makes it possible to redact or flag specified personally identifiable
+-- information (PII) in your transcript. If you use @ContentRedaction@, you
+-- must also include the sub-parameters: @PiiEntityTypes@,
+-- @RedactionOutput@, and @RedactionType@.
+--
+-- 'identifyLanguage', 'startTranscriptionJob_identifyLanguage' - Enables automatic language identification in your transcription job
+-- request. Use this parameter if your media file contains only one
+-- language. If your media contains multiple languages, use
+-- @IdentifyMultipleLanguages@ instead.
+--
+-- If you include @IdentifyLanguage@, you can optionally include a list of
+-- language codes, using @LanguageOptions@, that you think may be present
+-- in your media file. Including @LanguageOptions@ restricts
+-- @IdentifyLanguage@ to only the language options that you specify, which
+-- can improve transcription accuracy.
+--
+-- If you want to apply a custom language model, a custom vocabulary, or a
+-- custom vocabulary filter to your automatic language identification
+-- request, include @LanguageIdSettings@ with the relevant sub-parameters
+-- (@VocabularyName@, @LanguageModelName@, and @VocabularyFilterName@). If
+-- you include @LanguageIdSettings@, also include @LanguageOptions@.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+--
+-- 'identifyMultipleLanguages', 'startTranscriptionJob_identifyMultipleLanguages' - Enables automatic multi-language identification in your transcription
+-- job request. Use this parameter if your media file contains more than
+-- one language. If your media contains only one language, use
+-- @IdentifyLanguage@ instead.
+--
+-- If you include @IdentifyMultipleLanguages@, you can optionally include a
+-- list of language codes, using @LanguageOptions@, that you think may be
+-- present in your media file. Including @LanguageOptions@ restricts
+-- @IdentifyLanguage@ to only the language options that you specify, which
+-- can improve transcription accuracy.
+--
+-- If you want to apply a custom vocabulary or a custom vocabulary filter
+-- to your automatic language identification request, include
+-- @LanguageIdSettings@ with the relevant sub-parameters (@VocabularyName@
+-- and @VocabularyFilterName@). If you include @LanguageIdSettings@, also
+-- include @LanguageOptions@.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+--
+-- 'jobExecutionSettings', 'startTranscriptionJob_jobExecutionSettings' - Makes it possible to control how your transcription job is processed.
+-- Currently, the only @JobExecutionSettings@ modification you can choose
+-- is enabling job queueing using the @AllowDeferredExecution@
+-- sub-parameter.
+--
+-- If you include @JobExecutionSettings@ in your request, you must also
+-- include the sub-parameters: @AllowDeferredExecution@ and
+-- @DataAccessRoleArn@.
+--
+-- 'kmsEncryptionContext', 'startTranscriptionJob_kmsEncryptionContext' - A map of plain text, non-secret key:value pairs, known as encryption
+-- context pairs, that provide an added layer of security for your data.
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+--
+-- 'languageCode', 'startTranscriptionJob_languageCode' - The language code that represents the language spoken in the input media
+-- file.
+--
+-- If you\'re unsure of the language spoken in your media file, consider
+-- using @IdentifyLanguage@ or @IdentifyMultipleLanguages@ to enable
+-- automatic language identification.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+--
+-- 'languageIdSettings', 'startTranscriptionJob_languageIdSettings' - If using automatic language identification in your request and you want
+-- to apply a custom language model, a custom vocabulary, or a custom
+-- vocabulary filter, include @LanguageIdSettings@ with the relevant
+-- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+-- @VocabularyFilterName@). Note that multi-language identification
+-- (@IdentifyMultipleLanguages@) doesn\'t support custom language models.
+--
+-- @LanguageIdSettings@ supports two to five language codes. Each language
+-- code you include can have an associated custom language model, custom
+-- vocabulary, and custom vocabulary filter. The language codes that you
+-- specify must match the languages of the associated custom language
+-- models, custom vocabularies, and custom vocabulary filters.
+--
+-- It\'s recommended that you include @LanguageOptions@ when using
+-- @LanguageIdSettings@ to ensure that the correct language dialect is
+-- identified. For example, if you specify a custom vocabulary that is in
+-- @en-US@ but Amazon Transcribe determines that the language spoken in
+-- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+-- transcription. If you include @LanguageOptions@ and include @en-US@ as
+-- the only English language dialect, your custom vocabulary /is/ applied
+-- to your transcription.
+--
+-- If you want to include a custom language model with your request but
+-- __do not__ want to use automatic language identification, use instead
+-- the parameter with the @LanguageModelName@ sub-parameter. If you want to
+-- include a custom vocabulary or a custom vocabulary filter (or both) with
+-- your request but __do not__ want to use automatic language
+-- identification, use instead the parameter with the @VocabularyName@ or
+-- @VocabularyFilterName@ (or both) sub-parameter.
+--
+-- 'languageOptions', 'startTranscriptionJob_languageOptions' - You can specify two or more language codes that represent the languages
+-- you think may be present in your media. Including more than five is not
+-- recommended. If you\'re unsure what languages are present, do not
+-- include this parameter.
+--
+-- If you include @LanguageOptions@ in your request, you must also include
+-- @IdentifyLanguage@.
+--
+-- For more information, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+--
+-- 'mediaFormat', 'startTranscriptionJob_mediaFormat' - Specify the format of your input media file.
+--
+-- 'mediaSampleRateHertz', 'startTranscriptionJob_mediaSampleRateHertz' - The sample rate, in hertz, of the audio track in your input media file.
+--
+-- If you don\'t specify the media sample rate, Amazon Transcribe
+-- determines it for you. If you specify the sample rate, it must match the
+-- rate detected by Amazon Transcribe. If there\'s a mismatch between the
+-- value that you specify and the value detected, your job fails. In most
+-- cases, you can omit @MediaSampleRateHertz@ and let Amazon Transcribe
+-- determine the sample rate.
+--
+-- 'modelSettings', 'startTranscriptionJob_modelSettings' - Specify the custom language model you want to include with your
+-- transcription job. If you include @ModelSettings@ in your request, you
+-- must include the @LanguageModelName@ sub-parameter.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/custom-language-models.html Custom language models>.
+--
+-- 'outputBucketName', 'startTranscriptionJob_outputBucketName' - The name of the Amazon S3 bucket where you want your transcription
+-- output stored. Do not include the @S3:\/\/@ prefix of the specified
+-- bucket.
+--
+-- If you want your output to go to a sub-folder of this bucket, specify it
+-- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+-- name of a bucket.
+--
+-- For example, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+--
+-- Note that Amazon Transcribe must have permission to use the specified
+-- location. You can change Amazon S3 permissions using the
+-- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+-- See also
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+--
+-- If you don\'t specify @OutputBucketName@, your transcript is placed in a
+-- service-managed Amazon S3 bucket and you are provided with a URI to
+-- access your transcript.
+--
+-- 'outputEncryptionKMSKeyId', 'startTranscriptionJob_outputEncryptionKMSKeyId' - The KMS key you want to use to encrypt your transcription output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+--
+-- 'outputKey', 'startTranscriptionJob_outputKey' - Use in combination with @OutputBucketName@ to specify the output
+-- location of your transcript and, optionally, a unique name for your
+-- output file. The default name for your transcription output is the same
+-- as the name you specified for your transcription job
+-- (@TranscriptionJobName@).
+--
+-- Here are some examples of how you can use @OutputKey@:
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'my-transcript.json\' as the @OutputKey@, your transcription output
+--     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+--     @OutputKey@, your transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+--
+-- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+-- exist, one is created for you.
+--
+-- 'settings', 'startTranscriptionJob_settings' - Specify additional optional settings in your request, including channel
+-- identification, alternative transcriptions, speaker partitioning. You
+-- can use that to apply custom vocabularies and vocabulary filters.
+--
+-- If you want to include a custom vocabulary or a custom vocabulary filter
+-- (or both) with your request but __do not__ want to use automatic
+-- language identification, use @Settings@ with the @VocabularyName@ or
+-- @VocabularyFilterName@ (or both) sub-parameter.
+--
+-- If you\'re using automatic language identification with your request and
+-- want to include a custom language model, a custom vocabulary, or a
+-- custom vocabulary filter, use instead the parameter with the
+-- @LanguageModelName@, @VocabularyName@ or @VocabularyFilterName@
+-- sub-parameters.
+--
+-- 'subtitles', 'startTranscriptionJob_subtitles' - Produces subtitle files for your input media. You can specify WebVTT
+-- (*.vtt) and SubRip (*.srt) formats.
+--
+-- 'tags', 'startTranscriptionJob_tags' - Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new transcription job at the time you start this new job.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- 'transcriptionJobName', 'startTranscriptionJob_transcriptionJobName' - A unique name, chosen by you, for your transcription job. The name that
+-- you specify is also used as the default name of your transcription
+-- output file. If you want to specify a different name for your
+-- transcription output, use the @OutputKey@ parameter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+--
+-- 'media', 'startTranscriptionJob_media' - Describes the Amazon S3 location of the media file you want to use in
+-- your request.
+newStartTranscriptionJob ::
+  -- | 'transcriptionJobName'
+  Prelude.Text ->
+  -- | 'media'
+  Media ->
+  StartTranscriptionJob
+newStartTranscriptionJob
+  pTranscriptionJobName_
+  pMedia_ =
+    StartTranscriptionJob'
+      { contentRedaction =
+          Prelude.Nothing,
+        identifyLanguage = Prelude.Nothing,
+        identifyMultipleLanguages = Prelude.Nothing,
+        jobExecutionSettings = Prelude.Nothing,
+        kmsEncryptionContext = Prelude.Nothing,
+        languageCode = Prelude.Nothing,
+        languageIdSettings = Prelude.Nothing,
+        languageOptions = Prelude.Nothing,
+        mediaFormat = Prelude.Nothing,
+        mediaSampleRateHertz = Prelude.Nothing,
+        modelSettings = Prelude.Nothing,
+        outputBucketName = Prelude.Nothing,
+        outputEncryptionKMSKeyId = Prelude.Nothing,
+        outputKey = Prelude.Nothing,
+        settings = Prelude.Nothing,
+        subtitles = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        transcriptionJobName = pTranscriptionJobName_,
+        media = pMedia_
+      }
+
+-- | Makes it possible to redact or flag specified personally identifiable
+-- information (PII) in your transcript. If you use @ContentRedaction@, you
+-- must also include the sub-parameters: @PiiEntityTypes@,
+-- @RedactionOutput@, and @RedactionType@.
+startTranscriptionJob_contentRedaction :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe ContentRedaction)
+startTranscriptionJob_contentRedaction = Lens.lens (\StartTranscriptionJob' {contentRedaction} -> contentRedaction) (\s@StartTranscriptionJob' {} a -> s {contentRedaction = a} :: StartTranscriptionJob)
+
+-- | Enables automatic language identification in your transcription job
+-- request. Use this parameter if your media file contains only one
+-- language. If your media contains multiple languages, use
+-- @IdentifyMultipleLanguages@ instead.
+--
+-- If you include @IdentifyLanguage@, you can optionally include a list of
+-- language codes, using @LanguageOptions@, that you think may be present
+-- in your media file. Including @LanguageOptions@ restricts
+-- @IdentifyLanguage@ to only the language options that you specify, which
+-- can improve transcription accuracy.
+--
+-- If you want to apply a custom language model, a custom vocabulary, or a
+-- custom vocabulary filter to your automatic language identification
+-- request, include @LanguageIdSettings@ with the relevant sub-parameters
+-- (@VocabularyName@, @LanguageModelName@, and @VocabularyFilterName@). If
+-- you include @LanguageIdSettings@, also include @LanguageOptions@.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+startTranscriptionJob_identifyLanguage :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Bool)
+startTranscriptionJob_identifyLanguage = Lens.lens (\StartTranscriptionJob' {identifyLanguage} -> identifyLanguage) (\s@StartTranscriptionJob' {} a -> s {identifyLanguage = a} :: StartTranscriptionJob)
+
+-- | Enables automatic multi-language identification in your transcription
+-- job request. Use this parameter if your media file contains more than
+-- one language. If your media contains only one language, use
+-- @IdentifyLanguage@ instead.
+--
+-- If you include @IdentifyMultipleLanguages@, you can optionally include a
+-- list of language codes, using @LanguageOptions@, that you think may be
+-- present in your media file. Including @LanguageOptions@ restricts
+-- @IdentifyLanguage@ to only the language options that you specify, which
+-- can improve transcription accuracy.
+--
+-- If you want to apply a custom vocabulary or a custom vocabulary filter
+-- to your automatic language identification request, include
+-- @LanguageIdSettings@ with the relevant sub-parameters (@VocabularyName@
+-- and @VocabularyFilterName@). If you include @LanguageIdSettings@, also
+-- include @LanguageOptions@.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+startTranscriptionJob_identifyMultipleLanguages :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Bool)
+startTranscriptionJob_identifyMultipleLanguages = Lens.lens (\StartTranscriptionJob' {identifyMultipleLanguages} -> identifyMultipleLanguages) (\s@StartTranscriptionJob' {} a -> s {identifyMultipleLanguages = a} :: StartTranscriptionJob)
+
+-- | Makes it possible to control how your transcription job is processed.
+-- Currently, the only @JobExecutionSettings@ modification you can choose
+-- is enabling job queueing using the @AllowDeferredExecution@
+-- sub-parameter.
+--
+-- If you include @JobExecutionSettings@ in your request, you must also
+-- include the sub-parameters: @AllowDeferredExecution@ and
+-- @DataAccessRoleArn@.
+startTranscriptionJob_jobExecutionSettings :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe JobExecutionSettings)
+startTranscriptionJob_jobExecutionSettings = Lens.lens (\StartTranscriptionJob' {jobExecutionSettings} -> jobExecutionSettings) (\s@StartTranscriptionJob' {} a -> s {jobExecutionSettings = a} :: StartTranscriptionJob)
+
+-- | A map of plain text, non-secret key:value pairs, known as encryption
+-- context pairs, that provide an added layer of security for your data.
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context KMS encryption context>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html Asymmetric keys in KMS>.
+startTranscriptionJob_kmsEncryptionContext :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+startTranscriptionJob_kmsEncryptionContext = Lens.lens (\StartTranscriptionJob' {kmsEncryptionContext} -> kmsEncryptionContext) (\s@StartTranscriptionJob' {} a -> s {kmsEncryptionContext = a} :: StartTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The language code that represents the language spoken in the input media
+-- file.
+--
+-- If you\'re unsure of the language spoken in your media file, consider
+-- using @IdentifyLanguage@ or @IdentifyMultipleLanguages@ to enable
+-- automatic language identification.
+--
+-- Note that you must include one of @LanguageCode@, @IdentifyLanguage@, or
+-- @IdentifyMultipleLanguages@ in your request. If you include more than
+-- one of these parameters, your transcription job fails.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+startTranscriptionJob_languageCode :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe LanguageCode)
+startTranscriptionJob_languageCode = Lens.lens (\StartTranscriptionJob' {languageCode} -> languageCode) (\s@StartTranscriptionJob' {} a -> s {languageCode = a} :: StartTranscriptionJob)
+
+-- | If using automatic language identification in your request and you want
+-- to apply a custom language model, a custom vocabulary, or a custom
+-- vocabulary filter, include @LanguageIdSettings@ with the relevant
+-- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+-- @VocabularyFilterName@). Note that multi-language identification
+-- (@IdentifyMultipleLanguages@) doesn\'t support custom language models.
+--
+-- @LanguageIdSettings@ supports two to five language codes. Each language
+-- code you include can have an associated custom language model, custom
+-- vocabulary, and custom vocabulary filter. The language codes that you
+-- specify must match the languages of the associated custom language
+-- models, custom vocabularies, and custom vocabulary filters.
+--
+-- It\'s recommended that you include @LanguageOptions@ when using
+-- @LanguageIdSettings@ to ensure that the correct language dialect is
+-- identified. For example, if you specify a custom vocabulary that is in
+-- @en-US@ but Amazon Transcribe determines that the language spoken in
+-- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+-- transcription. If you include @LanguageOptions@ and include @en-US@ as
+-- the only English language dialect, your custom vocabulary /is/ applied
+-- to your transcription.
+--
+-- If you want to include a custom language model with your request but
+-- __do not__ want to use automatic language identification, use instead
+-- the parameter with the @LanguageModelName@ sub-parameter. If you want to
+-- include a custom vocabulary or a custom vocabulary filter (or both) with
+-- your request but __do not__ want to use automatic language
+-- identification, use instead the parameter with the @VocabularyName@ or
+-- @VocabularyFilterName@ (or both) sub-parameter.
+startTranscriptionJob_languageIdSettings :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings))
+startTranscriptionJob_languageIdSettings = Lens.lens (\StartTranscriptionJob' {languageIdSettings} -> languageIdSettings) (\s@StartTranscriptionJob' {} a -> s {languageIdSettings = a} :: StartTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | You can specify two or more language codes that represent the languages
+-- you think may be present in your media. Including more than five is not
+-- recommended. If you\'re unsure what languages are present, do not
+-- include this parameter.
+--
+-- If you include @LanguageOptions@ in your request, you must also include
+-- @IdentifyLanguage@.
+--
+-- For more information, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+startTranscriptionJob_languageOptions :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe (Prelude.NonEmpty LanguageCode))
+startTranscriptionJob_languageOptions = Lens.lens (\StartTranscriptionJob' {languageOptions} -> languageOptions) (\s@StartTranscriptionJob' {} a -> s {languageOptions = a} :: StartTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the format of your input media file.
+startTranscriptionJob_mediaFormat :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe MediaFormat)
+startTranscriptionJob_mediaFormat = Lens.lens (\StartTranscriptionJob' {mediaFormat} -> mediaFormat) (\s@StartTranscriptionJob' {} a -> s {mediaFormat = a} :: StartTranscriptionJob)
+
+-- | The sample rate, in hertz, of the audio track in your input media file.
+--
+-- If you don\'t specify the media sample rate, Amazon Transcribe
+-- determines it for you. If you specify the sample rate, it must match the
+-- rate detected by Amazon Transcribe. If there\'s a mismatch between the
+-- value that you specify and the value detected, your job fails. In most
+-- cases, you can omit @MediaSampleRateHertz@ and let Amazon Transcribe
+-- determine the sample rate.
+startTranscriptionJob_mediaSampleRateHertz :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Natural)
+startTranscriptionJob_mediaSampleRateHertz = Lens.lens (\StartTranscriptionJob' {mediaSampleRateHertz} -> mediaSampleRateHertz) (\s@StartTranscriptionJob' {} a -> s {mediaSampleRateHertz = a} :: StartTranscriptionJob)
+
+-- | Specify the custom language model you want to include with your
+-- transcription job. If you include @ModelSettings@ in your request, you
+-- must include the @LanguageModelName@ sub-parameter.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/custom-language-models.html Custom language models>.
+startTranscriptionJob_modelSettings :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe ModelSettings)
+startTranscriptionJob_modelSettings = Lens.lens (\StartTranscriptionJob' {modelSettings} -> modelSettings) (\s@StartTranscriptionJob' {} a -> s {modelSettings = a} :: StartTranscriptionJob)
+
+-- | The name of the Amazon S3 bucket where you want your transcription
+-- output stored. Do not include the @S3:\/\/@ prefix of the specified
+-- bucket.
+--
+-- If you want your output to go to a sub-folder of this bucket, specify it
+-- using the @OutputKey@ parameter; @OutputBucketName@ only accepts the
+-- name of a bucket.
+--
+-- For example, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@. However, if you want your output stored in
+-- @S3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/@, set @OutputBucketName@ to
+-- @DOC-EXAMPLE-BUCKET@ and @OutputKey@ to @test-files\/@.
+--
+-- Note that Amazon Transcribe must have permission to use the specified
+-- location. You can change Amazon S3 permissions using the
+-- <https://console.aws.amazon.com/s3 Amazon Web Services Management Console>.
+-- See also
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user Permissions Required for IAM User Roles>.
+--
+-- If you don\'t specify @OutputBucketName@, your transcript is placed in a
+-- service-managed Amazon S3 bucket and you are provided with a URI to
+-- access your transcript.
+startTranscriptionJob_outputBucketName :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Text)
+startTranscriptionJob_outputBucketName = Lens.lens (\StartTranscriptionJob' {outputBucketName} -> outputBucketName) (\s@StartTranscriptionJob' {} a -> s {outputBucketName = a} :: StartTranscriptionJob)
+
+-- | The KMS key you want to use to encrypt your transcription output.
+--
+-- If using a key located in the __current__ Amazon Web Services account,
+-- you can specify your KMS key in one of four ways:
+--
+-- 1.  Use the KMS key ID itself. For example,
+--     @1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use an alias for the KMS key ID. For example, @alias\/ExampleAlias@.
+--
+-- 3.  Use the Amazon Resource Name (ARN) for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 4.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If using a key located in a __different__ Amazon Web Services account
+-- than the current Amazon Web Services account, you can specify your KMS
+-- key in one of two ways:
+--
+-- 1.  Use the ARN for the KMS key ID. For example,
+--     @arn:aws:kms:region:account-ID:key\/1234abcd-12ab-34cd-56ef-1234567890ab@.
+--
+-- 2.  Use the ARN for the KMS key alias. For example,
+--     @arn:aws:kms:region:account-ID:alias\/ExampleAlias@.
+--
+-- If you don\'t specify an encryption key, your output is encrypted with
+-- the default Amazon S3 key (SSE-S3).
+--
+-- If you specify a KMS key to encrypt your output, you must also specify
+-- an output location using the @OutputLocation@ parameter.
+--
+-- Note that the user making the request must have permission to use the
+-- specified KMS key.
+startTranscriptionJob_outputEncryptionKMSKeyId :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Text)
+startTranscriptionJob_outputEncryptionKMSKeyId = Lens.lens (\StartTranscriptionJob' {outputEncryptionKMSKeyId} -> outputEncryptionKMSKeyId) (\s@StartTranscriptionJob' {} a -> s {outputEncryptionKMSKeyId = a} :: StartTranscriptionJob)
+
+-- | Use in combination with @OutputBucketName@ to specify the output
+-- location of your transcript and, optionally, a unique name for your
+-- output file. The default name for your transcription output is the same
+-- as the name you specified for your transcription job
+-- (@TranscriptionJobName@).
+--
+-- Here are some examples of how you can use @OutputKey@:
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'my-transcript.json\' as the @OutputKey@, your transcription output
+--     path is @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'my-transcript\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/my-transcript\/my-first-transcription.json@.
+--
+-- -   If you specify \'DOC-EXAMPLE-BUCKET\' as the @OutputBucketName@ and
+--     \'test-files\/my-transcript.json\' as the @OutputKey@, your
+--     transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript.json@.
+--
+-- -   If you specify \'my-first-transcription\' as the
+--     @TranscriptionJobName@, \'DOC-EXAMPLE-BUCKET\' as the
+--     @OutputBucketName@, and \'test-files\/my-transcript\' as the
+--     @OutputKey@, your transcription output path is
+--     @s3:\/\/DOC-EXAMPLE-BUCKET\/test-files\/my-transcript\/my-first-transcription.json@.
+--
+-- If you specify the name of an Amazon S3 bucket sub-folder that doesn\'t
+-- exist, one is created for you.
+startTranscriptionJob_outputKey :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Prelude.Text)
+startTranscriptionJob_outputKey = Lens.lens (\StartTranscriptionJob' {outputKey} -> outputKey) (\s@StartTranscriptionJob' {} a -> s {outputKey = a} :: StartTranscriptionJob)
+
+-- | Specify additional optional settings in your request, including channel
+-- identification, alternative transcriptions, speaker partitioning. You
+-- can use that to apply custom vocabularies and vocabulary filters.
+--
+-- If you want to include a custom vocabulary or a custom vocabulary filter
+-- (or both) with your request but __do not__ want to use automatic
+-- language identification, use @Settings@ with the @VocabularyName@ or
+-- @VocabularyFilterName@ (or both) sub-parameter.
+--
+-- If you\'re using automatic language identification with your request and
+-- want to include a custom language model, a custom vocabulary, or a
+-- custom vocabulary filter, use instead the parameter with the
+-- @LanguageModelName@, @VocabularyName@ or @VocabularyFilterName@
+-- sub-parameters.
+startTranscriptionJob_settings :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Settings)
+startTranscriptionJob_settings = Lens.lens (\StartTranscriptionJob' {settings} -> settings) (\s@StartTranscriptionJob' {} a -> s {settings = a} :: StartTranscriptionJob)
+
+-- | Produces subtitle files for your input media. You can specify WebVTT
+-- (*.vtt) and SubRip (*.srt) formats.
+startTranscriptionJob_subtitles :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe Subtitles)
+startTranscriptionJob_subtitles = Lens.lens (\StartTranscriptionJob' {subtitles} -> subtitles) (\s@StartTranscriptionJob' {} a -> s {subtitles = a} :: StartTranscriptionJob)
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to a
+-- new transcription job at the time you start this new job.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+startTranscriptionJob_tags :: Lens.Lens' StartTranscriptionJob (Prelude.Maybe (Prelude.NonEmpty Tag))
+startTranscriptionJob_tags = Lens.lens (\StartTranscriptionJob' {tags} -> tags) (\s@StartTranscriptionJob' {} a -> s {tags = a} :: StartTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | A unique name, chosen by you, for your transcription job. The name that
+-- you specify is also used as the default name of your transcription
+-- output file. If you want to specify a different name for your
+-- transcription output, use the @OutputKey@ parameter.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account. If you try to create a new job
+-- with the same name as an existing job, you get a @ConflictException@
+-- error.
+startTranscriptionJob_transcriptionJobName :: Lens.Lens' StartTranscriptionJob Prelude.Text
+startTranscriptionJob_transcriptionJobName = Lens.lens (\StartTranscriptionJob' {transcriptionJobName} -> transcriptionJobName) (\s@StartTranscriptionJob' {} a -> s {transcriptionJobName = a} :: StartTranscriptionJob)
+
+-- | Describes the Amazon S3 location of the media file you want to use in
+-- your request.
+startTranscriptionJob_media :: Lens.Lens' StartTranscriptionJob Media
+startTranscriptionJob_media = Lens.lens (\StartTranscriptionJob' {media} -> media) (\s@StartTranscriptionJob' {} a -> s {media = a} :: StartTranscriptionJob)
+
+instance Core.AWSRequest StartTranscriptionJob where
+  type
+    AWSResponse StartTranscriptionJob =
+      StartTranscriptionJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartTranscriptionJobResponse'
+            Prelude.<$> (x Data..?> "TranscriptionJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartTranscriptionJob where
+  hashWithSalt _salt StartTranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` contentRedaction
+      `Prelude.hashWithSalt` identifyLanguage
+      `Prelude.hashWithSalt` identifyMultipleLanguages
+      `Prelude.hashWithSalt` jobExecutionSettings
+      `Prelude.hashWithSalt` kmsEncryptionContext
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` languageIdSettings
+      `Prelude.hashWithSalt` languageOptions
+      `Prelude.hashWithSalt` mediaFormat
+      `Prelude.hashWithSalt` mediaSampleRateHertz
+      `Prelude.hashWithSalt` modelSettings
+      `Prelude.hashWithSalt` outputBucketName
+      `Prelude.hashWithSalt` outputEncryptionKMSKeyId
+      `Prelude.hashWithSalt` outputKey
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` subtitles
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` transcriptionJobName
+      `Prelude.hashWithSalt` media
+
+instance Prelude.NFData StartTranscriptionJob where
+  rnf StartTranscriptionJob' {..} =
+    Prelude.rnf contentRedaction
+      `Prelude.seq` Prelude.rnf identifyLanguage
+      `Prelude.seq` Prelude.rnf identifyMultipleLanguages
+      `Prelude.seq` Prelude.rnf jobExecutionSettings
+      `Prelude.seq` Prelude.rnf kmsEncryptionContext
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf languageIdSettings
+      `Prelude.seq` Prelude.rnf languageOptions
+      `Prelude.seq` Prelude.rnf mediaFormat
+      `Prelude.seq` Prelude.rnf mediaSampleRateHertz
+      `Prelude.seq` Prelude.rnf modelSettings
+      `Prelude.seq` Prelude.rnf outputBucketName
+      `Prelude.seq` Prelude.rnf outputEncryptionKMSKeyId
+      `Prelude.seq` Prelude.rnf outputKey
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf subtitles
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf transcriptionJobName
+      `Prelude.seq` Prelude.rnf media
+
+instance Data.ToHeaders StartTranscriptionJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.StartTranscriptionJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartTranscriptionJob where
+  toJSON StartTranscriptionJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ContentRedaction" Data..=)
+              Prelude.<$> contentRedaction,
+            ("IdentifyLanguage" Data..=)
+              Prelude.<$> identifyLanguage,
+            ("IdentifyMultipleLanguages" Data..=)
+              Prelude.<$> identifyMultipleLanguages,
+            ("JobExecutionSettings" Data..=)
+              Prelude.<$> jobExecutionSettings,
+            ("KMSEncryptionContext" Data..=)
+              Prelude.<$> kmsEncryptionContext,
+            ("LanguageCode" Data..=) Prelude.<$> languageCode,
+            ("LanguageIdSettings" Data..=)
+              Prelude.<$> languageIdSettings,
+            ("LanguageOptions" Data..=)
+              Prelude.<$> languageOptions,
+            ("MediaFormat" Data..=) Prelude.<$> mediaFormat,
+            ("MediaSampleRateHertz" Data..=)
+              Prelude.<$> mediaSampleRateHertz,
+            ("ModelSettings" Data..=) Prelude.<$> modelSettings,
+            ("OutputBucketName" Data..=)
+              Prelude.<$> outputBucketName,
+            ("OutputEncryptionKMSKeyId" Data..=)
+              Prelude.<$> outputEncryptionKMSKeyId,
+            ("OutputKey" Data..=) Prelude.<$> outputKey,
+            ("Settings" Data..=) Prelude.<$> settings,
+            ("Subtitles" Data..=) Prelude.<$> subtitles,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just
+              ( "TranscriptionJobName"
+                  Data..= transcriptionJobName
+              ),
+            Prelude.Just ("Media" Data..= media)
+          ]
+      )
+
+instance Data.ToPath StartTranscriptionJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartTranscriptionJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartTranscriptionJobResponse' smart constructor.
+data StartTranscriptionJobResponse = StartTranscriptionJobResponse'
+  { -- | Provides detailed information about the current transcription job,
+    -- including job status and, if applicable, failure reason.
+    transcriptionJob :: Prelude.Maybe TranscriptionJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartTranscriptionJobResponse' 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:
+--
+-- 'transcriptionJob', 'startTranscriptionJobResponse_transcriptionJob' - Provides detailed information about the current transcription job,
+-- including job status and, if applicable, failure reason.
+--
+-- 'httpStatus', 'startTranscriptionJobResponse_httpStatus' - The response's http status code.
+newStartTranscriptionJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartTranscriptionJobResponse
+newStartTranscriptionJobResponse pHttpStatus_ =
+  StartTranscriptionJobResponse'
+    { transcriptionJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides detailed information about the current transcription job,
+-- including job status and, if applicable, failure reason.
+startTranscriptionJobResponse_transcriptionJob :: Lens.Lens' StartTranscriptionJobResponse (Prelude.Maybe TranscriptionJob)
+startTranscriptionJobResponse_transcriptionJob = Lens.lens (\StartTranscriptionJobResponse' {transcriptionJob} -> transcriptionJob) (\s@StartTranscriptionJobResponse' {} a -> s {transcriptionJob = a} :: StartTranscriptionJobResponse)
+
+-- | The response's http status code.
+startTranscriptionJobResponse_httpStatus :: Lens.Lens' StartTranscriptionJobResponse Prelude.Int
+startTranscriptionJobResponse_httpStatus = Lens.lens (\StartTranscriptionJobResponse' {httpStatus} -> httpStatus) (\s@StartTranscriptionJobResponse' {} a -> s {httpStatus = a} :: StartTranscriptionJobResponse)
+
+instance Prelude.NFData StartTranscriptionJobResponse where
+  rnf StartTranscriptionJobResponse' {..} =
+    Prelude.rnf transcriptionJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/TagResource.hs b/gen/Amazonka/Transcribe/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/TagResource.hs
@@ -0,0 +1,211 @@
+{-# 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.Transcribe.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)
+--
+-- Adds one or more custom tags, each in the form of a key:value pair, to
+-- the specified resource.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+module Amazonka.Transcribe.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.Transcribe.Types
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The Amazon Resource Name (ARN) of the resource you want to tag. ARNs
+    -- have the format
+    -- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+    --
+    -- For example,
+    -- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+    --
+    -- Valid values for @resource-type@ are: @transcription-job@,
+    -- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+    -- @vocabulary-filter@, and @language-model@.
+    resourceArn :: Prelude.Text,
+    -- | Adds one or more custom tags, each in the form of a key:value pair, to
+    -- the specified resource.
+    --
+    -- To learn more about using tags with Amazon Transcribe, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+    tags :: Prelude.NonEmpty Tag
+  }
+  deriving (Prelude.Eq, Prelude.Read, 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 resource you want to tag. ARNs
+-- have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+--
+-- 'tags', 'tagResource_tags' - Adds one or more custom tags, each in the form of a key:value pair, to
+-- the specified resource.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tags'
+  Prelude.NonEmpty Tag ->
+  TagResource
+newTagResource pResourceArn_ pTags_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Lens.coerced Lens.# pTags_
+    }
+
+-- | The Amazon Resource Name (ARN) of the resource you want to tag. ARNs
+-- have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | Adds one or more custom tags, each in the form of a key:value pair, to
+-- the specified resource.
+--
+-- To learn more about using tags with Amazon Transcribe, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+tagResource_tags :: Lens.Lens' TagResource (Prelude.NonEmpty 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.=# ("Transcribe.TagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          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/Transcribe/Types.hs b/gen/Amazonka/Transcribe/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types.hs
@@ -0,0 +1,582 @@
+{-# 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.Transcribe.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.Transcribe.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _BadRequestException,
+    _ConflictException,
+    _InternalFailureException,
+    _LimitExceededException,
+    _NotFoundException,
+
+    -- * BaseModelName
+    BaseModelName (..),
+
+    -- * CLMLanguageCode
+    CLMLanguageCode (..),
+
+    -- * CallAnalyticsJobStatus
+    CallAnalyticsJobStatus (..),
+
+    -- * InputType
+    InputType (..),
+
+    -- * LanguageCode
+    LanguageCode (..),
+
+    -- * MediaFormat
+    MediaFormat (..),
+
+    -- * MedicalContentIdentificationType
+    MedicalContentIdentificationType (..),
+
+    -- * ModelStatus
+    ModelStatus (..),
+
+    -- * OutputLocationType
+    OutputLocationType (..),
+
+    -- * ParticipantRole
+    ParticipantRole (..),
+
+    -- * PiiEntityType
+    PiiEntityType (..),
+
+    -- * RedactionOutput
+    RedactionOutput (..),
+
+    -- * RedactionType
+    RedactionType (..),
+
+    -- * SentimentValue
+    SentimentValue (..),
+
+    -- * Specialty
+    Specialty (..),
+
+    -- * SubtitleFormat
+    SubtitleFormat (..),
+
+    -- * TranscriptFilterType
+    TranscriptFilterType (..),
+
+    -- * TranscriptionJobStatus
+    TranscriptionJobStatus (..),
+
+    -- * Type
+    Type (..),
+
+    -- * VocabularyFilterMethod
+    VocabularyFilterMethod (..),
+
+    -- * VocabularyState
+    VocabularyState (..),
+
+    -- * AbsoluteTimeRange
+    AbsoluteTimeRange (..),
+    newAbsoluteTimeRange,
+    absoluteTimeRange_endTime,
+    absoluteTimeRange_first,
+    absoluteTimeRange_last,
+    absoluteTimeRange_startTime,
+
+    -- * CallAnalyticsJob
+    CallAnalyticsJob (..),
+    newCallAnalyticsJob,
+    callAnalyticsJob_callAnalyticsJobName,
+    callAnalyticsJob_callAnalyticsJobStatus,
+    callAnalyticsJob_channelDefinitions,
+    callAnalyticsJob_completionTime,
+    callAnalyticsJob_creationTime,
+    callAnalyticsJob_dataAccessRoleArn,
+    callAnalyticsJob_failureReason,
+    callAnalyticsJob_identifiedLanguageScore,
+    callAnalyticsJob_languageCode,
+    callAnalyticsJob_media,
+    callAnalyticsJob_mediaFormat,
+    callAnalyticsJob_mediaSampleRateHertz,
+    callAnalyticsJob_settings,
+    callAnalyticsJob_startTime,
+    callAnalyticsJob_transcript,
+
+    -- * CallAnalyticsJobSettings
+    CallAnalyticsJobSettings (..),
+    newCallAnalyticsJobSettings,
+    callAnalyticsJobSettings_contentRedaction,
+    callAnalyticsJobSettings_languageIdSettings,
+    callAnalyticsJobSettings_languageModelName,
+    callAnalyticsJobSettings_languageOptions,
+    callAnalyticsJobSettings_vocabularyFilterMethod,
+    callAnalyticsJobSettings_vocabularyFilterName,
+    callAnalyticsJobSettings_vocabularyName,
+
+    -- * CallAnalyticsJobSummary
+    CallAnalyticsJobSummary (..),
+    newCallAnalyticsJobSummary,
+    callAnalyticsJobSummary_callAnalyticsJobName,
+    callAnalyticsJobSummary_callAnalyticsJobStatus,
+    callAnalyticsJobSummary_completionTime,
+    callAnalyticsJobSummary_creationTime,
+    callAnalyticsJobSummary_failureReason,
+    callAnalyticsJobSummary_languageCode,
+    callAnalyticsJobSummary_startTime,
+
+    -- * CategoryProperties
+    CategoryProperties (..),
+    newCategoryProperties,
+    categoryProperties_categoryName,
+    categoryProperties_createTime,
+    categoryProperties_inputType,
+    categoryProperties_lastUpdateTime,
+    categoryProperties_rules,
+
+    -- * ChannelDefinition
+    ChannelDefinition (..),
+    newChannelDefinition,
+    channelDefinition_channelId,
+    channelDefinition_participantRole,
+
+    -- * ContentRedaction
+    ContentRedaction (..),
+    newContentRedaction,
+    contentRedaction_piiEntityTypes,
+    contentRedaction_redactionType,
+    contentRedaction_redactionOutput,
+
+    -- * InputDataConfig
+    InputDataConfig (..),
+    newInputDataConfig,
+    inputDataConfig_tuningDataS3Uri,
+    inputDataConfig_s3Uri,
+    inputDataConfig_dataAccessRoleArn,
+
+    -- * InterruptionFilter
+    InterruptionFilter (..),
+    newInterruptionFilter,
+    interruptionFilter_absoluteTimeRange,
+    interruptionFilter_negate,
+    interruptionFilter_participantRole,
+    interruptionFilter_relativeTimeRange,
+    interruptionFilter_threshold,
+
+    -- * JobExecutionSettings
+    JobExecutionSettings (..),
+    newJobExecutionSettings,
+    jobExecutionSettings_allowDeferredExecution,
+    jobExecutionSettings_dataAccessRoleArn,
+
+    -- * LanguageCodeItem
+    LanguageCodeItem (..),
+    newLanguageCodeItem,
+    languageCodeItem_durationInSeconds,
+    languageCodeItem_languageCode,
+
+    -- * LanguageIdSettings
+    LanguageIdSettings (..),
+    newLanguageIdSettings,
+    languageIdSettings_languageModelName,
+    languageIdSettings_vocabularyFilterName,
+    languageIdSettings_vocabularyName,
+
+    -- * LanguageModel
+    LanguageModel (..),
+    newLanguageModel,
+    languageModel_baseModelName,
+    languageModel_createTime,
+    languageModel_failureReason,
+    languageModel_inputDataConfig,
+    languageModel_languageCode,
+    languageModel_lastModifiedTime,
+    languageModel_modelName,
+    languageModel_modelStatus,
+    languageModel_upgradeAvailability,
+
+    -- * Media
+    Media (..),
+    newMedia,
+    media_mediaFileUri,
+    media_redactedMediaFileUri,
+
+    -- * MedicalTranscript
+    MedicalTranscript (..),
+    newMedicalTranscript,
+    medicalTranscript_transcriptFileUri,
+
+    -- * MedicalTranscriptionJob
+    MedicalTranscriptionJob (..),
+    newMedicalTranscriptionJob,
+    medicalTranscriptionJob_completionTime,
+    medicalTranscriptionJob_contentIdentificationType,
+    medicalTranscriptionJob_creationTime,
+    medicalTranscriptionJob_failureReason,
+    medicalTranscriptionJob_languageCode,
+    medicalTranscriptionJob_media,
+    medicalTranscriptionJob_mediaFormat,
+    medicalTranscriptionJob_mediaSampleRateHertz,
+    medicalTranscriptionJob_medicalTranscriptionJobName,
+    medicalTranscriptionJob_settings,
+    medicalTranscriptionJob_specialty,
+    medicalTranscriptionJob_startTime,
+    medicalTranscriptionJob_tags,
+    medicalTranscriptionJob_transcript,
+    medicalTranscriptionJob_transcriptionJobStatus,
+    medicalTranscriptionJob_type,
+
+    -- * MedicalTranscriptionJobSummary
+    MedicalTranscriptionJobSummary (..),
+    newMedicalTranscriptionJobSummary,
+    medicalTranscriptionJobSummary_completionTime,
+    medicalTranscriptionJobSummary_contentIdentificationType,
+    medicalTranscriptionJobSummary_creationTime,
+    medicalTranscriptionJobSummary_failureReason,
+    medicalTranscriptionJobSummary_languageCode,
+    medicalTranscriptionJobSummary_medicalTranscriptionJobName,
+    medicalTranscriptionJobSummary_outputLocationType,
+    medicalTranscriptionJobSummary_specialty,
+    medicalTranscriptionJobSummary_startTime,
+    medicalTranscriptionJobSummary_transcriptionJobStatus,
+    medicalTranscriptionJobSummary_type,
+
+    -- * MedicalTranscriptionSetting
+    MedicalTranscriptionSetting (..),
+    newMedicalTranscriptionSetting,
+    medicalTranscriptionSetting_channelIdentification,
+    medicalTranscriptionSetting_maxAlternatives,
+    medicalTranscriptionSetting_maxSpeakerLabels,
+    medicalTranscriptionSetting_showAlternatives,
+    medicalTranscriptionSetting_showSpeakerLabels,
+    medicalTranscriptionSetting_vocabularyName,
+
+    -- * ModelSettings
+    ModelSettings (..),
+    newModelSettings,
+    modelSettings_languageModelName,
+
+    -- * NonTalkTimeFilter
+    NonTalkTimeFilter (..),
+    newNonTalkTimeFilter,
+    nonTalkTimeFilter_absoluteTimeRange,
+    nonTalkTimeFilter_negate,
+    nonTalkTimeFilter_relativeTimeRange,
+    nonTalkTimeFilter_threshold,
+
+    -- * RelativeTimeRange
+    RelativeTimeRange (..),
+    newRelativeTimeRange,
+    relativeTimeRange_endPercentage,
+    relativeTimeRange_first,
+    relativeTimeRange_last,
+    relativeTimeRange_startPercentage,
+
+    -- * Rule
+    Rule (..),
+    newRule,
+    rule_interruptionFilter,
+    rule_nonTalkTimeFilter,
+    rule_sentimentFilter,
+    rule_transcriptFilter,
+
+    -- * SentimentFilter
+    SentimentFilter (..),
+    newSentimentFilter,
+    sentimentFilter_absoluteTimeRange,
+    sentimentFilter_negate,
+    sentimentFilter_participantRole,
+    sentimentFilter_relativeTimeRange,
+    sentimentFilter_sentiments,
+
+    -- * Settings
+    Settings (..),
+    newSettings,
+    settings_channelIdentification,
+    settings_maxAlternatives,
+    settings_maxSpeakerLabels,
+    settings_showAlternatives,
+    settings_showSpeakerLabels,
+    settings_vocabularyFilterMethod,
+    settings_vocabularyFilterName,
+    settings_vocabularyName,
+
+    -- * Subtitles
+    Subtitles (..),
+    newSubtitles,
+    subtitles_formats,
+    subtitles_outputStartIndex,
+
+    -- * SubtitlesOutput
+    SubtitlesOutput (..),
+    newSubtitlesOutput,
+    subtitlesOutput_formats,
+    subtitlesOutput_outputStartIndex,
+    subtitlesOutput_subtitleFileUris,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * Transcript
+    Transcript (..),
+    newTranscript,
+    transcript_redactedTranscriptFileUri,
+    transcript_transcriptFileUri,
+
+    -- * TranscriptFilter
+    TranscriptFilter (..),
+    newTranscriptFilter,
+    transcriptFilter_absoluteTimeRange,
+    transcriptFilter_negate,
+    transcriptFilter_participantRole,
+    transcriptFilter_relativeTimeRange,
+    transcriptFilter_transcriptFilterType,
+    transcriptFilter_targets,
+
+    -- * TranscriptionJob
+    TranscriptionJob (..),
+    newTranscriptionJob,
+    transcriptionJob_completionTime,
+    transcriptionJob_contentRedaction,
+    transcriptionJob_creationTime,
+    transcriptionJob_failureReason,
+    transcriptionJob_identifiedLanguageScore,
+    transcriptionJob_identifyLanguage,
+    transcriptionJob_identifyMultipleLanguages,
+    transcriptionJob_jobExecutionSettings,
+    transcriptionJob_languageCode,
+    transcriptionJob_languageCodes,
+    transcriptionJob_languageIdSettings,
+    transcriptionJob_languageOptions,
+    transcriptionJob_media,
+    transcriptionJob_mediaFormat,
+    transcriptionJob_mediaSampleRateHertz,
+    transcriptionJob_modelSettings,
+    transcriptionJob_settings,
+    transcriptionJob_startTime,
+    transcriptionJob_subtitles,
+    transcriptionJob_tags,
+    transcriptionJob_transcript,
+    transcriptionJob_transcriptionJobName,
+    transcriptionJob_transcriptionJobStatus,
+
+    -- * TranscriptionJobSummary
+    TranscriptionJobSummary (..),
+    newTranscriptionJobSummary,
+    transcriptionJobSummary_completionTime,
+    transcriptionJobSummary_contentRedaction,
+    transcriptionJobSummary_creationTime,
+    transcriptionJobSummary_failureReason,
+    transcriptionJobSummary_identifiedLanguageScore,
+    transcriptionJobSummary_identifyLanguage,
+    transcriptionJobSummary_identifyMultipleLanguages,
+    transcriptionJobSummary_languageCode,
+    transcriptionJobSummary_languageCodes,
+    transcriptionJobSummary_modelSettings,
+    transcriptionJobSummary_outputLocationType,
+    transcriptionJobSummary_startTime,
+    transcriptionJobSummary_transcriptionJobName,
+    transcriptionJobSummary_transcriptionJobStatus,
+
+    -- * VocabularyFilterInfo
+    VocabularyFilterInfo (..),
+    newVocabularyFilterInfo,
+    vocabularyFilterInfo_languageCode,
+    vocabularyFilterInfo_lastModifiedTime,
+    vocabularyFilterInfo_vocabularyFilterName,
+
+    -- * VocabularyInfo
+    VocabularyInfo (..),
+    newVocabularyInfo,
+    vocabularyInfo_languageCode,
+    vocabularyInfo_lastModifiedTime,
+    vocabularyInfo_vocabularyName,
+    vocabularyInfo_vocabularyState,
+  )
+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.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.BaseModelName
+import Amazonka.Transcribe.Types.CLMLanguageCode
+import Amazonka.Transcribe.Types.CallAnalyticsJob
+import Amazonka.Transcribe.Types.CallAnalyticsJobSettings
+import Amazonka.Transcribe.Types.CallAnalyticsJobStatus
+import Amazonka.Transcribe.Types.CallAnalyticsJobSummary
+import Amazonka.Transcribe.Types.CategoryProperties
+import Amazonka.Transcribe.Types.ChannelDefinition
+import Amazonka.Transcribe.Types.ContentRedaction
+import Amazonka.Transcribe.Types.InputDataConfig
+import Amazonka.Transcribe.Types.InputType
+import Amazonka.Transcribe.Types.InterruptionFilter
+import Amazonka.Transcribe.Types.JobExecutionSettings
+import Amazonka.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.LanguageCodeItem
+import Amazonka.Transcribe.Types.LanguageIdSettings
+import Amazonka.Transcribe.Types.LanguageModel
+import Amazonka.Transcribe.Types.Media
+import Amazonka.Transcribe.Types.MediaFormat
+import Amazonka.Transcribe.Types.MedicalContentIdentificationType
+import Amazonka.Transcribe.Types.MedicalTranscript
+import Amazonka.Transcribe.Types.MedicalTranscriptionJob
+import Amazonka.Transcribe.Types.MedicalTranscriptionJobSummary
+import Amazonka.Transcribe.Types.MedicalTranscriptionSetting
+import Amazonka.Transcribe.Types.ModelSettings
+import Amazonka.Transcribe.Types.ModelStatus
+import Amazonka.Transcribe.Types.NonTalkTimeFilter
+import Amazonka.Transcribe.Types.OutputLocationType
+import Amazonka.Transcribe.Types.ParticipantRole
+import Amazonka.Transcribe.Types.PiiEntityType
+import Amazonka.Transcribe.Types.RedactionOutput
+import Amazonka.Transcribe.Types.RedactionType
+import Amazonka.Transcribe.Types.RelativeTimeRange
+import Amazonka.Transcribe.Types.Rule
+import Amazonka.Transcribe.Types.SentimentFilter
+import Amazonka.Transcribe.Types.SentimentValue
+import Amazonka.Transcribe.Types.Settings
+import Amazonka.Transcribe.Types.Specialty
+import Amazonka.Transcribe.Types.SubtitleFormat
+import Amazonka.Transcribe.Types.Subtitles
+import Amazonka.Transcribe.Types.SubtitlesOutput
+import Amazonka.Transcribe.Types.Tag
+import Amazonka.Transcribe.Types.Transcript
+import Amazonka.Transcribe.Types.TranscriptFilter
+import Amazonka.Transcribe.Types.TranscriptFilterType
+import Amazonka.Transcribe.Types.TranscriptionJob
+import Amazonka.Transcribe.Types.TranscriptionJobStatus
+import Amazonka.Transcribe.Types.TranscriptionJobSummary
+import Amazonka.Transcribe.Types.Type
+import Amazonka.Transcribe.Types.VocabularyFilterInfo
+import Amazonka.Transcribe.Types.VocabularyFilterMethod
+import Amazonka.Transcribe.Types.VocabularyInfo
+import Amazonka.Transcribe.Types.VocabularyState
+
+-- | API version @2017-10-26@ of the Amazon Transcribe Service SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Transcribe",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "transcribe",
+      Core.signingName = "transcribe",
+      Core.version = "2017-10-26",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Transcribe",
+      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
+
+-- | Your request didn\'t pass one or more validation tests. This can occur
+-- when the entity you\'re trying to delete doesn\'t exist or if it\'s in a
+-- non-terminal state (such as @IN PROGRESS@). See the exception message
+-- field for more information.
+_BadRequestException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_BadRequestException =
+  Core._MatchServiceError
+    defaultService
+    "BadRequestException"
+
+-- | A resource already exists with this name. Resource names must be unique
+-- within an Amazon Web Services account.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+
+-- | There was an internal error. Check the error message, correct the issue,
+-- and try your request again.
+_InternalFailureException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalFailureException =
+  Core._MatchServiceError
+    defaultService
+    "InternalFailureException"
+
+-- | You\'ve either sent too many requests or your input file is too long.
+-- Wait before retrying your request, or use a smaller file and try your
+-- request again.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | We can\'t find the requested resource. Check that the specified name is
+-- correct and try your request again.
+_NotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_NotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "NotFoundException"
diff --git a/gen/Amazonka/Transcribe/Types/AbsoluteTimeRange.hs b/gen/Amazonka/Transcribe/Types/AbsoluteTimeRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/AbsoluteTimeRange.hs
@@ -0,0 +1,159 @@
+{-# 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.Transcribe.Types.AbsoluteTimeRange
+-- 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.Transcribe.Types.AbsoluteTimeRange 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
+
+-- | A time range, in milliseconds, between two points in your media file.
+--
+-- You can use @StartTime@ and @EndTime@ to search a custom segment. For
+-- example, setting @StartTime@ to 10000 and @EndTime@ to 50000 only
+-- searches for your specified criteria in the audio contained between the
+-- 10,000 millisecond mark and the 50,000 millisecond mark of your media
+-- file. You must use @StartTime@ and @EndTime@ as a set; that is, if you
+-- include one, you must include both.
+--
+-- You can use also @First@ to search from the start of the audio until the
+-- time that you specify, or @Last@ to search from the time that you
+-- specify until the end of the audio. For example, setting @First@ to
+-- 50000 only searches for your specified criteria in the audio contained
+-- between the start of the media file to the 50,000 millisecond mark. You
+-- can use @First@ and @Last@ independently of each other.
+--
+-- If you prefer to use percentage instead of milliseconds, see .
+--
+-- /See:/ 'newAbsoluteTimeRange' smart constructor.
+data AbsoluteTimeRange = AbsoluteTimeRange'
+  { -- | The time, in milliseconds, when Amazon Transcribe stops searching for
+    -- the specified criteria in your audio. If you include @EndTime@ in your
+    -- request, you must also include @StartTime@.
+    endTime :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in milliseconds, from the start of your media file until the
+    -- specified value. Amazon Transcribe searches for your specified criteria
+    -- in this time segment.
+    first :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in milliseconds, from the specified value until the end of
+    -- your media file. Amazon Transcribe searches for your specified criteria
+    -- in this time segment.
+    last :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in milliseconds, when Amazon Transcribe starts searching for
+    -- the specified criteria in your audio. If you include @StartTime@ in your
+    -- request, you must also include @EndTime@.
+    startTime :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AbsoluteTimeRange' 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:
+--
+-- 'endTime', 'absoluteTimeRange_endTime' - The time, in milliseconds, when Amazon Transcribe stops searching for
+-- the specified criteria in your audio. If you include @EndTime@ in your
+-- request, you must also include @StartTime@.
+--
+-- 'first', 'absoluteTimeRange_first' - The time, in milliseconds, from the start of your media file until the
+-- specified value. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+--
+-- 'last', 'absoluteTimeRange_last' - The time, in milliseconds, from the specified value until the end of
+-- your media file. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+--
+-- 'startTime', 'absoluteTimeRange_startTime' - The time, in milliseconds, when Amazon Transcribe starts searching for
+-- the specified criteria in your audio. If you include @StartTime@ in your
+-- request, you must also include @EndTime@.
+newAbsoluteTimeRange ::
+  AbsoluteTimeRange
+newAbsoluteTimeRange =
+  AbsoluteTimeRange'
+    { endTime = Prelude.Nothing,
+      first = Prelude.Nothing,
+      last = Prelude.Nothing,
+      startTime = Prelude.Nothing
+    }
+
+-- | The time, in milliseconds, when Amazon Transcribe stops searching for
+-- the specified criteria in your audio. If you include @EndTime@ in your
+-- request, you must also include @StartTime@.
+absoluteTimeRange_endTime :: Lens.Lens' AbsoluteTimeRange (Prelude.Maybe Prelude.Natural)
+absoluteTimeRange_endTime = Lens.lens (\AbsoluteTimeRange' {endTime} -> endTime) (\s@AbsoluteTimeRange' {} a -> s {endTime = a} :: AbsoluteTimeRange)
+
+-- | The time, in milliseconds, from the start of your media file until the
+-- specified value. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+absoluteTimeRange_first :: Lens.Lens' AbsoluteTimeRange (Prelude.Maybe Prelude.Natural)
+absoluteTimeRange_first = Lens.lens (\AbsoluteTimeRange' {first} -> first) (\s@AbsoluteTimeRange' {} a -> s {first = a} :: AbsoluteTimeRange)
+
+-- | The time, in milliseconds, from the specified value until the end of
+-- your media file. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+absoluteTimeRange_last :: Lens.Lens' AbsoluteTimeRange (Prelude.Maybe Prelude.Natural)
+absoluteTimeRange_last = Lens.lens (\AbsoluteTimeRange' {last} -> last) (\s@AbsoluteTimeRange' {} a -> s {last = a} :: AbsoluteTimeRange)
+
+-- | The time, in milliseconds, when Amazon Transcribe starts searching for
+-- the specified criteria in your audio. If you include @StartTime@ in your
+-- request, you must also include @EndTime@.
+absoluteTimeRange_startTime :: Lens.Lens' AbsoluteTimeRange (Prelude.Maybe Prelude.Natural)
+absoluteTimeRange_startTime = Lens.lens (\AbsoluteTimeRange' {startTime} -> startTime) (\s@AbsoluteTimeRange' {} a -> s {startTime = a} :: AbsoluteTimeRange)
+
+instance Data.FromJSON AbsoluteTimeRange where
+  parseJSON =
+    Data.withObject
+      "AbsoluteTimeRange"
+      ( \x ->
+          AbsoluteTimeRange'
+            Prelude.<$> (x Data..:? "EndTime")
+            Prelude.<*> (x Data..:? "First")
+            Prelude.<*> (x Data..:? "Last")
+            Prelude.<*> (x Data..:? "StartTime")
+      )
+
+instance Prelude.Hashable AbsoluteTimeRange where
+  hashWithSalt _salt AbsoluteTimeRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` endTime
+      `Prelude.hashWithSalt` first
+      `Prelude.hashWithSalt` last
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData AbsoluteTimeRange where
+  rnf AbsoluteTimeRange' {..} =
+    Prelude.rnf endTime
+      `Prelude.seq` Prelude.rnf first
+      `Prelude.seq` Prelude.rnf last
+      `Prelude.seq` Prelude.rnf startTime
+
+instance Data.ToJSON AbsoluteTimeRange where
+  toJSON AbsoluteTimeRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("EndTime" Data..=) Prelude.<$> endTime,
+            ("First" Data..=) Prelude.<$> first,
+            ("Last" Data..=) Prelude.<$> last,
+            ("StartTime" Data..=) Prelude.<$> startTime
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/BaseModelName.hs b/gen/Amazonka/Transcribe/Types/BaseModelName.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/BaseModelName.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.Transcribe.Types.BaseModelName
+-- 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.Transcribe.Types.BaseModelName
+  ( BaseModelName
+      ( ..,
+        BaseModelName_NarrowBand,
+        BaseModelName_WideBand
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype BaseModelName = BaseModelName'
+  { fromBaseModelName ::
+      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 BaseModelName_NarrowBand :: BaseModelName
+pattern BaseModelName_NarrowBand = BaseModelName' "NarrowBand"
+
+pattern BaseModelName_WideBand :: BaseModelName
+pattern BaseModelName_WideBand = BaseModelName' "WideBand"
+
+{-# COMPLETE
+  BaseModelName_NarrowBand,
+  BaseModelName_WideBand,
+  BaseModelName'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/CLMLanguageCode.hs b/gen/Amazonka/Transcribe/Types/CLMLanguageCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CLMLanguageCode.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.Transcribe.Types.CLMLanguageCode
+-- 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.Transcribe.Types.CLMLanguageCode
+  ( CLMLanguageCode
+      ( ..,
+        CLMLanguageCode_De_DE,
+        CLMLanguageCode_En_AU,
+        CLMLanguageCode_En_GB,
+        CLMLanguageCode_En_US,
+        CLMLanguageCode_Es_US,
+        CLMLanguageCode_Hi_IN,
+        CLMLanguageCode_Ja_JP
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CLMLanguageCode = CLMLanguageCode'
+  { fromCLMLanguageCode ::
+      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 CLMLanguageCode_De_DE :: CLMLanguageCode
+pattern CLMLanguageCode_De_DE = CLMLanguageCode' "de-DE"
+
+pattern CLMLanguageCode_En_AU :: CLMLanguageCode
+pattern CLMLanguageCode_En_AU = CLMLanguageCode' "en-AU"
+
+pattern CLMLanguageCode_En_GB :: CLMLanguageCode
+pattern CLMLanguageCode_En_GB = CLMLanguageCode' "en-GB"
+
+pattern CLMLanguageCode_En_US :: CLMLanguageCode
+pattern CLMLanguageCode_En_US = CLMLanguageCode' "en-US"
+
+pattern CLMLanguageCode_Es_US :: CLMLanguageCode
+pattern CLMLanguageCode_Es_US = CLMLanguageCode' "es-US"
+
+pattern CLMLanguageCode_Hi_IN :: CLMLanguageCode
+pattern CLMLanguageCode_Hi_IN = CLMLanguageCode' "hi-IN"
+
+pattern CLMLanguageCode_Ja_JP :: CLMLanguageCode
+pattern CLMLanguageCode_Ja_JP = CLMLanguageCode' "ja-JP"
+
+{-# COMPLETE
+  CLMLanguageCode_De_DE,
+  CLMLanguageCode_En_AU,
+  CLMLanguageCode_En_GB,
+  CLMLanguageCode_En_US,
+  CLMLanguageCode_Es_US,
+  CLMLanguageCode_Hi_IN,
+  CLMLanguageCode_Ja_JP,
+  CLMLanguageCode'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/CallAnalyticsJob.hs b/gen/Amazonka/Transcribe/Types/CallAnalyticsJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CallAnalyticsJob.hs
@@ -0,0 +1,480 @@
+{-# 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.Transcribe.Types.CallAnalyticsJob
+-- 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.Transcribe.Types.CallAnalyticsJob 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.Transcribe.Types.CallAnalyticsJobSettings
+import Amazonka.Transcribe.Types.CallAnalyticsJobStatus
+import Amazonka.Transcribe.Types.ChannelDefinition
+import Amazonka.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.Media
+import Amazonka.Transcribe.Types.MediaFormat
+import Amazonka.Transcribe.Types.Transcript
+
+-- | Provides detailed information about a Call Analytics job.
+--
+-- To view the job\'s status, refer to @CallAnalyticsJobStatus@. If the
+-- status is @COMPLETED@, the job is finished. You can find your completed
+-- transcript at the URI specified in @TranscriptFileUri@. If the status is
+-- @FAILED@, @FailureReason@ provides details on why your transcription job
+-- failed.
+--
+-- If you enabled personally identifiable information (PII) redaction, the
+-- redacted transcript appears at the location specified in
+-- @RedactedTranscriptFileUri@.
+--
+-- If you chose to redact the audio in your media file, you can find your
+-- redacted media file at the location specified in the
+-- @RedactedMediaFileUri@ field of your response.
+--
+-- /See:/ 'newCallAnalyticsJob' smart constructor.
+data CallAnalyticsJob = CallAnalyticsJob'
+  { -- | The name of the Call Analytics job. Job names are case sensitive and
+    -- must be unique within an Amazon Web Services account.
+    callAnalyticsJobName :: Prelude.Maybe Prelude.Text,
+    -- | Provides the status of the specified Call Analytics job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@ (or
+    -- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+    -- the status is @FAILED@, @FailureReason@ provides details on why your
+    -- transcription job failed.
+    callAnalyticsJobStatus :: Prelude.Maybe CallAnalyticsJobStatus,
+    -- | Indicates which speaker is on which channel.
+    channelDefinitions :: Prelude.Maybe (Prelude.NonEmpty ChannelDefinition),
+    -- | The date and time the specified Call Analytics job finished processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | The date and time the specified Call Analytics job request was made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) you included in your request.
+    dataAccessRoleArn :: Prelude.Maybe Prelude.Text,
+    -- | If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the Call Analytics job request failed.
+    --
+    -- The @FailureReason@ field contains one of the following values:
+    --
+    -- -   @Unsupported media format@.
+    --
+    --     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+    --     __MediaFormat__ for a list of supported formats.
+    --
+    -- -   @The media format provided does not match the detected media format@.
+    --
+    --     The media format specified in @MediaFormat@ doesn\'t match the
+    --     format of the input file. Check the media format of your media file
+    --     and correct the specified value.
+    --
+    -- -   @Invalid sample rate for audio file@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+    --     The sample rate must be between 8,000 and 48,000 hertz.
+    --
+    -- -   @The sample rate provided does not match the detected sample rate@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+    --     the sample rate detected in your input media file. Check the sample
+    --     rate of your media file and correct the specified value.
+    --
+    -- -   @Invalid file size: file size too large@.
+    --
+    --     The size of your media file is larger than what Amazon Transcribe
+    --     can process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    --
+    -- -   @Invalid number of channels: number of channels too large@.
+    --
+    --     Your audio contains more channels than Amazon Transcribe is able to
+    --     process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The confidence score associated with the language identified in your
+    -- media file.
+    --
+    -- Confidence scores are values between 0 and 1; a larger value indicates a
+    -- higher probability that the identified language correctly matches the
+    -- language spoken in your media.
+    identifiedLanguageScore :: Prelude.Maybe Prelude.Double,
+    -- | The language code used to create your Call Analytics job. For a list of
+    -- supported languages and their associated language codes, refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    --
+    -- If you don\'t know the language spoken in your media file, you can omit
+    -- this field and let Amazon Transcribe automatically identify the language
+    -- of your media. To improve the accuracy of language identification, you
+    -- can include several language codes and Amazon Transcribe chooses the
+    -- closest match for your transcription.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | Provides the Amazon S3 location of the media file you used in your Call
+    -- Analytics request.
+    media :: Prelude.Maybe Media,
+    -- | The format of the input media file.
+    mediaFormat :: Prelude.Maybe MediaFormat,
+    -- | The sample rate, in hertz, of the audio track in your input media file.
+    mediaSampleRateHertz :: Prelude.Maybe Prelude.Natural,
+    -- | Provides information on any additional settings that were included in
+    -- your request. Additional settings include content redaction and language
+    -- identification settings.
+    settings :: Prelude.Maybe CallAnalyticsJobSettings,
+    -- | The date and time the specified Call Analytics job began processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX,
+    transcript :: Prelude.Maybe Transcript
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CallAnalyticsJob' 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:
+--
+-- 'callAnalyticsJobName', 'callAnalyticsJob_callAnalyticsJobName' - The name of the Call Analytics job. Job names are case sensitive and
+-- must be unique within an Amazon Web Services account.
+--
+-- 'callAnalyticsJobStatus', 'callAnalyticsJob_callAnalyticsJobStatus' - Provides the status of the specified Call Analytics job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+--
+-- 'channelDefinitions', 'callAnalyticsJob_channelDefinitions' - Indicates which speaker is on which channel.
+--
+-- 'completionTime', 'callAnalyticsJob_completionTime' - The date and time the specified Call Analytics job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'creationTime', 'callAnalyticsJob_creationTime' - The date and time the specified Call Analytics job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'dataAccessRoleArn', 'callAnalyticsJob_dataAccessRoleArn' - The Amazon Resource Name (ARN) you included in your request.
+--
+-- 'failureReason', 'callAnalyticsJob_failureReason' - If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the Call Analytics job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 8,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- 'identifiedLanguageScore', 'callAnalyticsJob_identifiedLanguageScore' - The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+--
+-- 'languageCode', 'callAnalyticsJob_languageCode' - The language code used to create your Call Analytics job. For a list of
+-- supported languages and their associated language codes, refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- If you don\'t know the language spoken in your media file, you can omit
+-- this field and let Amazon Transcribe automatically identify the language
+-- of your media. To improve the accuracy of language identification, you
+-- can include several language codes and Amazon Transcribe chooses the
+-- closest match for your transcription.
+--
+-- 'media', 'callAnalyticsJob_media' - Provides the Amazon S3 location of the media file you used in your Call
+-- Analytics request.
+--
+-- 'mediaFormat', 'callAnalyticsJob_mediaFormat' - The format of the input media file.
+--
+-- 'mediaSampleRateHertz', 'callAnalyticsJob_mediaSampleRateHertz' - The sample rate, in hertz, of the audio track in your input media file.
+--
+-- 'settings', 'callAnalyticsJob_settings' - Provides information on any additional settings that were included in
+-- your request. Additional settings include content redaction and language
+-- identification settings.
+--
+-- 'startTime', 'callAnalyticsJob_startTime' - The date and time the specified Call Analytics job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'transcript', 'callAnalyticsJob_transcript' - Undocumented member.
+newCallAnalyticsJob ::
+  CallAnalyticsJob
+newCallAnalyticsJob =
+  CallAnalyticsJob'
+    { callAnalyticsJobName =
+        Prelude.Nothing,
+      callAnalyticsJobStatus = Prelude.Nothing,
+      channelDefinitions = Prelude.Nothing,
+      completionTime = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      dataAccessRoleArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      identifiedLanguageScore = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      media = Prelude.Nothing,
+      mediaFormat = Prelude.Nothing,
+      mediaSampleRateHertz = Prelude.Nothing,
+      settings = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      transcript = Prelude.Nothing
+    }
+
+-- | The name of the Call Analytics job. Job names are case sensitive and
+-- must be unique within an Amazon Web Services account.
+callAnalyticsJob_callAnalyticsJobName :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.Text)
+callAnalyticsJob_callAnalyticsJobName = Lens.lens (\CallAnalyticsJob' {callAnalyticsJobName} -> callAnalyticsJobName) (\s@CallAnalyticsJob' {} a -> s {callAnalyticsJobName = a} :: CallAnalyticsJob)
+
+-- | Provides the status of the specified Call Analytics job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+callAnalyticsJob_callAnalyticsJobStatus :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe CallAnalyticsJobStatus)
+callAnalyticsJob_callAnalyticsJobStatus = Lens.lens (\CallAnalyticsJob' {callAnalyticsJobStatus} -> callAnalyticsJobStatus) (\s@CallAnalyticsJob' {} a -> s {callAnalyticsJobStatus = a} :: CallAnalyticsJob)
+
+-- | Indicates which speaker is on which channel.
+callAnalyticsJob_channelDefinitions :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe (Prelude.NonEmpty ChannelDefinition))
+callAnalyticsJob_channelDefinitions = Lens.lens (\CallAnalyticsJob' {channelDefinitions} -> channelDefinitions) (\s@CallAnalyticsJob' {} a -> s {channelDefinitions = a} :: CallAnalyticsJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The date and time the specified Call Analytics job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+callAnalyticsJob_completionTime :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJob_completionTime = Lens.lens (\CallAnalyticsJob' {completionTime} -> completionTime) (\s@CallAnalyticsJob' {} a -> s {completionTime = a} :: CallAnalyticsJob) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time the specified Call Analytics job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+callAnalyticsJob_creationTime :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJob_creationTime = Lens.lens (\CallAnalyticsJob' {creationTime} -> creationTime) (\s@CallAnalyticsJob' {} a -> s {creationTime = a} :: CallAnalyticsJob) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) you included in your request.
+callAnalyticsJob_dataAccessRoleArn :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.Text)
+callAnalyticsJob_dataAccessRoleArn = Lens.lens (\CallAnalyticsJob' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@CallAnalyticsJob' {} a -> s {dataAccessRoleArn = a} :: CallAnalyticsJob)
+
+-- | If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the Call Analytics job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 8,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+callAnalyticsJob_failureReason :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.Text)
+callAnalyticsJob_failureReason = Lens.lens (\CallAnalyticsJob' {failureReason} -> failureReason) (\s@CallAnalyticsJob' {} a -> s {failureReason = a} :: CallAnalyticsJob)
+
+-- | The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+callAnalyticsJob_identifiedLanguageScore :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.Double)
+callAnalyticsJob_identifiedLanguageScore = Lens.lens (\CallAnalyticsJob' {identifiedLanguageScore} -> identifiedLanguageScore) (\s@CallAnalyticsJob' {} a -> s {identifiedLanguageScore = a} :: CallAnalyticsJob)
+
+-- | The language code used to create your Call Analytics job. For a list of
+-- supported languages and their associated language codes, refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- If you don\'t know the language spoken in your media file, you can omit
+-- this field and let Amazon Transcribe automatically identify the language
+-- of your media. To improve the accuracy of language identification, you
+-- can include several language codes and Amazon Transcribe chooses the
+-- closest match for your transcription.
+callAnalyticsJob_languageCode :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe LanguageCode)
+callAnalyticsJob_languageCode = Lens.lens (\CallAnalyticsJob' {languageCode} -> languageCode) (\s@CallAnalyticsJob' {} a -> s {languageCode = a} :: CallAnalyticsJob)
+
+-- | Provides the Amazon S3 location of the media file you used in your Call
+-- Analytics request.
+callAnalyticsJob_media :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Media)
+callAnalyticsJob_media = Lens.lens (\CallAnalyticsJob' {media} -> media) (\s@CallAnalyticsJob' {} a -> s {media = a} :: CallAnalyticsJob)
+
+-- | The format of the input media file.
+callAnalyticsJob_mediaFormat :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe MediaFormat)
+callAnalyticsJob_mediaFormat = Lens.lens (\CallAnalyticsJob' {mediaFormat} -> mediaFormat) (\s@CallAnalyticsJob' {} a -> s {mediaFormat = a} :: CallAnalyticsJob)
+
+-- | The sample rate, in hertz, of the audio track in your input media file.
+callAnalyticsJob_mediaSampleRateHertz :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.Natural)
+callAnalyticsJob_mediaSampleRateHertz = Lens.lens (\CallAnalyticsJob' {mediaSampleRateHertz} -> mediaSampleRateHertz) (\s@CallAnalyticsJob' {} a -> s {mediaSampleRateHertz = a} :: CallAnalyticsJob)
+
+-- | Provides information on any additional settings that were included in
+-- your request. Additional settings include content redaction and language
+-- identification settings.
+callAnalyticsJob_settings :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe CallAnalyticsJobSettings)
+callAnalyticsJob_settings = Lens.lens (\CallAnalyticsJob' {settings} -> settings) (\s@CallAnalyticsJob' {} a -> s {settings = a} :: CallAnalyticsJob)
+
+-- | The date and time the specified Call Analytics job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+callAnalyticsJob_startTime :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJob_startTime = Lens.lens (\CallAnalyticsJob' {startTime} -> startTime) (\s@CallAnalyticsJob' {} a -> s {startTime = a} :: CallAnalyticsJob) Prelude.. Lens.mapping Data._Time
+
+-- | Undocumented member.
+callAnalyticsJob_transcript :: Lens.Lens' CallAnalyticsJob (Prelude.Maybe Transcript)
+callAnalyticsJob_transcript = Lens.lens (\CallAnalyticsJob' {transcript} -> transcript) (\s@CallAnalyticsJob' {} a -> s {transcript = a} :: CallAnalyticsJob)
+
+instance Data.FromJSON CallAnalyticsJob where
+  parseJSON =
+    Data.withObject
+      "CallAnalyticsJob"
+      ( \x ->
+          CallAnalyticsJob'
+            Prelude.<$> (x Data..:? "CallAnalyticsJobName")
+            Prelude.<*> (x Data..:? "CallAnalyticsJobStatus")
+            Prelude.<*> (x Data..:? "ChannelDefinitions")
+            Prelude.<*> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "DataAccessRoleArn")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "IdentifiedLanguageScore")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "Media")
+            Prelude.<*> (x Data..:? "MediaFormat")
+            Prelude.<*> (x Data..:? "MediaSampleRateHertz")
+            Prelude.<*> (x Data..:? "Settings")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "Transcript")
+      )
+
+instance Prelude.Hashable CallAnalyticsJob where
+  hashWithSalt _salt CallAnalyticsJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` callAnalyticsJobName
+      `Prelude.hashWithSalt` callAnalyticsJobStatus
+      `Prelude.hashWithSalt` channelDefinitions
+      `Prelude.hashWithSalt` completionTime
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` dataAccessRoleArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` identifiedLanguageScore
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` media
+      `Prelude.hashWithSalt` mediaFormat
+      `Prelude.hashWithSalt` mediaSampleRateHertz
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` transcript
+
+instance Prelude.NFData CallAnalyticsJob where
+  rnf CallAnalyticsJob' {..} =
+    Prelude.rnf callAnalyticsJobName
+      `Prelude.seq` Prelude.rnf callAnalyticsJobStatus
+      `Prelude.seq` Prelude.rnf channelDefinitions
+      `Prelude.seq` Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf identifiedLanguageScore
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf media
+      `Prelude.seq` Prelude.rnf mediaFormat
+      `Prelude.seq` Prelude.rnf mediaSampleRateHertz
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf transcript
diff --git a/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSettings.hs b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSettings.hs
@@ -0,0 +1,361 @@
+{-# 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.Transcribe.Types.CallAnalyticsJobSettings
+-- 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.Transcribe.Types.CallAnalyticsJobSettings 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.Transcribe.Types.ContentRedaction
+import Amazonka.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.LanguageIdSettings
+import Amazonka.Transcribe.Types.VocabularyFilterMethod
+
+-- | Provides additional optional settings for your request, including
+-- content redaction, automatic language identification; allows you to
+-- apply custom language models, custom vocabulary filters, and custom
+-- vocabularies.
+--
+-- /See:/ 'newCallAnalyticsJobSettings' smart constructor.
+data CallAnalyticsJobSettings = CallAnalyticsJobSettings'
+  { contentRedaction :: Prelude.Maybe ContentRedaction,
+    -- | If using automatic language identification in your request and you want
+    -- to apply a custom language model, a custom vocabulary, or a custom
+    -- vocabulary filter, include @LanguageIdSettings@ with the relevant
+    -- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+    -- @VocabularyFilterName@).
+    --
+    -- @LanguageIdSettings@ supports two to five language codes. Each language
+    -- code you include can have an associated custom language model, custom
+    -- vocabulary, and custom vocabulary filter. The language codes that you
+    -- specify must match the languages of the associated custom language
+    -- models, custom vocabularies, and custom vocabulary filters.
+    --
+    -- It\'s recommended that you include @LanguageOptions@ when using
+    -- @LanguageIdSettings@ to ensure that the correct language dialect is
+    -- identified. For example, if you specify a custom vocabulary that is in
+    -- @en-US@ but Amazon Transcribe determines that the language spoken in
+    -- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+    -- transcription. If you include @LanguageOptions@ and include @en-US@ as
+    -- the only English language dialect, your custom vocabulary /is/ applied
+    -- to your transcription.
+    --
+    -- If you want to include a custom language model, custom vocabulary, or
+    -- custom vocabulary filter with your request but __do not__ want to use
+    -- automatic language identification, use instead the parameter with the
+    -- @LanguageModelName@, @VocabularyName@, or @VocabularyFilterName@
+    -- sub-parameters.
+    --
+    -- For a list of languages supported with Call Analytics, refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages and language-specific features>.
+    languageIdSettings :: Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings),
+    -- | The name of the custom language model you want to use when processing
+    -- your Call Analytics job. Note that custom language model names are case
+    -- sensitive.
+    --
+    -- The language of the specified custom language model must match the
+    -- language code that you specify in your transcription request. If the
+    -- languages don\'t match, the custom language model isn\'t applied. There
+    -- are no errors or warnings associated with a language mismatch.
+    languageModelName :: Prelude.Maybe Prelude.Text,
+    -- | You can specify two or more language codes that represent the languages
+    -- you think may be present in your media. Including more than five is not
+    -- recommended. If you\'re unsure what languages are present, do not
+    -- include this parameter.
+    --
+    -- Including language options can improve the accuracy of language
+    -- identification.
+    --
+    -- For a list of languages supported with Call Analytics, refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    --
+    -- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+    -- file must be encoded at a sample rate of 16,000 Hz or higher.
+    languageOptions :: Prelude.Maybe (Prelude.NonEmpty LanguageCode),
+    -- | Specify how you want your custom vocabulary filter applied to your
+    -- transcript.
+    --
+    -- To replace words with @***@, choose @mask@.
+    --
+    -- To delete words, choose @remove@.
+    --
+    -- To flag words without changing them, choose @tag@.
+    vocabularyFilterMethod :: Prelude.Maybe VocabularyFilterMethod,
+    -- | The name of the custom vocabulary filter you want to include in your
+    -- Call Analytics transcription request. Custom vocabulary filter names are
+    -- case sensitive.
+    --
+    -- Note that if you include @VocabularyFilterName@ in your request, you
+    -- must also include @VocabularyFilterMethod@.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the custom vocabulary you want to include in your Call
+    -- Analytics transcription request. Custom vocabulary names are case
+    -- sensitive.
+    vocabularyName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CallAnalyticsJobSettings' 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:
+--
+-- 'contentRedaction', 'callAnalyticsJobSettings_contentRedaction' - Undocumented member.
+--
+-- 'languageIdSettings', 'callAnalyticsJobSettings_languageIdSettings' - If using automatic language identification in your request and you want
+-- to apply a custom language model, a custom vocabulary, or a custom
+-- vocabulary filter, include @LanguageIdSettings@ with the relevant
+-- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+-- @VocabularyFilterName@).
+--
+-- @LanguageIdSettings@ supports two to five language codes. Each language
+-- code you include can have an associated custom language model, custom
+-- vocabulary, and custom vocabulary filter. The language codes that you
+-- specify must match the languages of the associated custom language
+-- models, custom vocabularies, and custom vocabulary filters.
+--
+-- It\'s recommended that you include @LanguageOptions@ when using
+-- @LanguageIdSettings@ to ensure that the correct language dialect is
+-- identified. For example, if you specify a custom vocabulary that is in
+-- @en-US@ but Amazon Transcribe determines that the language spoken in
+-- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+-- transcription. If you include @LanguageOptions@ and include @en-US@ as
+-- the only English language dialect, your custom vocabulary /is/ applied
+-- to your transcription.
+--
+-- If you want to include a custom language model, custom vocabulary, or
+-- custom vocabulary filter with your request but __do not__ want to use
+-- automatic language identification, use instead the parameter with the
+-- @LanguageModelName@, @VocabularyName@, or @VocabularyFilterName@
+-- sub-parameters.
+--
+-- For a list of languages supported with Call Analytics, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages and language-specific features>.
+--
+-- 'languageModelName', 'callAnalyticsJobSettings_languageModelName' - The name of the custom language model you want to use when processing
+-- your Call Analytics job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+--
+-- 'languageOptions', 'callAnalyticsJobSettings_languageOptions' - You can specify two or more language codes that represent the languages
+-- you think may be present in your media. Including more than five is not
+-- recommended. If you\'re unsure what languages are present, do not
+-- include this parameter.
+--
+-- Including language options can improve the accuracy of language
+-- identification.
+--
+-- For a list of languages supported with Call Analytics, refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+--
+-- 'vocabularyFilterMethod', 'callAnalyticsJobSettings_vocabularyFilterMethod' - Specify how you want your custom vocabulary filter applied to your
+-- transcript.
+--
+-- To replace words with @***@, choose @mask@.
+--
+-- To delete words, choose @remove@.
+--
+-- To flag words without changing them, choose @tag@.
+--
+-- 'vocabularyFilterName', 'callAnalyticsJobSettings_vocabularyFilterName' - The name of the custom vocabulary filter you want to include in your
+-- Call Analytics transcription request. Custom vocabulary filter names are
+-- case sensitive.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+--
+-- 'vocabularyName', 'callAnalyticsJobSettings_vocabularyName' - The name of the custom vocabulary you want to include in your Call
+-- Analytics transcription request. Custom vocabulary names are case
+-- sensitive.
+newCallAnalyticsJobSettings ::
+  CallAnalyticsJobSettings
+newCallAnalyticsJobSettings =
+  CallAnalyticsJobSettings'
+    { contentRedaction =
+        Prelude.Nothing,
+      languageIdSettings = Prelude.Nothing,
+      languageModelName = Prelude.Nothing,
+      languageOptions = Prelude.Nothing,
+      vocabularyFilterMethod = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+callAnalyticsJobSettings_contentRedaction :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe ContentRedaction)
+callAnalyticsJobSettings_contentRedaction = Lens.lens (\CallAnalyticsJobSettings' {contentRedaction} -> contentRedaction) (\s@CallAnalyticsJobSettings' {} a -> s {contentRedaction = a} :: CallAnalyticsJobSettings)
+
+-- | If using automatic language identification in your request and you want
+-- to apply a custom language model, a custom vocabulary, or a custom
+-- vocabulary filter, include @LanguageIdSettings@ with the relevant
+-- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+-- @VocabularyFilterName@).
+--
+-- @LanguageIdSettings@ supports two to five language codes. Each language
+-- code you include can have an associated custom language model, custom
+-- vocabulary, and custom vocabulary filter. The language codes that you
+-- specify must match the languages of the associated custom language
+-- models, custom vocabularies, and custom vocabulary filters.
+--
+-- It\'s recommended that you include @LanguageOptions@ when using
+-- @LanguageIdSettings@ to ensure that the correct language dialect is
+-- identified. For example, if you specify a custom vocabulary that is in
+-- @en-US@ but Amazon Transcribe determines that the language spoken in
+-- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+-- transcription. If you include @LanguageOptions@ and include @en-US@ as
+-- the only English language dialect, your custom vocabulary /is/ applied
+-- to your transcription.
+--
+-- If you want to include a custom language model, custom vocabulary, or
+-- custom vocabulary filter with your request but __do not__ want to use
+-- automatic language identification, use instead the parameter with the
+-- @LanguageModelName@, @VocabularyName@, or @VocabularyFilterName@
+-- sub-parameters.
+--
+-- For a list of languages supported with Call Analytics, refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages and language-specific features>.
+callAnalyticsJobSettings_languageIdSettings :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings))
+callAnalyticsJobSettings_languageIdSettings = Lens.lens (\CallAnalyticsJobSettings' {languageIdSettings} -> languageIdSettings) (\s@CallAnalyticsJobSettings' {} a -> s {languageIdSettings = a} :: CallAnalyticsJobSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the custom language model you want to use when processing
+-- your Call Analytics job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+callAnalyticsJobSettings_languageModelName :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe Prelude.Text)
+callAnalyticsJobSettings_languageModelName = Lens.lens (\CallAnalyticsJobSettings' {languageModelName} -> languageModelName) (\s@CallAnalyticsJobSettings' {} a -> s {languageModelName = a} :: CallAnalyticsJobSettings)
+
+-- | You can specify two or more language codes that represent the languages
+-- you think may be present in your media. Including more than five is not
+-- recommended. If you\'re unsure what languages are present, do not
+-- include this parameter.
+--
+-- Including language options can improve the accuracy of language
+-- identification.
+--
+-- For a list of languages supported with Call Analytics, refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- To transcribe speech in Modern Standard Arabic (@ar-SA@), your media
+-- file must be encoded at a sample rate of 16,000 Hz or higher.
+callAnalyticsJobSettings_languageOptions :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe (Prelude.NonEmpty LanguageCode))
+callAnalyticsJobSettings_languageOptions = Lens.lens (\CallAnalyticsJobSettings' {languageOptions} -> languageOptions) (\s@CallAnalyticsJobSettings' {} a -> s {languageOptions = a} :: CallAnalyticsJobSettings) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify how you want your custom vocabulary filter applied to your
+-- transcript.
+--
+-- To replace words with @***@, choose @mask@.
+--
+-- To delete words, choose @remove@.
+--
+-- To flag words without changing them, choose @tag@.
+callAnalyticsJobSettings_vocabularyFilterMethod :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe VocabularyFilterMethod)
+callAnalyticsJobSettings_vocabularyFilterMethod = Lens.lens (\CallAnalyticsJobSettings' {vocabularyFilterMethod} -> vocabularyFilterMethod) (\s@CallAnalyticsJobSettings' {} a -> s {vocabularyFilterMethod = a} :: CallAnalyticsJobSettings)
+
+-- | The name of the custom vocabulary filter you want to include in your
+-- Call Analytics transcription request. Custom vocabulary filter names are
+-- case sensitive.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+callAnalyticsJobSettings_vocabularyFilterName :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe Prelude.Text)
+callAnalyticsJobSettings_vocabularyFilterName = Lens.lens (\CallAnalyticsJobSettings' {vocabularyFilterName} -> vocabularyFilterName) (\s@CallAnalyticsJobSettings' {} a -> s {vocabularyFilterName = a} :: CallAnalyticsJobSettings)
+
+-- | The name of the custom vocabulary you want to include in your Call
+-- Analytics transcription request. Custom vocabulary names are case
+-- sensitive.
+callAnalyticsJobSettings_vocabularyName :: Lens.Lens' CallAnalyticsJobSettings (Prelude.Maybe Prelude.Text)
+callAnalyticsJobSettings_vocabularyName = Lens.lens (\CallAnalyticsJobSettings' {vocabularyName} -> vocabularyName) (\s@CallAnalyticsJobSettings' {} a -> s {vocabularyName = a} :: CallAnalyticsJobSettings)
+
+instance Data.FromJSON CallAnalyticsJobSettings where
+  parseJSON =
+    Data.withObject
+      "CallAnalyticsJobSettings"
+      ( \x ->
+          CallAnalyticsJobSettings'
+            Prelude.<$> (x Data..:? "ContentRedaction")
+            Prelude.<*> ( x
+                            Data..:? "LanguageIdSettings"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "LanguageModelName")
+            Prelude.<*> (x Data..:? "LanguageOptions")
+            Prelude.<*> (x Data..:? "VocabularyFilterMethod")
+            Prelude.<*> (x Data..:? "VocabularyFilterName")
+            Prelude.<*> (x Data..:? "VocabularyName")
+      )
+
+instance Prelude.Hashable CallAnalyticsJobSettings where
+  hashWithSalt _salt CallAnalyticsJobSettings' {..} =
+    _salt
+      `Prelude.hashWithSalt` contentRedaction
+      `Prelude.hashWithSalt` languageIdSettings
+      `Prelude.hashWithSalt` languageModelName
+      `Prelude.hashWithSalt` languageOptions
+      `Prelude.hashWithSalt` vocabularyFilterMethod
+      `Prelude.hashWithSalt` vocabularyFilterName
+      `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData CallAnalyticsJobSettings where
+  rnf CallAnalyticsJobSettings' {..} =
+    Prelude.rnf contentRedaction
+      `Prelude.seq` Prelude.rnf languageIdSettings
+      `Prelude.seq` Prelude.rnf languageModelName
+      `Prelude.seq` Prelude.rnf languageOptions
+      `Prelude.seq` Prelude.rnf vocabularyFilterMethod
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf vocabularyName
+
+instance Data.ToJSON CallAnalyticsJobSettings where
+  toJSON CallAnalyticsJobSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ContentRedaction" Data..=)
+              Prelude.<$> contentRedaction,
+            ("LanguageIdSettings" Data..=)
+              Prelude.<$> languageIdSettings,
+            ("LanguageModelName" Data..=)
+              Prelude.<$> languageModelName,
+            ("LanguageOptions" Data..=)
+              Prelude.<$> languageOptions,
+            ("VocabularyFilterMethod" Data..=)
+              Prelude.<$> vocabularyFilterMethod,
+            ("VocabularyFilterName" Data..=)
+              Prelude.<$> vocabularyFilterName,
+            ("VocabularyName" Data..=)
+              Prelude.<$> vocabularyName
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/CallAnalyticsJobStatus.hs b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobStatus.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.Transcribe.Types.CallAnalyticsJobStatus
+-- 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.Transcribe.Types.CallAnalyticsJobStatus
+  ( CallAnalyticsJobStatus
+      ( ..,
+        CallAnalyticsJobStatus_COMPLETED,
+        CallAnalyticsJobStatus_FAILED,
+        CallAnalyticsJobStatus_IN_PROGRESS,
+        CallAnalyticsJobStatus_QUEUED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype CallAnalyticsJobStatus = CallAnalyticsJobStatus'
+  { fromCallAnalyticsJobStatus ::
+      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 CallAnalyticsJobStatus_COMPLETED :: CallAnalyticsJobStatus
+pattern CallAnalyticsJobStatus_COMPLETED = CallAnalyticsJobStatus' "COMPLETED"
+
+pattern CallAnalyticsJobStatus_FAILED :: CallAnalyticsJobStatus
+pattern CallAnalyticsJobStatus_FAILED = CallAnalyticsJobStatus' "FAILED"
+
+pattern CallAnalyticsJobStatus_IN_PROGRESS :: CallAnalyticsJobStatus
+pattern CallAnalyticsJobStatus_IN_PROGRESS = CallAnalyticsJobStatus' "IN_PROGRESS"
+
+pattern CallAnalyticsJobStatus_QUEUED :: CallAnalyticsJobStatus
+pattern CallAnalyticsJobStatus_QUEUED = CallAnalyticsJobStatus' "QUEUED"
+
+{-# COMPLETE
+  CallAnalyticsJobStatus_COMPLETED,
+  CallAnalyticsJobStatus_FAILED,
+  CallAnalyticsJobStatus_IN_PROGRESS,
+  CallAnalyticsJobStatus_QUEUED,
+  CallAnalyticsJobStatus'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSummary.hs b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CallAnalyticsJobSummary.hs
@@ -0,0 +1,210 @@
+{-# 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.Transcribe.Types.CallAnalyticsJobSummary
+-- 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.Transcribe.Types.CallAnalyticsJobSummary 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.Transcribe.Types.CallAnalyticsJobStatus
+import Amazonka.Transcribe.Types.LanguageCode
+
+-- | Provides detailed information about a specific Call Analytics job.
+--
+-- /See:/ 'newCallAnalyticsJobSummary' smart constructor.
+data CallAnalyticsJobSummary = CallAnalyticsJobSummary'
+  { -- | The name of the Call Analytics job. Job names are case sensitive and
+    -- must be unique within an Amazon Web Services account.
+    callAnalyticsJobName :: Prelude.Maybe Prelude.Text,
+    -- | Provides the status of your Call Analytics job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@ (or
+    -- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+    -- the status is @FAILED@, @FailureReason@ provides details on why your
+    -- transcription job failed.
+    callAnalyticsJobStatus :: Prelude.Maybe CallAnalyticsJobStatus,
+    -- | The date and time the specified Call Analytics job finished processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | The date and time the specified Call Analytics job request was made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the Call Analytics job failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code used to create your Call Analytics transcription.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time your Call Analytics job began processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CallAnalyticsJobSummary' 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:
+--
+-- 'callAnalyticsJobName', 'callAnalyticsJobSummary_callAnalyticsJobName' - The name of the Call Analytics job. Job names are case sensitive and
+-- must be unique within an Amazon Web Services account.
+--
+-- 'callAnalyticsJobStatus', 'callAnalyticsJobSummary_callAnalyticsJobStatus' - Provides the status of your Call Analytics job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+--
+-- 'completionTime', 'callAnalyticsJobSummary_completionTime' - The date and time the specified Call Analytics job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'creationTime', 'callAnalyticsJobSummary_creationTime' - The date and time the specified Call Analytics job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'failureReason', 'callAnalyticsJobSummary_failureReason' - If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the Call Analytics job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'callAnalyticsJobSummary_languageCode' - The language code used to create your Call Analytics transcription.
+--
+-- 'startTime', 'callAnalyticsJobSummary_startTime' - The date and time your Call Analytics job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+newCallAnalyticsJobSummary ::
+  CallAnalyticsJobSummary
+newCallAnalyticsJobSummary =
+  CallAnalyticsJobSummary'
+    { callAnalyticsJobName =
+        Prelude.Nothing,
+      callAnalyticsJobStatus = Prelude.Nothing,
+      completionTime = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      startTime = Prelude.Nothing
+    }
+
+-- | The name of the Call Analytics job. Job names are case sensitive and
+-- must be unique within an Amazon Web Services account.
+callAnalyticsJobSummary_callAnalyticsJobName :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe Prelude.Text)
+callAnalyticsJobSummary_callAnalyticsJobName = Lens.lens (\CallAnalyticsJobSummary' {callAnalyticsJobName} -> callAnalyticsJobName) (\s@CallAnalyticsJobSummary' {} a -> s {callAnalyticsJobName = a} :: CallAnalyticsJobSummary)
+
+-- | Provides the status of your Call Analytics job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+callAnalyticsJobSummary_callAnalyticsJobStatus :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe CallAnalyticsJobStatus)
+callAnalyticsJobSummary_callAnalyticsJobStatus = Lens.lens (\CallAnalyticsJobSummary' {callAnalyticsJobStatus} -> callAnalyticsJobStatus) (\s@CallAnalyticsJobSummary' {} a -> s {callAnalyticsJobStatus = a} :: CallAnalyticsJobSummary)
+
+-- | The date and time the specified Call Analytics job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+callAnalyticsJobSummary_completionTime :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJobSummary_completionTime = Lens.lens (\CallAnalyticsJobSummary' {completionTime} -> completionTime) (\s@CallAnalyticsJobSummary' {} a -> s {completionTime = a} :: CallAnalyticsJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time the specified Call Analytics job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+callAnalyticsJobSummary_creationTime :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJobSummary_creationTime = Lens.lens (\CallAnalyticsJobSummary' {creationTime} -> creationTime) (\s@CallAnalyticsJobSummary' {} a -> s {creationTime = a} :: CallAnalyticsJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If @CallAnalyticsJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the Call Analytics job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+callAnalyticsJobSummary_failureReason :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe Prelude.Text)
+callAnalyticsJobSummary_failureReason = Lens.lens (\CallAnalyticsJobSummary' {failureReason} -> failureReason) (\s@CallAnalyticsJobSummary' {} a -> s {failureReason = a} :: CallAnalyticsJobSummary)
+
+-- | The language code used to create your Call Analytics transcription.
+callAnalyticsJobSummary_languageCode :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe LanguageCode)
+callAnalyticsJobSummary_languageCode = Lens.lens (\CallAnalyticsJobSummary' {languageCode} -> languageCode) (\s@CallAnalyticsJobSummary' {} a -> s {languageCode = a} :: CallAnalyticsJobSummary)
+
+-- | The date and time your Call Analytics job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+callAnalyticsJobSummary_startTime :: Lens.Lens' CallAnalyticsJobSummary (Prelude.Maybe Prelude.UTCTime)
+callAnalyticsJobSummary_startTime = Lens.lens (\CallAnalyticsJobSummary' {startTime} -> startTime) (\s@CallAnalyticsJobSummary' {} a -> s {startTime = a} :: CallAnalyticsJobSummary) Prelude.. Lens.mapping Data._Time
+
+instance Data.FromJSON CallAnalyticsJobSummary where
+  parseJSON =
+    Data.withObject
+      "CallAnalyticsJobSummary"
+      ( \x ->
+          CallAnalyticsJobSummary'
+            Prelude.<$> (x Data..:? "CallAnalyticsJobName")
+            Prelude.<*> (x Data..:? "CallAnalyticsJobStatus")
+            Prelude.<*> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "StartTime")
+      )
+
+instance Prelude.Hashable CallAnalyticsJobSummary where
+  hashWithSalt _salt CallAnalyticsJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` callAnalyticsJobName
+      `Prelude.hashWithSalt` callAnalyticsJobStatus
+      `Prelude.hashWithSalt` completionTime
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` startTime
+
+instance Prelude.NFData CallAnalyticsJobSummary where
+  rnf CallAnalyticsJobSummary' {..} =
+    Prelude.rnf callAnalyticsJobName
+      `Prelude.seq` Prelude.rnf callAnalyticsJobStatus
+      `Prelude.seq` Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf startTime
diff --git a/gen/Amazonka/Transcribe/Types/CategoryProperties.hs b/gen/Amazonka/Transcribe/Types/CategoryProperties.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/CategoryProperties.hs
@@ -0,0 +1,166 @@
+{-# 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.Transcribe.Types.CategoryProperties
+-- 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.Transcribe.Types.CategoryProperties 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.Transcribe.Types.InputType
+import Amazonka.Transcribe.Types.Rule
+
+-- | Provides you with the properties of the Call Analytics category you
+-- specified in your request. This includes the list of rules that define
+-- the specified category.
+--
+-- /See:/ 'newCategoryProperties' smart constructor.
+data CategoryProperties = CategoryProperties'
+  { -- | The name of the Call Analytics category. Category names are case
+    -- sensitive and must be unique within an Amazon Web Services account.
+    categoryName :: Prelude.Maybe Prelude.Text,
+    -- | The date and time the specified Call Analytics category was created.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    createTime :: Prelude.Maybe Data.POSIX,
+    -- | The input type associated with the specified category. @POST_CALL@
+    -- refers to a category that is applied to batch transcriptions;
+    -- @REAL_TIME@ refers to a category that is applied to streaming
+    -- transcriptions.
+    inputType :: Prelude.Maybe InputType,
+    -- | The date and time the specified Call Analytics category was last
+    -- updated.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-05T12:45:32.691000-07:00@ represents 12:45 PM UTC-7 on
+    -- May 5, 2022.
+    lastUpdateTime :: Prelude.Maybe Data.POSIX,
+    -- | The rules used to define a Call Analytics category. Each category can
+    -- have between 1 and 20 rules.
+    rules :: Prelude.Maybe (Prelude.NonEmpty Rule)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CategoryProperties' 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:
+--
+-- 'categoryName', 'categoryProperties_categoryName' - The name of the Call Analytics category. Category names are case
+-- sensitive and must be unique within an Amazon Web Services account.
+--
+-- 'createTime', 'categoryProperties_createTime' - The date and time the specified Call Analytics category was created.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'inputType', 'categoryProperties_inputType' - The input type associated with the specified category. @POST_CALL@
+-- refers to a category that is applied to batch transcriptions;
+-- @REAL_TIME@ refers to a category that is applied to streaming
+-- transcriptions.
+--
+-- 'lastUpdateTime', 'categoryProperties_lastUpdateTime' - The date and time the specified Call Analytics category was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-05T12:45:32.691000-07:00@ represents 12:45 PM UTC-7 on
+-- May 5, 2022.
+--
+-- 'rules', 'categoryProperties_rules' - The rules used to define a Call Analytics category. Each category can
+-- have between 1 and 20 rules.
+newCategoryProperties ::
+  CategoryProperties
+newCategoryProperties =
+  CategoryProperties'
+    { categoryName = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      inputType = Prelude.Nothing,
+      lastUpdateTime = Prelude.Nothing,
+      rules = Prelude.Nothing
+    }
+
+-- | The name of the Call Analytics category. Category names are case
+-- sensitive and must be unique within an Amazon Web Services account.
+categoryProperties_categoryName :: Lens.Lens' CategoryProperties (Prelude.Maybe Prelude.Text)
+categoryProperties_categoryName = Lens.lens (\CategoryProperties' {categoryName} -> categoryName) (\s@CategoryProperties' {} a -> s {categoryName = a} :: CategoryProperties)
+
+-- | The date and time the specified Call Analytics category was created.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+categoryProperties_createTime :: Lens.Lens' CategoryProperties (Prelude.Maybe Prelude.UTCTime)
+categoryProperties_createTime = Lens.lens (\CategoryProperties' {createTime} -> createTime) (\s@CategoryProperties' {} a -> s {createTime = a} :: CategoryProperties) Prelude.. Lens.mapping Data._Time
+
+-- | The input type associated with the specified category. @POST_CALL@
+-- refers to a category that is applied to batch transcriptions;
+-- @REAL_TIME@ refers to a category that is applied to streaming
+-- transcriptions.
+categoryProperties_inputType :: Lens.Lens' CategoryProperties (Prelude.Maybe InputType)
+categoryProperties_inputType = Lens.lens (\CategoryProperties' {inputType} -> inputType) (\s@CategoryProperties' {} a -> s {inputType = a} :: CategoryProperties)
+
+-- | The date and time the specified Call Analytics category was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-05T12:45:32.691000-07:00@ represents 12:45 PM UTC-7 on
+-- May 5, 2022.
+categoryProperties_lastUpdateTime :: Lens.Lens' CategoryProperties (Prelude.Maybe Prelude.UTCTime)
+categoryProperties_lastUpdateTime = Lens.lens (\CategoryProperties' {lastUpdateTime} -> lastUpdateTime) (\s@CategoryProperties' {} a -> s {lastUpdateTime = a} :: CategoryProperties) Prelude.. Lens.mapping Data._Time
+
+-- | The rules used to define a Call Analytics category. Each category can
+-- have between 1 and 20 rules.
+categoryProperties_rules :: Lens.Lens' CategoryProperties (Prelude.Maybe (Prelude.NonEmpty Rule))
+categoryProperties_rules = Lens.lens (\CategoryProperties' {rules} -> rules) (\s@CategoryProperties' {} a -> s {rules = a} :: CategoryProperties) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON CategoryProperties where
+  parseJSON =
+    Data.withObject
+      "CategoryProperties"
+      ( \x ->
+          CategoryProperties'
+            Prelude.<$> (x Data..:? "CategoryName")
+            Prelude.<*> (x Data..:? "CreateTime")
+            Prelude.<*> (x Data..:? "InputType")
+            Prelude.<*> (x Data..:? "LastUpdateTime")
+            Prelude.<*> (x Data..:? "Rules")
+      )
+
+instance Prelude.Hashable CategoryProperties where
+  hashWithSalt _salt CategoryProperties' {..} =
+    _salt
+      `Prelude.hashWithSalt` categoryName
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` inputType
+      `Prelude.hashWithSalt` lastUpdateTime
+      `Prelude.hashWithSalt` rules
+
+instance Prelude.NFData CategoryProperties where
+  rnf CategoryProperties' {..} =
+    Prelude.rnf categoryName
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf inputType
+      `Prelude.seq` Prelude.rnf lastUpdateTime
+      `Prelude.seq` Prelude.rnf rules
diff --git a/gen/Amazonka/Transcribe/Types/ChannelDefinition.hs b/gen/Amazonka/Transcribe/Types/ChannelDefinition.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/ChannelDefinition.hs
@@ -0,0 +1,101 @@
+{-# 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.Transcribe.Types.ChannelDefinition
+-- 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.Transcribe.Types.ChannelDefinition 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.Transcribe.Types.ParticipantRole
+
+-- | Makes it possible to specify which speaker is on which channel. For
+-- example, if your agent is the first participant to speak, you would set
+-- @ChannelId@ to @0@ (to indicate the first channel) and @ParticipantRole@
+-- to @AGENT@ (to indicate that it\'s the agent speaking).
+--
+-- /See:/ 'newChannelDefinition' smart constructor.
+data ChannelDefinition = ChannelDefinition'
+  { -- | Specify the audio channel you want to define.
+    channelId :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the speaker you want to define. Omitting this parameter is
+    -- equivalent to specifying both participants.
+    participantRole :: Prelude.Maybe ParticipantRole
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ChannelDefinition' 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:
+--
+-- 'channelId', 'channelDefinition_channelId' - Specify the audio channel you want to define.
+--
+-- 'participantRole', 'channelDefinition_participantRole' - Specify the speaker you want to define. Omitting this parameter is
+-- equivalent to specifying both participants.
+newChannelDefinition ::
+  ChannelDefinition
+newChannelDefinition =
+  ChannelDefinition'
+    { channelId = Prelude.Nothing,
+      participantRole = Prelude.Nothing
+    }
+
+-- | Specify the audio channel you want to define.
+channelDefinition_channelId :: Lens.Lens' ChannelDefinition (Prelude.Maybe Prelude.Natural)
+channelDefinition_channelId = Lens.lens (\ChannelDefinition' {channelId} -> channelId) (\s@ChannelDefinition' {} a -> s {channelId = a} :: ChannelDefinition)
+
+-- | Specify the speaker you want to define. Omitting this parameter is
+-- equivalent to specifying both participants.
+channelDefinition_participantRole :: Lens.Lens' ChannelDefinition (Prelude.Maybe ParticipantRole)
+channelDefinition_participantRole = Lens.lens (\ChannelDefinition' {participantRole} -> participantRole) (\s@ChannelDefinition' {} a -> s {participantRole = a} :: ChannelDefinition)
+
+instance Data.FromJSON ChannelDefinition where
+  parseJSON =
+    Data.withObject
+      "ChannelDefinition"
+      ( \x ->
+          ChannelDefinition'
+            Prelude.<$> (x Data..:? "ChannelId")
+            Prelude.<*> (x Data..:? "ParticipantRole")
+      )
+
+instance Prelude.Hashable ChannelDefinition where
+  hashWithSalt _salt ChannelDefinition' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelId
+      `Prelude.hashWithSalt` participantRole
+
+instance Prelude.NFData ChannelDefinition where
+  rnf ChannelDefinition' {..} =
+    Prelude.rnf channelId
+      `Prelude.seq` Prelude.rnf participantRole
+
+instance Data.ToJSON ChannelDefinition where
+  toJSON ChannelDefinition' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ChannelId" Data..=) Prelude.<$> channelId,
+            ("ParticipantRole" Data..=)
+              Prelude.<$> participantRole
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/ContentRedaction.hs b/gen/Amazonka/Transcribe/Types/ContentRedaction.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/ContentRedaction.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.Transcribe.Types.ContentRedaction
+-- 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.Transcribe.Types.ContentRedaction 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.Transcribe.Types.PiiEntityType
+import Amazonka.Transcribe.Types.RedactionOutput
+import Amazonka.Transcribe.Types.RedactionType
+
+-- | Makes it possible to redact or flag specified personally identifiable
+-- information (PII) in your transcript. If you use @ContentRedaction@, you
+-- must also include the sub-parameters: @PiiEntityTypes@,
+-- @RedactionOutput@, and @RedactionType@.
+--
+-- /See:/ 'newContentRedaction' smart constructor.
+data ContentRedaction = ContentRedaction'
+  { -- | Specify which types of personally identifiable information (PII) you
+    -- want to redact in your transcript. You can include as many types as
+    -- you\'d like, or you can select @ALL@.
+    piiEntityTypes :: Prelude.Maybe [PiiEntityType],
+    -- | Specify the category of information you want to redact; @PII@
+    -- (personally identifiable information) is the only valid value. You can
+    -- use @PiiEntityTypes@ to choose which types of PII you want to redact.
+    redactionType :: RedactionType,
+    -- | Specify if you want only a redacted transcript, or if you want a
+    -- redacted and an unredacted transcript.
+    --
+    -- When you choose @redacted@ Amazon Transcribe creates only a redacted
+    -- transcript.
+    --
+    -- When you choose @redacted_and_unredacted@ Amazon Transcribe creates a
+    -- redacted and an unredacted transcript (as two separate files).
+    redactionOutput :: RedactionOutput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContentRedaction' 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:
+--
+-- 'piiEntityTypes', 'contentRedaction_piiEntityTypes' - Specify which types of personally identifiable information (PII) you
+-- want to redact in your transcript. You can include as many types as
+-- you\'d like, or you can select @ALL@.
+--
+-- 'redactionType', 'contentRedaction_redactionType' - Specify the category of information you want to redact; @PII@
+-- (personally identifiable information) is the only valid value. You can
+-- use @PiiEntityTypes@ to choose which types of PII you want to redact.
+--
+-- 'redactionOutput', 'contentRedaction_redactionOutput' - Specify if you want only a redacted transcript, or if you want a
+-- redacted and an unredacted transcript.
+--
+-- When you choose @redacted@ Amazon Transcribe creates only a redacted
+-- transcript.
+--
+-- When you choose @redacted_and_unredacted@ Amazon Transcribe creates a
+-- redacted and an unredacted transcript (as two separate files).
+newContentRedaction ::
+  -- | 'redactionType'
+  RedactionType ->
+  -- | 'redactionOutput'
+  RedactionOutput ->
+  ContentRedaction
+newContentRedaction pRedactionType_ pRedactionOutput_ =
+  ContentRedaction'
+    { piiEntityTypes = Prelude.Nothing,
+      redactionType = pRedactionType_,
+      redactionOutput = pRedactionOutput_
+    }
+
+-- | Specify which types of personally identifiable information (PII) you
+-- want to redact in your transcript. You can include as many types as
+-- you\'d like, or you can select @ALL@.
+contentRedaction_piiEntityTypes :: Lens.Lens' ContentRedaction (Prelude.Maybe [PiiEntityType])
+contentRedaction_piiEntityTypes = Lens.lens (\ContentRedaction' {piiEntityTypes} -> piiEntityTypes) (\s@ContentRedaction' {} a -> s {piiEntityTypes = a} :: ContentRedaction) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the category of information you want to redact; @PII@
+-- (personally identifiable information) is the only valid value. You can
+-- use @PiiEntityTypes@ to choose which types of PII you want to redact.
+contentRedaction_redactionType :: Lens.Lens' ContentRedaction RedactionType
+contentRedaction_redactionType = Lens.lens (\ContentRedaction' {redactionType} -> redactionType) (\s@ContentRedaction' {} a -> s {redactionType = a} :: ContentRedaction)
+
+-- | Specify if you want only a redacted transcript, or if you want a
+-- redacted and an unredacted transcript.
+--
+-- When you choose @redacted@ Amazon Transcribe creates only a redacted
+-- transcript.
+--
+-- When you choose @redacted_and_unredacted@ Amazon Transcribe creates a
+-- redacted and an unredacted transcript (as two separate files).
+contentRedaction_redactionOutput :: Lens.Lens' ContentRedaction RedactionOutput
+contentRedaction_redactionOutput = Lens.lens (\ContentRedaction' {redactionOutput} -> redactionOutput) (\s@ContentRedaction' {} a -> s {redactionOutput = a} :: ContentRedaction)
+
+instance Data.FromJSON ContentRedaction where
+  parseJSON =
+    Data.withObject
+      "ContentRedaction"
+      ( \x ->
+          ContentRedaction'
+            Prelude.<$> (x Data..:? "PiiEntityTypes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..: "RedactionType")
+            Prelude.<*> (x Data..: "RedactionOutput")
+      )
+
+instance Prelude.Hashable ContentRedaction where
+  hashWithSalt _salt ContentRedaction' {..} =
+    _salt
+      `Prelude.hashWithSalt` piiEntityTypes
+      `Prelude.hashWithSalt` redactionType
+      `Prelude.hashWithSalt` redactionOutput
+
+instance Prelude.NFData ContentRedaction where
+  rnf ContentRedaction' {..} =
+    Prelude.rnf piiEntityTypes
+      `Prelude.seq` Prelude.rnf redactionType
+      `Prelude.seq` Prelude.rnf redactionOutput
+
+instance Data.ToJSON ContentRedaction where
+  toJSON ContentRedaction' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("PiiEntityTypes" Data..=)
+              Prelude.<$> piiEntityTypes,
+            Prelude.Just ("RedactionType" Data..= redactionType),
+            Prelude.Just
+              ("RedactionOutput" Data..= redactionOutput)
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/InputDataConfig.hs b/gen/Amazonka/Transcribe/Types/InputDataConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/InputDataConfig.hs
@@ -0,0 +1,172 @@
+{-# 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.Transcribe.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.Transcribe.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
+
+-- | Contains the Amazon S3 location of the training data you want to use to
+-- create a new custom language model, and permissions to access this
+-- location.
+--
+-- When using @InputDataConfig@, you must include these sub-parameters:
+-- @S3Uri@ and @DataAccessRoleArn@. You can optionally include
+-- @TuningDataS3Uri@.
+--
+-- /See:/ 'newInputDataConfig' smart constructor.
+data InputDataConfig = InputDataConfig'
+  { -- | The Amazon S3 location (URI) of the text files you want to use to tune
+    -- your custom language model.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-tuning-data\/@
+    tuningDataS3Uri :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 location (URI) of the text files you want to use to train
+    -- your custom language model.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-training-data\/@
+    s3Uri :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+    -- access the Amazon S3 bucket that contains your input files. If the role
+    -- that you specify doesn’t have the appropriate permissions to access the
+    -- specified Amazon S3 location, your request fails.
+    --
+    -- IAM role ARNs have the format
+    -- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+    -- @arn:aws:iam::111122223333:role\/Admin@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+    dataAccessRoleArn :: 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:
+--
+-- 'tuningDataS3Uri', 'inputDataConfig_tuningDataS3Uri' - The Amazon S3 location (URI) of the text files you want to use to tune
+-- your custom language model.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-tuning-data\/@
+--
+-- 's3Uri', 'inputDataConfig_s3Uri' - The Amazon S3 location (URI) of the text files you want to use to train
+-- your custom language model.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-training-data\/@
+--
+-- 'dataAccessRoleArn', 'inputDataConfig_dataAccessRoleArn' - The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+newInputDataConfig ::
+  -- | 's3Uri'
+  Prelude.Text ->
+  -- | 'dataAccessRoleArn'
+  Prelude.Text ->
+  InputDataConfig
+newInputDataConfig pS3Uri_ pDataAccessRoleArn_ =
+  InputDataConfig'
+    { tuningDataS3Uri = Prelude.Nothing,
+      s3Uri = pS3Uri_,
+      dataAccessRoleArn = pDataAccessRoleArn_
+    }
+
+-- | The Amazon S3 location (URI) of the text files you want to use to tune
+-- your custom language model.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-tuning-data\/@
+inputDataConfig_tuningDataS3Uri :: Lens.Lens' InputDataConfig (Prelude.Maybe Prelude.Text)
+inputDataConfig_tuningDataS3Uri = Lens.lens (\InputDataConfig' {tuningDataS3Uri} -> tuningDataS3Uri) (\s@InputDataConfig' {} a -> s {tuningDataS3Uri = a} :: InputDataConfig)
+
+-- | The Amazon S3 location (URI) of the text files you want to use to train
+-- your custom language model.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-model-training-data\/@
+inputDataConfig_s3Uri :: Lens.Lens' InputDataConfig Prelude.Text
+inputDataConfig_s3Uri = Lens.lens (\InputDataConfig' {s3Uri} -> s3Uri) (\s@InputDataConfig' {} a -> s {s3Uri = a} :: InputDataConfig)
+
+-- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+inputDataConfig_dataAccessRoleArn :: Lens.Lens' InputDataConfig Prelude.Text
+inputDataConfig_dataAccessRoleArn = Lens.lens (\InputDataConfig' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@InputDataConfig' {} a -> s {dataAccessRoleArn = a} :: InputDataConfig)
+
+instance Data.FromJSON InputDataConfig where
+  parseJSON =
+    Data.withObject
+      "InputDataConfig"
+      ( \x ->
+          InputDataConfig'
+            Prelude.<$> (x Data..:? "TuningDataS3Uri")
+            Prelude.<*> (x Data..: "S3Uri")
+            Prelude.<*> (x Data..: "DataAccessRoleArn")
+      )
+
+instance Prelude.Hashable InputDataConfig where
+  hashWithSalt _salt InputDataConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` tuningDataS3Uri
+      `Prelude.hashWithSalt` s3Uri
+      `Prelude.hashWithSalt` dataAccessRoleArn
+
+instance Prelude.NFData InputDataConfig where
+  rnf InputDataConfig' {..} =
+    Prelude.rnf tuningDataS3Uri
+      `Prelude.seq` Prelude.rnf s3Uri
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+
+instance Data.ToJSON InputDataConfig where
+  toJSON InputDataConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("TuningDataS3Uri" Data..=)
+              Prelude.<$> tuningDataS3Uri,
+            Prelude.Just ("S3Uri" Data..= s3Uri),
+            Prelude.Just
+              ("DataAccessRoleArn" Data..= dataAccessRoleArn)
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/InputType.hs b/gen/Amazonka/Transcribe/Types/InputType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/InputType.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.Transcribe.Types.InputType
+-- 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.Transcribe.Types.InputType
+  ( InputType
+      ( ..,
+        InputType_POST_CALL,
+        InputType_REAL_TIME
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype InputType = InputType'
+  { fromInputType ::
+      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 InputType_POST_CALL :: InputType
+pattern InputType_POST_CALL = InputType' "POST_CALL"
+
+pattern InputType_REAL_TIME :: InputType
+pattern InputType_REAL_TIME = InputType' "REAL_TIME"
+
+{-# COMPLETE
+  InputType_POST_CALL,
+  InputType_REAL_TIME,
+  InputType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/InterruptionFilter.hs b/gen/Amazonka/Transcribe/Types/InterruptionFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/InterruptionFilter.hs
@@ -0,0 +1,178 @@
+{-# 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.Transcribe.Types.InterruptionFilter
+-- 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.Transcribe.Types.InterruptionFilter 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.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.ParticipantRole
+import Amazonka.Transcribe.Types.RelativeTimeRange
+
+-- | Flag the presence or absence of interruptions in your Call Analytics
+-- transcription output.
+--
+-- Rules using @InterruptionFilter@ are designed to match:
+--
+-- -   Instances where an agent interrupts a customer
+--
+-- -   Instances where a customer interrupts an agent
+--
+-- -   Either participant interrupting the other
+--
+-- -   A lack of interruptions
+--
+-- See
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html#tca-rules-batch Rule criteria for batch categories>
+-- for usage examples.
+--
+-- /See:/ 'newInterruptionFilter' smart constructor.
+data InterruptionFilter = InterruptionFilter'
+  { -- | Makes it possible to specify a time range (in milliseconds) in your
+    -- audio, during which you want to search for an interruption. See for more
+    -- detail.
+    absoluteTimeRange :: Prelude.Maybe AbsoluteTimeRange,
+    -- | Set to @TRUE@ to flag speech that does not contain interruptions. Set to
+    -- @FALSE@ to flag speech that contains interruptions.
+    negate :: Prelude.Maybe Prelude.Bool,
+    -- | Specify the interrupter that you want to flag. Omitting this parameter
+    -- is equivalent to specifying both participants.
+    participantRole :: Prelude.Maybe ParticipantRole,
+    -- | Makes it possible to specify a time range (in percentage) in your media
+    -- file, during which you want to search for an interruption. See for more
+    -- detail.
+    relativeTimeRange :: Prelude.Maybe RelativeTimeRange,
+    -- | Specify the duration of the interruptions in milliseconds. For example,
+    -- you can flag speech that contains more than 10,000 milliseconds of
+    -- interruptions.
+    threshold :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InterruptionFilter' 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:
+--
+-- 'absoluteTimeRange', 'interruptionFilter_absoluteTimeRange' - Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for an interruption. See for more
+-- detail.
+--
+-- 'negate', 'interruptionFilter_negate' - Set to @TRUE@ to flag speech that does not contain interruptions. Set to
+-- @FALSE@ to flag speech that contains interruptions.
+--
+-- 'participantRole', 'interruptionFilter_participantRole' - Specify the interrupter that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+--
+-- 'relativeTimeRange', 'interruptionFilter_relativeTimeRange' - Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for an interruption. See for more
+-- detail.
+--
+-- 'threshold', 'interruptionFilter_threshold' - Specify the duration of the interruptions in milliseconds. For example,
+-- you can flag speech that contains more than 10,000 milliseconds of
+-- interruptions.
+newInterruptionFilter ::
+  InterruptionFilter
+newInterruptionFilter =
+  InterruptionFilter'
+    { absoluteTimeRange =
+        Prelude.Nothing,
+      negate = Prelude.Nothing,
+      participantRole = Prelude.Nothing,
+      relativeTimeRange = Prelude.Nothing,
+      threshold = Prelude.Nothing
+    }
+
+-- | Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for an interruption. See for more
+-- detail.
+interruptionFilter_absoluteTimeRange :: Lens.Lens' InterruptionFilter (Prelude.Maybe AbsoluteTimeRange)
+interruptionFilter_absoluteTimeRange = Lens.lens (\InterruptionFilter' {absoluteTimeRange} -> absoluteTimeRange) (\s@InterruptionFilter' {} a -> s {absoluteTimeRange = a} :: InterruptionFilter)
+
+-- | Set to @TRUE@ to flag speech that does not contain interruptions. Set to
+-- @FALSE@ to flag speech that contains interruptions.
+interruptionFilter_negate :: Lens.Lens' InterruptionFilter (Prelude.Maybe Prelude.Bool)
+interruptionFilter_negate = Lens.lens (\InterruptionFilter' {negate} -> negate) (\s@InterruptionFilter' {} a -> s {negate = a} :: InterruptionFilter)
+
+-- | Specify the interrupter that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+interruptionFilter_participantRole :: Lens.Lens' InterruptionFilter (Prelude.Maybe ParticipantRole)
+interruptionFilter_participantRole = Lens.lens (\InterruptionFilter' {participantRole} -> participantRole) (\s@InterruptionFilter' {} a -> s {participantRole = a} :: InterruptionFilter)
+
+-- | Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for an interruption. See for more
+-- detail.
+interruptionFilter_relativeTimeRange :: Lens.Lens' InterruptionFilter (Prelude.Maybe RelativeTimeRange)
+interruptionFilter_relativeTimeRange = Lens.lens (\InterruptionFilter' {relativeTimeRange} -> relativeTimeRange) (\s@InterruptionFilter' {} a -> s {relativeTimeRange = a} :: InterruptionFilter)
+
+-- | Specify the duration of the interruptions in milliseconds. For example,
+-- you can flag speech that contains more than 10,000 milliseconds of
+-- interruptions.
+interruptionFilter_threshold :: Lens.Lens' InterruptionFilter (Prelude.Maybe Prelude.Natural)
+interruptionFilter_threshold = Lens.lens (\InterruptionFilter' {threshold} -> threshold) (\s@InterruptionFilter' {} a -> s {threshold = a} :: InterruptionFilter)
+
+instance Data.FromJSON InterruptionFilter where
+  parseJSON =
+    Data.withObject
+      "InterruptionFilter"
+      ( \x ->
+          InterruptionFilter'
+            Prelude.<$> (x Data..:? "AbsoluteTimeRange")
+            Prelude.<*> (x Data..:? "Negate")
+            Prelude.<*> (x Data..:? "ParticipantRole")
+            Prelude.<*> (x Data..:? "RelativeTimeRange")
+            Prelude.<*> (x Data..:? "Threshold")
+      )
+
+instance Prelude.Hashable InterruptionFilter where
+  hashWithSalt _salt InterruptionFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` absoluteTimeRange
+      `Prelude.hashWithSalt` negate
+      `Prelude.hashWithSalt` participantRole
+      `Prelude.hashWithSalt` relativeTimeRange
+      `Prelude.hashWithSalt` threshold
+
+instance Prelude.NFData InterruptionFilter where
+  rnf InterruptionFilter' {..} =
+    Prelude.rnf absoluteTimeRange
+      `Prelude.seq` Prelude.rnf negate
+      `Prelude.seq` Prelude.rnf participantRole
+      `Prelude.seq` Prelude.rnf relativeTimeRange
+      `Prelude.seq` Prelude.rnf threshold
+
+instance Data.ToJSON InterruptionFilter where
+  toJSON InterruptionFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AbsoluteTimeRange" Data..=)
+              Prelude.<$> absoluteTimeRange,
+            ("Negate" Data..=) Prelude.<$> negate,
+            ("ParticipantRole" Data..=)
+              Prelude.<$> participantRole,
+            ("RelativeTimeRange" Data..=)
+              Prelude.<$> relativeTimeRange,
+            ("Threshold" Data..=) Prelude.<$> threshold
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/JobExecutionSettings.hs b/gen/Amazonka/Transcribe/Types/JobExecutionSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/JobExecutionSettings.hs
@@ -0,0 +1,169 @@
+{-# 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.Transcribe.Types.JobExecutionSettings
+-- 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.Transcribe.Types.JobExecutionSettings 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
+
+-- | Makes it possible to control how your transcription job is processed.
+-- Currently, the only @JobExecutionSettings@ modification you can choose
+-- is enabling job queueing using the @AllowDeferredExecution@
+-- sub-parameter.
+--
+-- If you include @JobExecutionSettings@ in your request, you must also
+-- include the sub-parameters: @AllowDeferredExecution@ and
+-- @DataAccessRoleArn@.
+--
+-- /See:/ 'newJobExecutionSettings' smart constructor.
+data JobExecutionSettings = JobExecutionSettings'
+  { -- | Makes it possible to enable job queuing when your concurrent request
+    -- limit is exceeded. When @AllowDeferredExecution@ is set to @true@,
+    -- transcription job requests are placed in a queue until the number of
+    -- jobs falls below the concurrent request limit. If
+    -- @AllowDeferredExecution@ is set to @false@ and the number of
+    -- transcription job requests exceed the concurrent request limit, you get
+    -- a @LimitExceededException@ error.
+    --
+    -- Note that job queuing is enabled by default for Call Analytics jobs.
+    --
+    -- If you include @AllowDeferredExecution@ in your request, you must also
+    -- include @DataAccessRoleArn@.
+    allowDeferredExecution :: Prelude.Maybe Prelude.Bool,
+    -- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+    -- access the Amazon S3 bucket that contains your input files. If the role
+    -- that you specify doesn’t have the appropriate permissions to access the
+    -- specified Amazon S3 location, your request fails.
+    --
+    -- IAM role ARNs have the format
+    -- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+    -- @arn:aws:iam::111122223333:role\/Admin@. For more information, see
+    -- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+    --
+    -- Note that if you include @DataAccessRoleArn@ in your request, you must
+    -- also include @AllowDeferredExecution@.
+    dataAccessRoleArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'JobExecutionSettings' 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:
+--
+-- 'allowDeferredExecution', 'jobExecutionSettings_allowDeferredExecution' - Makes it possible to enable job queuing when your concurrent request
+-- limit is exceeded. When @AllowDeferredExecution@ is set to @true@,
+-- transcription job requests are placed in a queue until the number of
+-- jobs falls below the concurrent request limit. If
+-- @AllowDeferredExecution@ is set to @false@ and the number of
+-- transcription job requests exceed the concurrent request limit, you get
+-- a @LimitExceededException@ error.
+--
+-- Note that job queuing is enabled by default for Call Analytics jobs.
+--
+-- If you include @AllowDeferredExecution@ in your request, you must also
+-- include @DataAccessRoleArn@.
+--
+-- 'dataAccessRoleArn', 'jobExecutionSettings_dataAccessRoleArn' - The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+--
+-- Note that if you include @DataAccessRoleArn@ in your request, you must
+-- also include @AllowDeferredExecution@.
+newJobExecutionSettings ::
+  JobExecutionSettings
+newJobExecutionSettings =
+  JobExecutionSettings'
+    { allowDeferredExecution =
+        Prelude.Nothing,
+      dataAccessRoleArn = Prelude.Nothing
+    }
+
+-- | Makes it possible to enable job queuing when your concurrent request
+-- limit is exceeded. When @AllowDeferredExecution@ is set to @true@,
+-- transcription job requests are placed in a queue until the number of
+-- jobs falls below the concurrent request limit. If
+-- @AllowDeferredExecution@ is set to @false@ and the number of
+-- transcription job requests exceed the concurrent request limit, you get
+-- a @LimitExceededException@ error.
+--
+-- Note that job queuing is enabled by default for Call Analytics jobs.
+--
+-- If you include @AllowDeferredExecution@ in your request, you must also
+-- include @DataAccessRoleArn@.
+jobExecutionSettings_allowDeferredExecution :: Lens.Lens' JobExecutionSettings (Prelude.Maybe Prelude.Bool)
+jobExecutionSettings_allowDeferredExecution = Lens.lens (\JobExecutionSettings' {allowDeferredExecution} -> allowDeferredExecution) (\s@JobExecutionSettings' {} a -> s {allowDeferredExecution = a} :: JobExecutionSettings)
+
+-- | The Amazon Resource Name (ARN) of an IAM role that has permissions to
+-- access the Amazon S3 bucket that contains your input files. If the role
+-- that you specify doesn’t have the appropriate permissions to access the
+-- specified Amazon S3 location, your request fails.
+--
+-- IAM role ARNs have the format
+-- @arn:partition:iam::account:role\/role-name-with-path@. For example:
+-- @arn:aws:iam::111122223333:role\/Admin@. For more information, see
+-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns IAM ARNs>.
+--
+-- Note that if you include @DataAccessRoleArn@ in your request, you must
+-- also include @AllowDeferredExecution@.
+jobExecutionSettings_dataAccessRoleArn :: Lens.Lens' JobExecutionSettings (Prelude.Maybe Prelude.Text)
+jobExecutionSettings_dataAccessRoleArn = Lens.lens (\JobExecutionSettings' {dataAccessRoleArn} -> dataAccessRoleArn) (\s@JobExecutionSettings' {} a -> s {dataAccessRoleArn = a} :: JobExecutionSettings)
+
+instance Data.FromJSON JobExecutionSettings where
+  parseJSON =
+    Data.withObject
+      "JobExecutionSettings"
+      ( \x ->
+          JobExecutionSettings'
+            Prelude.<$> (x Data..:? "AllowDeferredExecution")
+            Prelude.<*> (x Data..:? "DataAccessRoleArn")
+      )
+
+instance Prelude.Hashable JobExecutionSettings where
+  hashWithSalt _salt JobExecutionSettings' {..} =
+    _salt
+      `Prelude.hashWithSalt` allowDeferredExecution
+      `Prelude.hashWithSalt` dataAccessRoleArn
+
+instance Prelude.NFData JobExecutionSettings where
+  rnf JobExecutionSettings' {..} =
+    Prelude.rnf allowDeferredExecution
+      `Prelude.seq` Prelude.rnf dataAccessRoleArn
+
+instance Data.ToJSON JobExecutionSettings where
+  toJSON JobExecutionSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AllowDeferredExecution" Data..=)
+              Prelude.<$> allowDeferredExecution,
+            ("DataAccessRoleArn" Data..=)
+              Prelude.<$> dataAccessRoleArn
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/LanguageCode.hs b/gen/Amazonka/Transcribe/Types/LanguageCode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/LanguageCode.hs
@@ -0,0 +1,256 @@
+{-# 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.Transcribe.Types.LanguageCode
+-- 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.Transcribe.Types.LanguageCode
+  ( LanguageCode
+      ( ..,
+        LanguageCode_Af_ZA,
+        LanguageCode_Ar_AE,
+        LanguageCode_Ar_SA,
+        LanguageCode_Da_DK,
+        LanguageCode_De_CH,
+        LanguageCode_De_DE,
+        LanguageCode_En_AB,
+        LanguageCode_En_AU,
+        LanguageCode_En_GB,
+        LanguageCode_En_IE,
+        LanguageCode_En_IN,
+        LanguageCode_En_NZ,
+        LanguageCode_En_US,
+        LanguageCode_En_WL,
+        LanguageCode_En_ZA,
+        LanguageCode_Es_ES,
+        LanguageCode_Es_US,
+        LanguageCode_Fa_IR,
+        LanguageCode_Fr_CA,
+        LanguageCode_Fr_FR,
+        LanguageCode_He_IL,
+        LanguageCode_Hi_IN,
+        LanguageCode_Id_ID,
+        LanguageCode_It_IT,
+        LanguageCode_Ja_JP,
+        LanguageCode_Ko_KR,
+        LanguageCode_Ms_MY,
+        LanguageCode_Nl_NL,
+        LanguageCode_Pt_BR,
+        LanguageCode_Pt_PT,
+        LanguageCode_Ru_RU,
+        LanguageCode_Sv_SE,
+        LanguageCode_Ta_IN,
+        LanguageCode_Te_IN,
+        LanguageCode_Th_TH,
+        LanguageCode_Tr_TR,
+        LanguageCode_Vi_VN,
+        LanguageCode_Zh_CN,
+        LanguageCode_Zh_TW
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype LanguageCode = LanguageCode'
+  { fromLanguageCode ::
+      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 LanguageCode_Af_ZA :: LanguageCode
+pattern LanguageCode_Af_ZA = LanguageCode' "af-ZA"
+
+pattern LanguageCode_Ar_AE :: LanguageCode
+pattern LanguageCode_Ar_AE = LanguageCode' "ar-AE"
+
+pattern LanguageCode_Ar_SA :: LanguageCode
+pattern LanguageCode_Ar_SA = LanguageCode' "ar-SA"
+
+pattern LanguageCode_Da_DK :: LanguageCode
+pattern LanguageCode_Da_DK = LanguageCode' "da-DK"
+
+pattern LanguageCode_De_CH :: LanguageCode
+pattern LanguageCode_De_CH = LanguageCode' "de-CH"
+
+pattern LanguageCode_De_DE :: LanguageCode
+pattern LanguageCode_De_DE = LanguageCode' "de-DE"
+
+pattern LanguageCode_En_AB :: LanguageCode
+pattern LanguageCode_En_AB = LanguageCode' "en-AB"
+
+pattern LanguageCode_En_AU :: LanguageCode
+pattern LanguageCode_En_AU = LanguageCode' "en-AU"
+
+pattern LanguageCode_En_GB :: LanguageCode
+pattern LanguageCode_En_GB = LanguageCode' "en-GB"
+
+pattern LanguageCode_En_IE :: LanguageCode
+pattern LanguageCode_En_IE = LanguageCode' "en-IE"
+
+pattern LanguageCode_En_IN :: LanguageCode
+pattern LanguageCode_En_IN = LanguageCode' "en-IN"
+
+pattern LanguageCode_En_NZ :: LanguageCode
+pattern LanguageCode_En_NZ = LanguageCode' "en-NZ"
+
+pattern LanguageCode_En_US :: LanguageCode
+pattern LanguageCode_En_US = LanguageCode' "en-US"
+
+pattern LanguageCode_En_WL :: LanguageCode
+pattern LanguageCode_En_WL = LanguageCode' "en-WL"
+
+pattern LanguageCode_En_ZA :: LanguageCode
+pattern LanguageCode_En_ZA = LanguageCode' "en-ZA"
+
+pattern LanguageCode_Es_ES :: LanguageCode
+pattern LanguageCode_Es_ES = LanguageCode' "es-ES"
+
+pattern LanguageCode_Es_US :: LanguageCode
+pattern LanguageCode_Es_US = LanguageCode' "es-US"
+
+pattern LanguageCode_Fa_IR :: LanguageCode
+pattern LanguageCode_Fa_IR = LanguageCode' "fa-IR"
+
+pattern LanguageCode_Fr_CA :: LanguageCode
+pattern LanguageCode_Fr_CA = LanguageCode' "fr-CA"
+
+pattern LanguageCode_Fr_FR :: LanguageCode
+pattern LanguageCode_Fr_FR = LanguageCode' "fr-FR"
+
+pattern LanguageCode_He_IL :: LanguageCode
+pattern LanguageCode_He_IL = LanguageCode' "he-IL"
+
+pattern LanguageCode_Hi_IN :: LanguageCode
+pattern LanguageCode_Hi_IN = LanguageCode' "hi-IN"
+
+pattern LanguageCode_Id_ID :: LanguageCode
+pattern LanguageCode_Id_ID = LanguageCode' "id-ID"
+
+pattern LanguageCode_It_IT :: LanguageCode
+pattern LanguageCode_It_IT = LanguageCode' "it-IT"
+
+pattern LanguageCode_Ja_JP :: LanguageCode
+pattern LanguageCode_Ja_JP = LanguageCode' "ja-JP"
+
+pattern LanguageCode_Ko_KR :: LanguageCode
+pattern LanguageCode_Ko_KR = LanguageCode' "ko-KR"
+
+pattern LanguageCode_Ms_MY :: LanguageCode
+pattern LanguageCode_Ms_MY = LanguageCode' "ms-MY"
+
+pattern LanguageCode_Nl_NL :: LanguageCode
+pattern LanguageCode_Nl_NL = LanguageCode' "nl-NL"
+
+pattern LanguageCode_Pt_BR :: LanguageCode
+pattern LanguageCode_Pt_BR = LanguageCode' "pt-BR"
+
+pattern LanguageCode_Pt_PT :: LanguageCode
+pattern LanguageCode_Pt_PT = LanguageCode' "pt-PT"
+
+pattern LanguageCode_Ru_RU :: LanguageCode
+pattern LanguageCode_Ru_RU = LanguageCode' "ru-RU"
+
+pattern LanguageCode_Sv_SE :: LanguageCode
+pattern LanguageCode_Sv_SE = LanguageCode' "sv-SE"
+
+pattern LanguageCode_Ta_IN :: LanguageCode
+pattern LanguageCode_Ta_IN = LanguageCode' "ta-IN"
+
+pattern LanguageCode_Te_IN :: LanguageCode
+pattern LanguageCode_Te_IN = LanguageCode' "te-IN"
+
+pattern LanguageCode_Th_TH :: LanguageCode
+pattern LanguageCode_Th_TH = LanguageCode' "th-TH"
+
+pattern LanguageCode_Tr_TR :: LanguageCode
+pattern LanguageCode_Tr_TR = LanguageCode' "tr-TR"
+
+pattern LanguageCode_Vi_VN :: LanguageCode
+pattern LanguageCode_Vi_VN = LanguageCode' "vi-VN"
+
+pattern LanguageCode_Zh_CN :: LanguageCode
+pattern LanguageCode_Zh_CN = LanguageCode' "zh-CN"
+
+pattern LanguageCode_Zh_TW :: LanguageCode
+pattern LanguageCode_Zh_TW = LanguageCode' "zh-TW"
+
+{-# COMPLETE
+  LanguageCode_Af_ZA,
+  LanguageCode_Ar_AE,
+  LanguageCode_Ar_SA,
+  LanguageCode_Da_DK,
+  LanguageCode_De_CH,
+  LanguageCode_De_DE,
+  LanguageCode_En_AB,
+  LanguageCode_En_AU,
+  LanguageCode_En_GB,
+  LanguageCode_En_IE,
+  LanguageCode_En_IN,
+  LanguageCode_En_NZ,
+  LanguageCode_En_US,
+  LanguageCode_En_WL,
+  LanguageCode_En_ZA,
+  LanguageCode_Es_ES,
+  LanguageCode_Es_US,
+  LanguageCode_Fa_IR,
+  LanguageCode_Fr_CA,
+  LanguageCode_Fr_FR,
+  LanguageCode_He_IL,
+  LanguageCode_Hi_IN,
+  LanguageCode_Id_ID,
+  LanguageCode_It_IT,
+  LanguageCode_Ja_JP,
+  LanguageCode_Ko_KR,
+  LanguageCode_Ms_MY,
+  LanguageCode_Nl_NL,
+  LanguageCode_Pt_BR,
+  LanguageCode_Pt_PT,
+  LanguageCode_Ru_RU,
+  LanguageCode_Sv_SE,
+  LanguageCode_Ta_IN,
+  LanguageCode_Te_IN,
+  LanguageCode_Th_TH,
+  LanguageCode_Tr_TR,
+  LanguageCode_Vi_VN,
+  LanguageCode_Zh_CN,
+  LanguageCode_Zh_TW,
+  LanguageCode'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/LanguageCodeItem.hs b/gen/Amazonka/Transcribe/Types/LanguageCodeItem.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/LanguageCodeItem.hs
@@ -0,0 +1,92 @@
+{-# 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.Transcribe.Types.LanguageCodeItem
+-- 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.Transcribe.Types.LanguageCodeItem 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.Transcribe.Types.LanguageCode
+
+-- | Provides information on the speech contained in a discreet utterance
+-- when multi-language identification is enabled in your request. This
+-- utterance represents a block of speech consisting of one language,
+-- preceded or followed by a block of speech in a different language.
+--
+-- /See:/ 'newLanguageCodeItem' smart constructor.
+data LanguageCodeItem = LanguageCodeItem'
+  { -- | Provides the total time, in seconds, each identified language is spoken
+    -- in your media.
+    durationInSeconds :: Prelude.Maybe Prelude.Double,
+    -- | Provides the language code for each language identified in your media.
+    languageCode :: Prelude.Maybe LanguageCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LanguageCodeItem' 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:
+--
+-- 'durationInSeconds', 'languageCodeItem_durationInSeconds' - Provides the total time, in seconds, each identified language is spoken
+-- in your media.
+--
+-- 'languageCode', 'languageCodeItem_languageCode' - Provides the language code for each language identified in your media.
+newLanguageCodeItem ::
+  LanguageCodeItem
+newLanguageCodeItem =
+  LanguageCodeItem'
+    { durationInSeconds =
+        Prelude.Nothing,
+      languageCode = Prelude.Nothing
+    }
+
+-- | Provides the total time, in seconds, each identified language is spoken
+-- in your media.
+languageCodeItem_durationInSeconds :: Lens.Lens' LanguageCodeItem (Prelude.Maybe Prelude.Double)
+languageCodeItem_durationInSeconds = Lens.lens (\LanguageCodeItem' {durationInSeconds} -> durationInSeconds) (\s@LanguageCodeItem' {} a -> s {durationInSeconds = a} :: LanguageCodeItem)
+
+-- | Provides the language code for each language identified in your media.
+languageCodeItem_languageCode :: Lens.Lens' LanguageCodeItem (Prelude.Maybe LanguageCode)
+languageCodeItem_languageCode = Lens.lens (\LanguageCodeItem' {languageCode} -> languageCode) (\s@LanguageCodeItem' {} a -> s {languageCode = a} :: LanguageCodeItem)
+
+instance Data.FromJSON LanguageCodeItem where
+  parseJSON =
+    Data.withObject
+      "LanguageCodeItem"
+      ( \x ->
+          LanguageCodeItem'
+            Prelude.<$> (x Data..:? "DurationInSeconds")
+            Prelude.<*> (x Data..:? "LanguageCode")
+      )
+
+instance Prelude.Hashable LanguageCodeItem where
+  hashWithSalt _salt LanguageCodeItem' {..} =
+    _salt
+      `Prelude.hashWithSalt` durationInSeconds
+      `Prelude.hashWithSalt` languageCode
+
+instance Prelude.NFData LanguageCodeItem where
+  rnf LanguageCodeItem' {..} =
+    Prelude.rnf durationInSeconds
+      `Prelude.seq` Prelude.rnf languageCode
diff --git a/gen/Amazonka/Transcribe/Types/LanguageIdSettings.hs b/gen/Amazonka/Transcribe/Types/LanguageIdSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/LanguageIdSettings.hs
@@ -0,0 +1,207 @@
+{-# 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.Transcribe.Types.LanguageIdSettings
+-- 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.Transcribe.Types.LanguageIdSettings 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
+
+-- | If using automatic language identification in your request and you want
+-- to apply a custom language model, a custom vocabulary, or a custom
+-- vocabulary filter, include @LanguageIdSettings@ with the relevant
+-- sub-parameters (@VocabularyName@, @LanguageModelName@, and
+-- @VocabularyFilterName@). Note that multi-language identification
+-- (@IdentifyMultipleLanguages@) doesn\'t support custom language models.
+--
+-- @LanguageIdSettings@ supports two to five language codes. Each language
+-- code you include can have an associated custom language model, custom
+-- vocabulary, and custom vocabulary filter. The language codes that you
+-- specify must match the languages of the associated custom language
+-- models, custom vocabularies, and custom vocabulary filters.
+--
+-- It\'s recommended that you include @LanguageOptions@ when using
+-- @LanguageIdSettings@ to ensure that the correct language dialect is
+-- identified. For example, if you specify a custom vocabulary that is in
+-- @en-US@ but Amazon Transcribe determines that the language spoken in
+-- your media is @en-AU@, your custom vocabulary /is not/ applied to your
+-- transcription. If you include @LanguageOptions@ and include @en-US@ as
+-- the only English language dialect, your custom vocabulary /is/ applied
+-- to your transcription.
+--
+-- If you want to include a custom language model with your request but
+-- __do not__ want to use automatic language identification, use instead
+-- the parameter with the @LanguageModelName@ sub-parameter. If you want to
+-- include a custom vocabulary or a custom vocabulary filter (or both) with
+-- your request but __do not__ want to use automatic language
+-- identification, use instead the parameter with the @VocabularyName@ or
+-- @VocabularyFilterName@ (or both) sub-parameter.
+--
+-- /See:/ 'newLanguageIdSettings' smart constructor.
+data LanguageIdSettings = LanguageIdSettings'
+  { -- | The name of the custom language model you want to use when processing
+    -- your transcription job. Note that custom language model names are case
+    -- sensitive.
+    --
+    -- The language of the specified custom language model must match the
+    -- language code that you specify in your transcription request. If the
+    -- languages don\'t match, the custom language model isn\'t applied. There
+    -- are no errors or warnings associated with a language mismatch.
+    languageModelName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the custom vocabulary filter you want to use when processing
+    -- your transcription job. Custom vocabulary filter names are case
+    -- sensitive.
+    --
+    -- The language of the specified custom vocabulary filter must match the
+    -- language code that you specify in your transcription request. If the
+    -- languages don\'t match, the custom vocabulary filter isn\'t applied.
+    -- There are no errors or warnings associated with a language mismatch.
+    --
+    -- Note that if you include @VocabularyFilterName@ in your request, you
+    -- must also include @VocabularyFilterMethod@.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the custom vocabulary you want to use when processing your
+    -- transcription job. Custom vocabulary names are case sensitive.
+    --
+    -- The language of the specified custom vocabulary must match the language
+    -- code that you specify in your transcription request. If the languages
+    -- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+    -- or warnings associated with a language mismatch.
+    vocabularyName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LanguageIdSettings' 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:
+--
+-- 'languageModelName', 'languageIdSettings_languageModelName' - The name of the custom language model you want to use when processing
+-- your transcription job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+--
+-- 'vocabularyFilterName', 'languageIdSettings_vocabularyFilterName' - The name of the custom vocabulary filter you want to use when processing
+-- your transcription job. Custom vocabulary filter names are case
+-- sensitive.
+--
+-- The language of the specified custom vocabulary filter must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom vocabulary filter isn\'t applied.
+-- There are no errors or warnings associated with a language mismatch.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+--
+-- 'vocabularyName', 'languageIdSettings_vocabularyName' - The name of the custom vocabulary you want to use when processing your
+-- transcription job. Custom vocabulary names are case sensitive.
+--
+-- The language of the specified custom vocabulary must match the language
+-- code that you specify in your transcription request. If the languages
+-- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+-- or warnings associated with a language mismatch.
+newLanguageIdSettings ::
+  LanguageIdSettings
+newLanguageIdSettings =
+  LanguageIdSettings'
+    { languageModelName =
+        Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing
+    }
+
+-- | The name of the custom language model you want to use when processing
+-- your transcription job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+languageIdSettings_languageModelName :: Lens.Lens' LanguageIdSettings (Prelude.Maybe Prelude.Text)
+languageIdSettings_languageModelName = Lens.lens (\LanguageIdSettings' {languageModelName} -> languageModelName) (\s@LanguageIdSettings' {} a -> s {languageModelName = a} :: LanguageIdSettings)
+
+-- | The name of the custom vocabulary filter you want to use when processing
+-- your transcription job. Custom vocabulary filter names are case
+-- sensitive.
+--
+-- The language of the specified custom vocabulary filter must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom vocabulary filter isn\'t applied.
+-- There are no errors or warnings associated with a language mismatch.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+languageIdSettings_vocabularyFilterName :: Lens.Lens' LanguageIdSettings (Prelude.Maybe Prelude.Text)
+languageIdSettings_vocabularyFilterName = Lens.lens (\LanguageIdSettings' {vocabularyFilterName} -> vocabularyFilterName) (\s@LanguageIdSettings' {} a -> s {vocabularyFilterName = a} :: LanguageIdSettings)
+
+-- | The name of the custom vocabulary you want to use when processing your
+-- transcription job. Custom vocabulary names are case sensitive.
+--
+-- The language of the specified custom vocabulary must match the language
+-- code that you specify in your transcription request. If the languages
+-- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+-- or warnings associated with a language mismatch.
+languageIdSettings_vocabularyName :: Lens.Lens' LanguageIdSettings (Prelude.Maybe Prelude.Text)
+languageIdSettings_vocabularyName = Lens.lens (\LanguageIdSettings' {vocabularyName} -> vocabularyName) (\s@LanguageIdSettings' {} a -> s {vocabularyName = a} :: LanguageIdSettings)
+
+instance Data.FromJSON LanguageIdSettings where
+  parseJSON =
+    Data.withObject
+      "LanguageIdSettings"
+      ( \x ->
+          LanguageIdSettings'
+            Prelude.<$> (x Data..:? "LanguageModelName")
+            Prelude.<*> (x Data..:? "VocabularyFilterName")
+            Prelude.<*> (x Data..:? "VocabularyName")
+      )
+
+instance Prelude.Hashable LanguageIdSettings where
+  hashWithSalt _salt LanguageIdSettings' {..} =
+    _salt
+      `Prelude.hashWithSalt` languageModelName
+      `Prelude.hashWithSalt` vocabularyFilterName
+      `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData LanguageIdSettings where
+  rnf LanguageIdSettings' {..} =
+    Prelude.rnf languageModelName
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf vocabularyName
+
+instance Data.ToJSON LanguageIdSettings where
+  toJSON LanguageIdSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("LanguageModelName" Data..=)
+              Prelude.<$> languageModelName,
+            ("VocabularyFilterName" Data..=)
+              Prelude.<$> vocabularyFilterName,
+            ("VocabularyName" Data..=)
+              Prelude.<$> vocabularyName
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/LanguageModel.hs b/gen/Amazonka/Transcribe/Types/LanguageModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/LanguageModel.hs
@@ -0,0 +1,287 @@
+{-# 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.Transcribe.Types.LanguageModel
+-- 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.Transcribe.Types.LanguageModel 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.Transcribe.Types.BaseModelName
+import Amazonka.Transcribe.Types.CLMLanguageCode
+import Amazonka.Transcribe.Types.InputDataConfig
+import Amazonka.Transcribe.Types.ModelStatus
+
+-- | Provides information about a custom language model, including the base
+-- model name, when the model was created, the location of the files used
+-- to train the model, when the model was last modified, the name you chose
+-- for the model, its language, its processing state, and if there is an
+-- upgrade available for the base model.
+--
+-- /See:/ 'newLanguageModel' smart constructor.
+data LanguageModel = LanguageModel'
+  { -- | The Amazon Transcribe standard language model, or base model, used to
+    -- create your custom language model.
+    baseModelName :: Prelude.Maybe BaseModelName,
+    -- | The date and time the specified custom language model was created.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    createTime :: Prelude.Maybe Data.POSIX,
+    -- | If @ModelStatus@ is @FAILED@, @FailureReason@ contains information about
+    -- why the custom language model request failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 location of the input files used to train and tune your
+    -- custom language model, in addition to the data access role ARN (Amazon
+    -- Resource Name) that has permissions to access these data.
+    inputDataConfig :: Prelude.Maybe InputDataConfig,
+    -- | The language code used to create your custom language model. Each custom
+    -- language model must contain terms in only one language, and the language
+    -- you select for your custom language model must match the language of
+    -- your training and tuning data.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table. Note that U.S. English (@en-US@) is the only language supported
+    -- with Amazon Transcribe Medical.
+    languageCode :: Prelude.Maybe CLMLanguageCode,
+    -- | The date and time the specified custom language model was last modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | A unique name, chosen by you, for your custom language model.
+    --
+    -- This name is case sensitive, cannot contain spaces, and must be unique
+    -- within an Amazon Web Services account.
+    modelName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the specified custom language model. When the status
+    -- displays as @COMPLETED@ the model is ready for use.
+    modelStatus :: Prelude.Maybe ModelStatus,
+    -- | Shows if a more current base model is available for use with the
+    -- specified custom language model.
+    --
+    -- If @false@, your custom language model is using the most up-to-date base
+    -- model.
+    --
+    -- If @true@, there is a newer base model available than the one your
+    -- language model is using.
+    --
+    -- Note that to update a base model, you must recreate the custom language
+    -- model using the new base model. Base model upgrades for existing custom
+    -- language models are not supported.
+    upgradeAvailability :: Prelude.Maybe Prelude.Bool
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'LanguageModel' 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:
+--
+-- 'baseModelName', 'languageModel_baseModelName' - The Amazon Transcribe standard language model, or base model, used to
+-- create your custom language model.
+--
+-- 'createTime', 'languageModel_createTime' - The date and time the specified custom language model was created.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'failureReason', 'languageModel_failureReason' - If @ModelStatus@ is @FAILED@, @FailureReason@ contains information about
+-- why the custom language model request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'inputDataConfig', 'languageModel_inputDataConfig' - The Amazon S3 location of the input files used to train and tune your
+-- custom language model, in addition to the data access role ARN (Amazon
+-- Resource Name) that has permissions to access these data.
+--
+-- 'languageCode', 'languageModel_languageCode' - The language code used to create your custom language model. Each custom
+-- language model must contain terms in only one language, and the language
+-- you select for your custom language model must match the language of
+-- your training and tuning data.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table. Note that U.S. English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+--
+-- 'lastModifiedTime', 'languageModel_lastModifiedTime' - The date and time the specified custom language model was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'modelName', 'languageModel_modelName' - A unique name, chosen by you, for your custom language model.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account.
+--
+-- 'modelStatus', 'languageModel_modelStatus' - The status of the specified custom language model. When the status
+-- displays as @COMPLETED@ the model is ready for use.
+--
+-- 'upgradeAvailability', 'languageModel_upgradeAvailability' - Shows if a more current base model is available for use with the
+-- specified custom language model.
+--
+-- If @false@, your custom language model is using the most up-to-date base
+-- model.
+--
+-- If @true@, there is a newer base model available than the one your
+-- language model is using.
+--
+-- Note that to update a base model, you must recreate the custom language
+-- model using the new base model. Base model upgrades for existing custom
+-- language models are not supported.
+newLanguageModel ::
+  LanguageModel
+newLanguageModel =
+  LanguageModel'
+    { baseModelName = Prelude.Nothing,
+      createTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      inputDataConfig = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      modelName = Prelude.Nothing,
+      modelStatus = Prelude.Nothing,
+      upgradeAvailability = Prelude.Nothing
+    }
+
+-- | The Amazon Transcribe standard language model, or base model, used to
+-- create your custom language model.
+languageModel_baseModelName :: Lens.Lens' LanguageModel (Prelude.Maybe BaseModelName)
+languageModel_baseModelName = Lens.lens (\LanguageModel' {baseModelName} -> baseModelName) (\s@LanguageModel' {} a -> s {baseModelName = a} :: LanguageModel)
+
+-- | The date and time the specified custom language model was created.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+languageModel_createTime :: Lens.Lens' LanguageModel (Prelude.Maybe Prelude.UTCTime)
+languageModel_createTime = Lens.lens (\LanguageModel' {createTime} -> createTime) (\s@LanguageModel' {} a -> s {createTime = a} :: LanguageModel) Prelude.. Lens.mapping Data._Time
+
+-- | If @ModelStatus@ is @FAILED@, @FailureReason@ contains information about
+-- why the custom language model request failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+languageModel_failureReason :: Lens.Lens' LanguageModel (Prelude.Maybe Prelude.Text)
+languageModel_failureReason = Lens.lens (\LanguageModel' {failureReason} -> failureReason) (\s@LanguageModel' {} a -> s {failureReason = a} :: LanguageModel)
+
+-- | The Amazon S3 location of the input files used to train and tune your
+-- custom language model, in addition to the data access role ARN (Amazon
+-- Resource Name) that has permissions to access these data.
+languageModel_inputDataConfig :: Lens.Lens' LanguageModel (Prelude.Maybe InputDataConfig)
+languageModel_inputDataConfig = Lens.lens (\LanguageModel' {inputDataConfig} -> inputDataConfig) (\s@LanguageModel' {} a -> s {inputDataConfig = a} :: LanguageModel)
+
+-- | The language code used to create your custom language model. Each custom
+-- language model must contain terms in only one language, and the language
+-- you select for your custom language model must match the language of
+-- your training and tuning data.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table. Note that U.S. English (@en-US@) is the only language supported
+-- with Amazon Transcribe Medical.
+languageModel_languageCode :: Lens.Lens' LanguageModel (Prelude.Maybe CLMLanguageCode)
+languageModel_languageCode = Lens.lens (\LanguageModel' {languageCode} -> languageCode) (\s@LanguageModel' {} a -> s {languageCode = a} :: LanguageModel)
+
+-- | The date and time the specified custom language model was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+languageModel_lastModifiedTime :: Lens.Lens' LanguageModel (Prelude.Maybe Prelude.UTCTime)
+languageModel_lastModifiedTime = Lens.lens (\LanguageModel' {lastModifiedTime} -> lastModifiedTime) (\s@LanguageModel' {} a -> s {lastModifiedTime = a} :: LanguageModel) Prelude.. Lens.mapping Data._Time
+
+-- | A unique name, chosen by you, for your custom language model.
+--
+-- This name is case sensitive, cannot contain spaces, and must be unique
+-- within an Amazon Web Services account.
+languageModel_modelName :: Lens.Lens' LanguageModel (Prelude.Maybe Prelude.Text)
+languageModel_modelName = Lens.lens (\LanguageModel' {modelName} -> modelName) (\s@LanguageModel' {} a -> s {modelName = a} :: LanguageModel)
+
+-- | The status of the specified custom language model. When the status
+-- displays as @COMPLETED@ the model is ready for use.
+languageModel_modelStatus :: Lens.Lens' LanguageModel (Prelude.Maybe ModelStatus)
+languageModel_modelStatus = Lens.lens (\LanguageModel' {modelStatus} -> modelStatus) (\s@LanguageModel' {} a -> s {modelStatus = a} :: LanguageModel)
+
+-- | Shows if a more current base model is available for use with the
+-- specified custom language model.
+--
+-- If @false@, your custom language model is using the most up-to-date base
+-- model.
+--
+-- If @true@, there is a newer base model available than the one your
+-- language model is using.
+--
+-- Note that to update a base model, you must recreate the custom language
+-- model using the new base model. Base model upgrades for existing custom
+-- language models are not supported.
+languageModel_upgradeAvailability :: Lens.Lens' LanguageModel (Prelude.Maybe Prelude.Bool)
+languageModel_upgradeAvailability = Lens.lens (\LanguageModel' {upgradeAvailability} -> upgradeAvailability) (\s@LanguageModel' {} a -> s {upgradeAvailability = a} :: LanguageModel)
+
+instance Data.FromJSON LanguageModel where
+  parseJSON =
+    Data.withObject
+      "LanguageModel"
+      ( \x ->
+          LanguageModel'
+            Prelude.<$> (x Data..:? "BaseModelName")
+            Prelude.<*> (x Data..:? "CreateTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "InputDataConfig")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "LastModifiedTime")
+            Prelude.<*> (x Data..:? "ModelName")
+            Prelude.<*> (x Data..:? "ModelStatus")
+            Prelude.<*> (x Data..:? "UpgradeAvailability")
+      )
+
+instance Prelude.Hashable LanguageModel where
+  hashWithSalt _salt LanguageModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` baseModelName
+      `Prelude.hashWithSalt` createTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` inputDataConfig
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` modelName
+      `Prelude.hashWithSalt` modelStatus
+      `Prelude.hashWithSalt` upgradeAvailability
+
+instance Prelude.NFData LanguageModel where
+  rnf LanguageModel' {..} =
+    Prelude.rnf baseModelName
+      `Prelude.seq` Prelude.rnf createTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf inputDataConfig
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf modelName
+      `Prelude.seq` Prelude.rnf modelStatus
+      `Prelude.seq` Prelude.rnf upgradeAvailability
diff --git a/gen/Amazonka/Transcribe/Types/Media.hs b/gen/Amazonka/Transcribe/Types/Media.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Media.hs
@@ -0,0 +1,167 @@
+{-# 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.Transcribe.Types.Media
+-- 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.Transcribe.Types.Media 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
+
+-- | Describes the Amazon S3 location of the media file you want to use in
+-- your request.
+--
+-- For information on supported media formats, refer to the
+-- <https://docs.aws.amazon.com/APIReference/API_StartTranscriptionJob.html#transcribe-StartTranscriptionJob-request-MediaFormat MediaFormat>
+-- parameter or the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html#how-input-audio Media formats>
+-- section in the Amazon S3 Developer Guide.
+--
+-- /See:/ 'newMedia' smart constructor.
+data Media = Media'
+  { -- | The Amazon S3 location of the media file you want to transcribe. For
+    -- example:
+    --
+    -- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+    --
+    -- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+    --
+    -- Note that the Amazon S3 bucket that contains your input media must be
+    -- located in the same Amazon Web Services Region where you\'re making your
+    -- transcription request.
+    mediaFileUri :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 location of the media file you want to redact. For
+    -- example:
+    --
+    -- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+    --
+    -- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+    --
+    -- Note that the Amazon S3 bucket that contains your input media must be
+    -- located in the same Amazon Web Services Region where you\'re making your
+    -- transcription request.
+    --
+    -- @RedactedMediaFileUri@ produces a redacted audio file in addition to a
+    -- redacted transcript. It is only supported for Call Analytics
+    -- (@StartCallAnalyticsJob@) transcription requests.
+    redactedMediaFileUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Media' 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:
+--
+-- 'mediaFileUri', 'media_mediaFileUri' - The Amazon S3 location of the media file you want to transcribe. For
+-- example:
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+--
+-- Note that the Amazon S3 bucket that contains your input media must be
+-- located in the same Amazon Web Services Region where you\'re making your
+-- transcription request.
+--
+-- 'redactedMediaFileUri', 'media_redactedMediaFileUri' - The Amazon S3 location of the media file you want to redact. For
+-- example:
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+--
+-- Note that the Amazon S3 bucket that contains your input media must be
+-- located in the same Amazon Web Services Region where you\'re making your
+-- transcription request.
+--
+-- @RedactedMediaFileUri@ produces a redacted audio file in addition to a
+-- redacted transcript. It is only supported for Call Analytics
+-- (@StartCallAnalyticsJob@) transcription requests.
+newMedia ::
+  Media
+newMedia =
+  Media'
+    { mediaFileUri = Prelude.Nothing,
+      redactedMediaFileUri = Prelude.Nothing
+    }
+
+-- | The Amazon S3 location of the media file you want to transcribe. For
+-- example:
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+--
+-- Note that the Amazon S3 bucket that contains your input media must be
+-- located in the same Amazon Web Services Region where you\'re making your
+-- transcription request.
+media_mediaFileUri :: Lens.Lens' Media (Prelude.Maybe Prelude.Text)
+media_mediaFileUri = Lens.lens (\Media' {mediaFileUri} -> mediaFileUri) (\s@Media' {} a -> s {mediaFileUri = a} :: Media)
+
+-- | The Amazon S3 location of the media file you want to redact. For
+-- example:
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/my-media-file.flac@
+--
+-- -   @s3:\/\/DOC-EXAMPLE-BUCKET\/media-files\/my-media-file.flac@
+--
+-- Note that the Amazon S3 bucket that contains your input media must be
+-- located in the same Amazon Web Services Region where you\'re making your
+-- transcription request.
+--
+-- @RedactedMediaFileUri@ produces a redacted audio file in addition to a
+-- redacted transcript. It is only supported for Call Analytics
+-- (@StartCallAnalyticsJob@) transcription requests.
+media_redactedMediaFileUri :: Lens.Lens' Media (Prelude.Maybe Prelude.Text)
+media_redactedMediaFileUri = Lens.lens (\Media' {redactedMediaFileUri} -> redactedMediaFileUri) (\s@Media' {} a -> s {redactedMediaFileUri = a} :: Media)
+
+instance Data.FromJSON Media where
+  parseJSON =
+    Data.withObject
+      "Media"
+      ( \x ->
+          Media'
+            Prelude.<$> (x Data..:? "MediaFileUri")
+            Prelude.<*> (x Data..:? "RedactedMediaFileUri")
+      )
+
+instance Prelude.Hashable Media where
+  hashWithSalt _salt Media' {..} =
+    _salt
+      `Prelude.hashWithSalt` mediaFileUri
+      `Prelude.hashWithSalt` redactedMediaFileUri
+
+instance Prelude.NFData Media where
+  rnf Media' {..} =
+    Prelude.rnf mediaFileUri
+      `Prelude.seq` Prelude.rnf redactedMediaFileUri
+
+instance Data.ToJSON Media where
+  toJSON Media' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MediaFileUri" Data..=) Prelude.<$> mediaFileUri,
+            ("RedactedMediaFileUri" Data..=)
+              Prelude.<$> redactedMediaFileUri
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/MediaFormat.hs b/gen/Amazonka/Transcribe/Types/MediaFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MediaFormat.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.Transcribe.Types.MediaFormat
+-- 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.Transcribe.Types.MediaFormat
+  ( MediaFormat
+      ( ..,
+        MediaFormat_Amr,
+        MediaFormat_Flac,
+        MediaFormat_Mp3,
+        MediaFormat_Mp4,
+        MediaFormat_Ogg,
+        MediaFormat_Wav,
+        MediaFormat_Webm
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MediaFormat = MediaFormat'
+  { fromMediaFormat ::
+      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 MediaFormat_Amr :: MediaFormat
+pattern MediaFormat_Amr = MediaFormat' "amr"
+
+pattern MediaFormat_Flac :: MediaFormat
+pattern MediaFormat_Flac = MediaFormat' "flac"
+
+pattern MediaFormat_Mp3 :: MediaFormat
+pattern MediaFormat_Mp3 = MediaFormat' "mp3"
+
+pattern MediaFormat_Mp4 :: MediaFormat
+pattern MediaFormat_Mp4 = MediaFormat' "mp4"
+
+pattern MediaFormat_Ogg :: MediaFormat
+pattern MediaFormat_Ogg = MediaFormat' "ogg"
+
+pattern MediaFormat_Wav :: MediaFormat
+pattern MediaFormat_Wav = MediaFormat' "wav"
+
+pattern MediaFormat_Webm :: MediaFormat
+pattern MediaFormat_Webm = MediaFormat' "webm"
+
+{-# COMPLETE
+  MediaFormat_Amr,
+  MediaFormat_Flac,
+  MediaFormat_Mp3,
+  MediaFormat_Mp4,
+  MediaFormat_Ogg,
+  MediaFormat_Wav,
+  MediaFormat_Webm,
+  MediaFormat'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/MedicalContentIdentificationType.hs b/gen/Amazonka/Transcribe/Types/MedicalContentIdentificationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MedicalContentIdentificationType.hs
@@ -0,0 +1,66 @@
+{-# 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.Transcribe.Types.MedicalContentIdentificationType
+-- 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.Transcribe.Types.MedicalContentIdentificationType
+  ( MedicalContentIdentificationType
+      ( ..,
+        MedicalContentIdentificationType_PHI
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype MedicalContentIdentificationType = MedicalContentIdentificationType'
+  { fromMedicalContentIdentificationType ::
+      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 MedicalContentIdentificationType_PHI :: MedicalContentIdentificationType
+pattern MedicalContentIdentificationType_PHI = MedicalContentIdentificationType' "PHI"
+
+{-# COMPLETE
+  MedicalContentIdentificationType_PHI,
+  MedicalContentIdentificationType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/MedicalTranscript.hs b/gen/Amazonka/Transcribe/Types/MedicalTranscript.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MedicalTranscript.hs
@@ -0,0 +1,85 @@
+{-# 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.Transcribe.Types.MedicalTranscript
+-- 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.Transcribe.Types.MedicalTranscript 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
+
+-- | Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+--
+-- /See:/ 'newMedicalTranscript' smart constructor.
+data MedicalTranscript = MedicalTranscript'
+  { -- | The Amazon S3 location of your transcript. You can use this URI to
+    -- access or download your transcript.
+    --
+    -- Note that this is the Amazon S3 location you specified in your request
+    -- using the @OutputBucketName@ parameter.
+    transcriptFileUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MedicalTranscript' 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:
+--
+-- 'transcriptFileUri', 'medicalTranscript_transcriptFileUri' - The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your transcript.
+--
+-- Note that this is the Amazon S3 location you specified in your request
+-- using the @OutputBucketName@ parameter.
+newMedicalTranscript ::
+  MedicalTranscript
+newMedicalTranscript =
+  MedicalTranscript'
+    { transcriptFileUri =
+        Prelude.Nothing
+    }
+
+-- | The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your transcript.
+--
+-- Note that this is the Amazon S3 location you specified in your request
+-- using the @OutputBucketName@ parameter.
+medicalTranscript_transcriptFileUri :: Lens.Lens' MedicalTranscript (Prelude.Maybe Prelude.Text)
+medicalTranscript_transcriptFileUri = Lens.lens (\MedicalTranscript' {transcriptFileUri} -> transcriptFileUri) (\s@MedicalTranscript' {} a -> s {transcriptFileUri = a} :: MedicalTranscript)
+
+instance Data.FromJSON MedicalTranscript where
+  parseJSON =
+    Data.withObject
+      "MedicalTranscript"
+      ( \x ->
+          MedicalTranscript'
+            Prelude.<$> (x Data..:? "TranscriptFileUri")
+      )
+
+instance Prelude.Hashable MedicalTranscript where
+  hashWithSalt _salt MedicalTranscript' {..} =
+    _salt `Prelude.hashWithSalt` transcriptFileUri
+
+instance Prelude.NFData MedicalTranscript where
+  rnf MedicalTranscript' {..} =
+    Prelude.rnf transcriptFileUri
diff --git a/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJob.hs b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJob.hs
@@ -0,0 +1,469 @@
+{-# 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.Transcribe.Types.MedicalTranscriptionJob
+-- 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.Transcribe.Types.MedicalTranscriptionJob 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.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.Media
+import Amazonka.Transcribe.Types.MediaFormat
+import Amazonka.Transcribe.Types.MedicalContentIdentificationType
+import Amazonka.Transcribe.Types.MedicalTranscript
+import Amazonka.Transcribe.Types.MedicalTranscriptionSetting
+import Amazonka.Transcribe.Types.Specialty
+import Amazonka.Transcribe.Types.Tag
+import Amazonka.Transcribe.Types.TranscriptionJobStatus
+import Amazonka.Transcribe.Types.Type
+
+-- | Provides detailed information about a medical transcription job.
+--
+-- To view the status of the specified medical transcription job, check the
+-- @TranscriptionJobStatus@ field. If the status is @COMPLETED@, the job is
+-- finished and you can find the results at the location specified in
+-- @TranscriptFileUri@. If the status is @FAILED@, @FailureReason@ provides
+-- details on why your transcription job failed.
+--
+-- /See:/ 'newMedicalTranscriptionJob' smart constructor.
+data MedicalTranscriptionJob = MedicalTranscriptionJob'
+  { -- | The date and time the specified medical transcription job finished
+    -- processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | Indicates whether content identification was enabled for your
+    -- transcription request.
+    contentIdentificationType :: Prelude.Maybe MedicalContentIdentificationType,
+    -- | The date and time the specified medical transcription job request was
+    -- made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the transcription job request failed.
+    --
+    -- The @FailureReason@ field contains one of the following values:
+    --
+    -- -   @Unsupported media format@.
+    --
+    --     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+    --     __MediaFormat__ for a list of supported formats.
+    --
+    -- -   @The media format provided does not match the detected media format@.
+    --
+    --     The media format specified in @MediaFormat@ doesn\'t match the
+    --     format of the input file. Check the media format of your media file
+    --     and correct the specified value.
+    --
+    -- -   @Invalid sample rate for audio file@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+    --     The sample rate must be between 16,000 and 48,000 hertz.
+    --
+    -- -   @The sample rate provided does not match the detected sample rate@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+    --     the sample rate detected in your input media file. Check the sample
+    --     rate of your media file and correct the specified value.
+    --
+    -- -   @Invalid file size: file size too large@.
+    --
+    --     The size of your media file is larger than what Amazon Transcribe
+    --     can process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    --
+    -- -   @Invalid number of channels: number of channels too large@.
+    --
+    --     Your audio contains more channels than Amazon Transcribe is able to
+    --     process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code used to create your medical transcription job. US
+    -- English (@en-US@) is the only supported language for medical
+    -- transcriptions.
+    languageCode :: Prelude.Maybe LanguageCode,
+    media :: Prelude.Maybe Media,
+    -- | The format of the input media file.
+    mediaFormat :: Prelude.Maybe MediaFormat,
+    -- | The sample rate, in hertz, of the audio track in your input media file.
+    mediaSampleRateHertz :: Prelude.Maybe Prelude.Natural,
+    -- | The name of the medical transcription job. Job names are case sensitive
+    -- and must be unique within an Amazon Web Services account.
+    medicalTranscriptionJobName :: Prelude.Maybe Prelude.Text,
+    -- | Provides information on any additional settings that were included in
+    -- your request. Additional settings include channel identification,
+    -- alternative transcriptions, speaker partitioning, custom vocabularies,
+    -- and custom vocabulary filters.
+    settings :: Prelude.Maybe MedicalTranscriptionSetting,
+    -- | Describes the medical specialty represented in your media.
+    specialty :: Prelude.Maybe Specialty,
+    -- | The date and time the specified medical transcription job began
+    -- processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The tags, each in the form of a key:value pair, assigned to the
+    -- specified medical transcription job.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | Provides you with the Amazon S3 URI you can use to access your
+    -- transcript.
+    transcript :: Prelude.Maybe MedicalTranscript,
+    -- | Provides the status of the specified medical transcription job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@. If the status
+    -- is @FAILED@, @FailureReason@ provides details on why your transcription
+    -- job failed.
+    transcriptionJobStatus :: Prelude.Maybe TranscriptionJobStatus,
+    -- | Indicates whether the input media is a dictation or a conversation, as
+    -- specified in the @StartMedicalTranscriptionJob@ request.
+    type' :: Prelude.Maybe Type
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MedicalTranscriptionJob' 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:
+--
+-- 'completionTime', 'medicalTranscriptionJob_completionTime' - The date and time the specified medical transcription job finished
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'contentIdentificationType', 'medicalTranscriptionJob_contentIdentificationType' - Indicates whether content identification was enabled for your
+-- transcription request.
+--
+-- 'creationTime', 'medicalTranscriptionJob_creationTime' - The date and time the specified medical transcription job request was
+-- made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'failureReason', 'medicalTranscriptionJob_failureReason' - If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 16,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- 'languageCode', 'medicalTranscriptionJob_languageCode' - The language code used to create your medical transcription job. US
+-- English (@en-US@) is the only supported language for medical
+-- transcriptions.
+--
+-- 'media', 'medicalTranscriptionJob_media' - Undocumented member.
+--
+-- 'mediaFormat', 'medicalTranscriptionJob_mediaFormat' - The format of the input media file.
+--
+-- 'mediaSampleRateHertz', 'medicalTranscriptionJob_mediaSampleRateHertz' - The sample rate, in hertz, of the audio track in your input media file.
+--
+-- 'medicalTranscriptionJobName', 'medicalTranscriptionJob_medicalTranscriptionJobName' - The name of the medical transcription job. Job names are case sensitive
+-- and must be unique within an Amazon Web Services account.
+--
+-- 'settings', 'medicalTranscriptionJob_settings' - Provides information on any additional settings that were included in
+-- your request. Additional settings include channel identification,
+-- alternative transcriptions, speaker partitioning, custom vocabularies,
+-- and custom vocabulary filters.
+--
+-- 'specialty', 'medicalTranscriptionJob_specialty' - Describes the medical specialty represented in your media.
+--
+-- 'startTime', 'medicalTranscriptionJob_startTime' - The date and time the specified medical transcription job began
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'tags', 'medicalTranscriptionJob_tags' - The tags, each in the form of a key:value pair, assigned to the
+-- specified medical transcription job.
+--
+-- 'transcript', 'medicalTranscriptionJob_transcript' - Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+--
+-- 'transcriptionJobStatus', 'medicalTranscriptionJob_transcriptionJobStatus' - Provides the status of the specified medical transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@. If the status
+-- is @FAILED@, @FailureReason@ provides details on why your transcription
+-- job failed.
+--
+-- 'type'', 'medicalTranscriptionJob_type' - Indicates whether the input media is a dictation or a conversation, as
+-- specified in the @StartMedicalTranscriptionJob@ request.
+newMedicalTranscriptionJob ::
+  MedicalTranscriptionJob
+newMedicalTranscriptionJob =
+  MedicalTranscriptionJob'
+    { completionTime =
+        Prelude.Nothing,
+      contentIdentificationType = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      media = Prelude.Nothing,
+      mediaFormat = Prelude.Nothing,
+      mediaSampleRateHertz = Prelude.Nothing,
+      medicalTranscriptionJobName = Prelude.Nothing,
+      settings = Prelude.Nothing,
+      specialty = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      transcript = Prelude.Nothing,
+      transcriptionJobStatus = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The date and time the specified medical transcription job finished
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJob_completionTime :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJob_completionTime = Lens.lens (\MedicalTranscriptionJob' {completionTime} -> completionTime) (\s@MedicalTranscriptionJob' {} a -> s {completionTime = a} :: MedicalTranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | Indicates whether content identification was enabled for your
+-- transcription request.
+medicalTranscriptionJob_contentIdentificationType :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe MedicalContentIdentificationType)
+medicalTranscriptionJob_contentIdentificationType = Lens.lens (\MedicalTranscriptionJob' {contentIdentificationType} -> contentIdentificationType) (\s@MedicalTranscriptionJob' {} a -> s {contentIdentificationType = a} :: MedicalTranscriptionJob)
+
+-- | The date and time the specified medical transcription job request was
+-- made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJob_creationTime :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJob_creationTime = Lens.lens (\MedicalTranscriptionJob' {creationTime} -> creationTime) (\s@MedicalTranscriptionJob' {} a -> s {creationTime = a} :: MedicalTranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 16,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+medicalTranscriptionJob_failureReason :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.Text)
+medicalTranscriptionJob_failureReason = Lens.lens (\MedicalTranscriptionJob' {failureReason} -> failureReason) (\s@MedicalTranscriptionJob' {} a -> s {failureReason = a} :: MedicalTranscriptionJob)
+
+-- | The language code used to create your medical transcription job. US
+-- English (@en-US@) is the only supported language for medical
+-- transcriptions.
+medicalTranscriptionJob_languageCode :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe LanguageCode)
+medicalTranscriptionJob_languageCode = Lens.lens (\MedicalTranscriptionJob' {languageCode} -> languageCode) (\s@MedicalTranscriptionJob' {} a -> s {languageCode = a} :: MedicalTranscriptionJob)
+
+-- | Undocumented member.
+medicalTranscriptionJob_media :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Media)
+medicalTranscriptionJob_media = Lens.lens (\MedicalTranscriptionJob' {media} -> media) (\s@MedicalTranscriptionJob' {} a -> s {media = a} :: MedicalTranscriptionJob)
+
+-- | The format of the input media file.
+medicalTranscriptionJob_mediaFormat :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe MediaFormat)
+medicalTranscriptionJob_mediaFormat = Lens.lens (\MedicalTranscriptionJob' {mediaFormat} -> mediaFormat) (\s@MedicalTranscriptionJob' {} a -> s {mediaFormat = a} :: MedicalTranscriptionJob)
+
+-- | The sample rate, in hertz, of the audio track in your input media file.
+medicalTranscriptionJob_mediaSampleRateHertz :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.Natural)
+medicalTranscriptionJob_mediaSampleRateHertz = Lens.lens (\MedicalTranscriptionJob' {mediaSampleRateHertz} -> mediaSampleRateHertz) (\s@MedicalTranscriptionJob' {} a -> s {mediaSampleRateHertz = a} :: MedicalTranscriptionJob)
+
+-- | The name of the medical transcription job. Job names are case sensitive
+-- and must be unique within an Amazon Web Services account.
+medicalTranscriptionJob_medicalTranscriptionJobName :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.Text)
+medicalTranscriptionJob_medicalTranscriptionJobName = Lens.lens (\MedicalTranscriptionJob' {medicalTranscriptionJobName} -> medicalTranscriptionJobName) (\s@MedicalTranscriptionJob' {} a -> s {medicalTranscriptionJobName = a} :: MedicalTranscriptionJob)
+
+-- | Provides information on any additional settings that were included in
+-- your request. Additional settings include channel identification,
+-- alternative transcriptions, speaker partitioning, custom vocabularies,
+-- and custom vocabulary filters.
+medicalTranscriptionJob_settings :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe MedicalTranscriptionSetting)
+medicalTranscriptionJob_settings = Lens.lens (\MedicalTranscriptionJob' {settings} -> settings) (\s@MedicalTranscriptionJob' {} a -> s {settings = a} :: MedicalTranscriptionJob)
+
+-- | Describes the medical specialty represented in your media.
+medicalTranscriptionJob_specialty :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Specialty)
+medicalTranscriptionJob_specialty = Lens.lens (\MedicalTranscriptionJob' {specialty} -> specialty) (\s@MedicalTranscriptionJob' {} a -> s {specialty = a} :: MedicalTranscriptionJob)
+
+-- | The date and time the specified medical transcription job began
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJob_startTime :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJob_startTime = Lens.lens (\MedicalTranscriptionJob' {startTime} -> startTime) (\s@MedicalTranscriptionJob' {} a -> s {startTime = a} :: MedicalTranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | The tags, each in the form of a key:value pair, assigned to the
+-- specified medical transcription job.
+medicalTranscriptionJob_tags :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe (Prelude.NonEmpty Tag))
+medicalTranscriptionJob_tags = Lens.lens (\MedicalTranscriptionJob' {tags} -> tags) (\s@MedicalTranscriptionJob' {} a -> s {tags = a} :: MedicalTranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+medicalTranscriptionJob_transcript :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe MedicalTranscript)
+medicalTranscriptionJob_transcript = Lens.lens (\MedicalTranscriptionJob' {transcript} -> transcript) (\s@MedicalTranscriptionJob' {} a -> s {transcript = a} :: MedicalTranscriptionJob)
+
+-- | Provides the status of the specified medical transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@. If the status
+-- is @FAILED@, @FailureReason@ provides details on why your transcription
+-- job failed.
+medicalTranscriptionJob_transcriptionJobStatus :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe TranscriptionJobStatus)
+medicalTranscriptionJob_transcriptionJobStatus = Lens.lens (\MedicalTranscriptionJob' {transcriptionJobStatus} -> transcriptionJobStatus) (\s@MedicalTranscriptionJob' {} a -> s {transcriptionJobStatus = a} :: MedicalTranscriptionJob)
+
+-- | Indicates whether the input media is a dictation or a conversation, as
+-- specified in the @StartMedicalTranscriptionJob@ request.
+medicalTranscriptionJob_type :: Lens.Lens' MedicalTranscriptionJob (Prelude.Maybe Type)
+medicalTranscriptionJob_type = Lens.lens (\MedicalTranscriptionJob' {type'} -> type') (\s@MedicalTranscriptionJob' {} a -> s {type' = a} :: MedicalTranscriptionJob)
+
+instance Data.FromJSON MedicalTranscriptionJob where
+  parseJSON =
+    Data.withObject
+      "MedicalTranscriptionJob"
+      ( \x ->
+          MedicalTranscriptionJob'
+            Prelude.<$> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "ContentIdentificationType")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "Media")
+            Prelude.<*> (x Data..:? "MediaFormat")
+            Prelude.<*> (x Data..:? "MediaSampleRateHertz")
+            Prelude.<*> (x Data..:? "MedicalTranscriptionJobName")
+            Prelude.<*> (x Data..:? "Settings")
+            Prelude.<*> (x Data..:? "Specialty")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "Tags")
+            Prelude.<*> (x Data..:? "Transcript")
+            Prelude.<*> (x Data..:? "TranscriptionJobStatus")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance Prelude.Hashable MedicalTranscriptionJob where
+  hashWithSalt _salt MedicalTranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` completionTime
+      `Prelude.hashWithSalt` contentIdentificationType
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` media
+      `Prelude.hashWithSalt` mediaFormat
+      `Prelude.hashWithSalt` mediaSampleRateHertz
+      `Prelude.hashWithSalt` medicalTranscriptionJobName
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` specialty
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` transcript
+      `Prelude.hashWithSalt` transcriptionJobStatus
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData MedicalTranscriptionJob where
+  rnf MedicalTranscriptionJob' {..} =
+    Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf contentIdentificationType
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf media
+      `Prelude.seq` Prelude.rnf mediaFormat
+      `Prelude.seq` Prelude.rnf mediaSampleRateHertz
+      `Prelude.seq` Prelude.rnf medicalTranscriptionJobName
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf specialty
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf transcript
+      `Prelude.seq` Prelude.rnf transcriptionJobStatus
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJobSummary.hs b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionJobSummary.hs
@@ -0,0 +1,314 @@
+{-# 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.Transcribe.Types.MedicalTranscriptionJobSummary
+-- 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.Transcribe.Types.MedicalTranscriptionJobSummary 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.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.MedicalContentIdentificationType
+import Amazonka.Transcribe.Types.OutputLocationType
+import Amazonka.Transcribe.Types.Specialty
+import Amazonka.Transcribe.Types.TranscriptionJobStatus
+import Amazonka.Transcribe.Types.Type
+
+-- | Provides detailed information about a specific medical transcription
+-- job.
+--
+-- /See:/ 'newMedicalTranscriptionJobSummary' smart constructor.
+data MedicalTranscriptionJobSummary = MedicalTranscriptionJobSummary'
+  { -- | The date and time the specified medical transcription job finished
+    -- processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | Labels all personal health information (PHI) identified in your
+    -- transcript. For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+    contentIdentificationType :: Prelude.Maybe MedicalContentIdentificationType,
+    -- | The date and time the specified medical transcription job request was
+    -- made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the transcription job failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The language code used to create your medical transcription. US English
+    -- (@en-US@) is the only supported language for medical transcriptions.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The name of the medical transcription job. Job names are case sensitive
+    -- and must be unique within an Amazon Web Services account.
+    medicalTranscriptionJobName :: Prelude.Maybe Prelude.Text,
+    -- | Indicates where the specified medical transcription output is stored.
+    --
+    -- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+    -- you specified using the @OutputBucketName@ parameter in your request. If
+    -- you also included @OutputKey@ in your request, your output is located in
+    -- the path you specified in your request.
+    --
+    -- If the value is @SERVICE_BUCKET@, the location is a service-managed
+    -- Amazon S3 bucket. To access a transcript stored in a service-managed
+    -- bucket, use the URI shown in the @TranscriptFileUri@ field.
+    outputLocationType :: Prelude.Maybe OutputLocationType,
+    -- | Provides the medical specialty represented in your media.
+    specialty :: Prelude.Maybe Specialty,
+    -- | The date and time your medical transcription job began processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | Provides the status of your medical transcription job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@. If the status
+    -- is @FAILED@, @FailureReason@ provides details on why your transcription
+    -- job failed.
+    transcriptionJobStatus :: Prelude.Maybe TranscriptionJobStatus,
+    -- | Indicates whether the input media is a dictation or a conversation, as
+    -- specified in the @StartMedicalTranscriptionJob@ request.
+    type' :: Prelude.Maybe Type
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MedicalTranscriptionJobSummary' 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:
+--
+-- 'completionTime', 'medicalTranscriptionJobSummary_completionTime' - The date and time the specified medical transcription job finished
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'contentIdentificationType', 'medicalTranscriptionJobSummary_contentIdentificationType' - Labels all personal health information (PHI) identified in your
+-- transcript. For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+--
+-- 'creationTime', 'medicalTranscriptionJobSummary_creationTime' - The date and time the specified medical transcription job request was
+-- made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'failureReason', 'medicalTranscriptionJobSummary_failureReason' - If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'languageCode', 'medicalTranscriptionJobSummary_languageCode' - The language code used to create your medical transcription. US English
+-- (@en-US@) is the only supported language for medical transcriptions.
+--
+-- 'medicalTranscriptionJobName', 'medicalTranscriptionJobSummary_medicalTranscriptionJobName' - The name of the medical transcription job. Job names are case sensitive
+-- and must be unique within an Amazon Web Services account.
+--
+-- 'outputLocationType', 'medicalTranscriptionJobSummary_outputLocationType' - Indicates where the specified medical transcription output is stored.
+--
+-- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+-- you specified using the @OutputBucketName@ parameter in your request. If
+-- you also included @OutputKey@ in your request, your output is located in
+-- the path you specified in your request.
+--
+-- If the value is @SERVICE_BUCKET@, the location is a service-managed
+-- Amazon S3 bucket. To access a transcript stored in a service-managed
+-- bucket, use the URI shown in the @TranscriptFileUri@ field.
+--
+-- 'specialty', 'medicalTranscriptionJobSummary_specialty' - Provides the medical specialty represented in your media.
+--
+-- 'startTime', 'medicalTranscriptionJobSummary_startTime' - The date and time your medical transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'transcriptionJobStatus', 'medicalTranscriptionJobSummary_transcriptionJobStatus' - Provides the status of your medical transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@. If the status
+-- is @FAILED@, @FailureReason@ provides details on why your transcription
+-- job failed.
+--
+-- 'type'', 'medicalTranscriptionJobSummary_type' - Indicates whether the input media is a dictation or a conversation, as
+-- specified in the @StartMedicalTranscriptionJob@ request.
+newMedicalTranscriptionJobSummary ::
+  MedicalTranscriptionJobSummary
+newMedicalTranscriptionJobSummary =
+  MedicalTranscriptionJobSummary'
+    { completionTime =
+        Prelude.Nothing,
+      contentIdentificationType = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      medicalTranscriptionJobName =
+        Prelude.Nothing,
+      outputLocationType = Prelude.Nothing,
+      specialty = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      transcriptionJobStatus = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The date and time the specified medical transcription job finished
+-- processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJobSummary_completionTime :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJobSummary_completionTime = Lens.lens (\MedicalTranscriptionJobSummary' {completionTime} -> completionTime) (\s@MedicalTranscriptionJobSummary' {} a -> s {completionTime = a} :: MedicalTranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Labels all personal health information (PHI) identified in your
+-- transcript. For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html Identifying personal health information (PHI) in a transcription>.
+medicalTranscriptionJobSummary_contentIdentificationType :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe MedicalContentIdentificationType)
+medicalTranscriptionJobSummary_contentIdentificationType = Lens.lens (\MedicalTranscriptionJobSummary' {contentIdentificationType} -> contentIdentificationType) (\s@MedicalTranscriptionJobSummary' {} a -> s {contentIdentificationType = a} :: MedicalTranscriptionJobSummary)
+
+-- | The date and time the specified medical transcription job request was
+-- made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJobSummary_creationTime :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJobSummary_creationTime = Lens.lens (\MedicalTranscriptionJobSummary' {creationTime} -> creationTime) (\s@MedicalTranscriptionJobSummary' {} a -> s {creationTime = a} :: MedicalTranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+medicalTranscriptionJobSummary_failureReason :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Prelude.Text)
+medicalTranscriptionJobSummary_failureReason = Lens.lens (\MedicalTranscriptionJobSummary' {failureReason} -> failureReason) (\s@MedicalTranscriptionJobSummary' {} a -> s {failureReason = a} :: MedicalTranscriptionJobSummary)
+
+-- | The language code used to create your medical transcription. US English
+-- (@en-US@) is the only supported language for medical transcriptions.
+medicalTranscriptionJobSummary_languageCode :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe LanguageCode)
+medicalTranscriptionJobSummary_languageCode = Lens.lens (\MedicalTranscriptionJobSummary' {languageCode} -> languageCode) (\s@MedicalTranscriptionJobSummary' {} a -> s {languageCode = a} :: MedicalTranscriptionJobSummary)
+
+-- | The name of the medical transcription job. Job names are case sensitive
+-- and must be unique within an Amazon Web Services account.
+medicalTranscriptionJobSummary_medicalTranscriptionJobName :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Prelude.Text)
+medicalTranscriptionJobSummary_medicalTranscriptionJobName = Lens.lens (\MedicalTranscriptionJobSummary' {medicalTranscriptionJobName} -> medicalTranscriptionJobName) (\s@MedicalTranscriptionJobSummary' {} a -> s {medicalTranscriptionJobName = a} :: MedicalTranscriptionJobSummary)
+
+-- | Indicates where the specified medical transcription output is stored.
+--
+-- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+-- you specified using the @OutputBucketName@ parameter in your request. If
+-- you also included @OutputKey@ in your request, your output is located in
+-- the path you specified in your request.
+--
+-- If the value is @SERVICE_BUCKET@, the location is a service-managed
+-- Amazon S3 bucket. To access a transcript stored in a service-managed
+-- bucket, use the URI shown in the @TranscriptFileUri@ field.
+medicalTranscriptionJobSummary_outputLocationType :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe OutputLocationType)
+medicalTranscriptionJobSummary_outputLocationType = Lens.lens (\MedicalTranscriptionJobSummary' {outputLocationType} -> outputLocationType) (\s@MedicalTranscriptionJobSummary' {} a -> s {outputLocationType = a} :: MedicalTranscriptionJobSummary)
+
+-- | Provides the medical specialty represented in your media.
+medicalTranscriptionJobSummary_specialty :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Specialty)
+medicalTranscriptionJobSummary_specialty = Lens.lens (\MedicalTranscriptionJobSummary' {specialty} -> specialty) (\s@MedicalTranscriptionJobSummary' {} a -> s {specialty = a} :: MedicalTranscriptionJobSummary)
+
+-- | The date and time your medical transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+medicalTranscriptionJobSummary_startTime :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+medicalTranscriptionJobSummary_startTime = Lens.lens (\MedicalTranscriptionJobSummary' {startTime} -> startTime) (\s@MedicalTranscriptionJobSummary' {} a -> s {startTime = a} :: MedicalTranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Provides the status of your medical transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@. If the status
+-- is @FAILED@, @FailureReason@ provides details on why your transcription
+-- job failed.
+medicalTranscriptionJobSummary_transcriptionJobStatus :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe TranscriptionJobStatus)
+medicalTranscriptionJobSummary_transcriptionJobStatus = Lens.lens (\MedicalTranscriptionJobSummary' {transcriptionJobStatus} -> transcriptionJobStatus) (\s@MedicalTranscriptionJobSummary' {} a -> s {transcriptionJobStatus = a} :: MedicalTranscriptionJobSummary)
+
+-- | Indicates whether the input media is a dictation or a conversation, as
+-- specified in the @StartMedicalTranscriptionJob@ request.
+medicalTranscriptionJobSummary_type :: Lens.Lens' MedicalTranscriptionJobSummary (Prelude.Maybe Type)
+medicalTranscriptionJobSummary_type = Lens.lens (\MedicalTranscriptionJobSummary' {type'} -> type') (\s@MedicalTranscriptionJobSummary' {} a -> s {type' = a} :: MedicalTranscriptionJobSummary)
+
+instance Data.FromJSON MedicalTranscriptionJobSummary where
+  parseJSON =
+    Data.withObject
+      "MedicalTranscriptionJobSummary"
+      ( \x ->
+          MedicalTranscriptionJobSummary'
+            Prelude.<$> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "ContentIdentificationType")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "MedicalTranscriptionJobName")
+            Prelude.<*> (x Data..:? "OutputLocationType")
+            Prelude.<*> (x Data..:? "Specialty")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "TranscriptionJobStatus")
+            Prelude.<*> (x Data..:? "Type")
+      )
+
+instance
+  Prelude.Hashable
+    MedicalTranscriptionJobSummary
+  where
+  hashWithSalt
+    _salt
+    MedicalTranscriptionJobSummary' {..} =
+      _salt
+        `Prelude.hashWithSalt` completionTime
+        `Prelude.hashWithSalt` contentIdentificationType
+        `Prelude.hashWithSalt` creationTime
+        `Prelude.hashWithSalt` failureReason
+        `Prelude.hashWithSalt` languageCode
+        `Prelude.hashWithSalt` medicalTranscriptionJobName
+        `Prelude.hashWithSalt` outputLocationType
+        `Prelude.hashWithSalt` specialty
+        `Prelude.hashWithSalt` startTime
+        `Prelude.hashWithSalt` transcriptionJobStatus
+        `Prelude.hashWithSalt` type'
+
+instance
+  Prelude.NFData
+    MedicalTranscriptionJobSummary
+  where
+  rnf MedicalTranscriptionJobSummary' {..} =
+    Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf contentIdentificationType
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf medicalTranscriptionJobName
+      `Prelude.seq` Prelude.rnf outputLocationType
+      `Prelude.seq` Prelude.rnf specialty
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf transcriptionJobStatus
+      `Prelude.seq` Prelude.rnf type'
diff --git a/gen/Amazonka/Transcribe/Types/MedicalTranscriptionSetting.hs b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionSetting.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/MedicalTranscriptionSetting.hs
@@ -0,0 +1,335 @@
+{-# 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.Transcribe.Types.MedicalTranscriptionSetting
+-- 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.Transcribe.Types.MedicalTranscriptionSetting 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
+
+-- | Allows additional optional settings in your request, including channel
+-- identification, alternative transcriptions, and speaker partitioning.
+-- You can use that to apply custom vocabularies to your medical
+-- transcription job.
+--
+-- /See:/ 'newMedicalTranscriptionSetting' smart constructor.
+data MedicalTranscriptionSetting = MedicalTranscriptionSetting'
+  { -- | Enables channel identification in multi-channel audio.
+    --
+    -- Channel identification transcribes the audio on each channel
+    -- independently, then appends the output for each channel into one
+    -- transcript.
+    --
+    -- If you have multi-channel audio and do not enable channel
+    -- identification, your audio is transcribed in a continuous manner and
+    -- your transcript does not separate the speech by channel.
+    --
+    -- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+    -- in the same request. Including both parameters returns a
+    -- @BadRequestException@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+    channelIdentification :: Prelude.Maybe Prelude.Bool,
+    -- | Indicate the maximum number of alternative transcriptions you want
+    -- Amazon Transcribe Medical to include in your transcript.
+    --
+    -- If you select a number greater than the number of alternative
+    -- transcriptions generated by Amazon Transcribe Medical, only the actual
+    -- number of alternative transcriptions are included.
+    --
+    -- If you include @MaxAlternatives@ in your request, you must also include
+    -- @ShowAlternatives@ with a value of @true@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+    maxAlternatives :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the maximum number of speakers you want to partition in your
+    -- media.
+    --
+    -- Note that if your media contains more speakers than the specified
+    -- number, multiple speakers are treated as a single speaker.
+    --
+    -- If you specify the @MaxSpeakerLabels@ field, you must set the
+    -- @ShowSpeakerLabels@ field to true.
+    maxSpeakerLabels :: Prelude.Maybe Prelude.Natural,
+    -- | To include alternative transcriptions within your transcription output,
+    -- include @ShowAlternatives@ in your transcription request.
+    --
+    -- If you include @ShowAlternatives@, you must also include
+    -- @MaxAlternatives@, which is the maximum number of alternative
+    -- transcriptions you want Amazon Transcribe Medical to generate.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+    showAlternatives :: Prelude.Maybe Prelude.Bool,
+    -- | Enables speaker partitioning (diarization) in your transcription output.
+    -- Speaker partitioning labels the speech from individual speakers in your
+    -- media file.
+    --
+    -- If you enable @ShowSpeakerLabels@ in your request, you must also include
+    -- @MaxSpeakerLabels@.
+    --
+    -- You can\'t include @ShowSpeakerLabels@ and @ChannelIdentification@ in
+    -- the same request. Including both parameters returns a
+    -- @BadRequestException@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+    showSpeakerLabels :: Prelude.Maybe Prelude.Bool,
+    -- | The name of the custom vocabulary you want to use when processing your
+    -- medical transcription job. Custom vocabulary names are case sensitive.
+    --
+    -- The language of the specified custom vocabulary must match the language
+    -- code that you specify in your transcription request. If the languages
+    -- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+    -- or warnings associated with a language mismatch. US English (@en-US@) is
+    -- the only valid language for Amazon Transcribe Medical.
+    vocabularyName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MedicalTranscriptionSetting' 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:
+--
+-- 'channelIdentification', 'medicalTranscriptionSetting_channelIdentification' - Enables channel identification in multi-channel audio.
+--
+-- Channel identification transcribes the audio on each channel
+-- independently, then appends the output for each channel into one
+-- transcript.
+--
+-- If you have multi-channel audio and do not enable channel
+-- identification, your audio is transcribed in a continuous manner and
+-- your transcript does not separate the speech by channel.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+--
+-- 'maxAlternatives', 'medicalTranscriptionSetting_maxAlternatives' - Indicate the maximum number of alternative transcriptions you want
+-- Amazon Transcribe Medical to include in your transcript.
+--
+-- If you select a number greater than the number of alternative
+-- transcriptions generated by Amazon Transcribe Medical, only the actual
+-- number of alternative transcriptions are included.
+--
+-- If you include @MaxAlternatives@ in your request, you must also include
+-- @ShowAlternatives@ with a value of @true@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+--
+-- 'maxSpeakerLabels', 'medicalTranscriptionSetting_maxSpeakerLabels' - Specify the maximum number of speakers you want to partition in your
+-- media.
+--
+-- Note that if your media contains more speakers than the specified
+-- number, multiple speakers are treated as a single speaker.
+--
+-- If you specify the @MaxSpeakerLabels@ field, you must set the
+-- @ShowSpeakerLabels@ field to true.
+--
+-- 'showAlternatives', 'medicalTranscriptionSetting_showAlternatives' - To include alternative transcriptions within your transcription output,
+-- include @ShowAlternatives@ in your transcription request.
+--
+-- If you include @ShowAlternatives@, you must also include
+-- @MaxAlternatives@, which is the maximum number of alternative
+-- transcriptions you want Amazon Transcribe Medical to generate.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+--
+-- 'showSpeakerLabels', 'medicalTranscriptionSetting_showSpeakerLabels' - Enables speaker partitioning (diarization) in your transcription output.
+-- Speaker partitioning labels the speech from individual speakers in your
+-- media file.
+--
+-- If you enable @ShowSpeakerLabels@ in your request, you must also include
+-- @MaxSpeakerLabels@.
+--
+-- You can\'t include @ShowSpeakerLabels@ and @ChannelIdentification@ in
+-- the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+--
+-- 'vocabularyName', 'medicalTranscriptionSetting_vocabularyName' - The name of the custom vocabulary you want to use when processing your
+-- medical transcription job. Custom vocabulary names are case sensitive.
+--
+-- The language of the specified custom vocabulary must match the language
+-- code that you specify in your transcription request. If the languages
+-- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+-- or warnings associated with a language mismatch. US English (@en-US@) is
+-- the only valid language for Amazon Transcribe Medical.
+newMedicalTranscriptionSetting ::
+  MedicalTranscriptionSetting
+newMedicalTranscriptionSetting =
+  MedicalTranscriptionSetting'
+    { channelIdentification =
+        Prelude.Nothing,
+      maxAlternatives = Prelude.Nothing,
+      maxSpeakerLabels = Prelude.Nothing,
+      showAlternatives = Prelude.Nothing,
+      showSpeakerLabels = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing
+    }
+
+-- | Enables channel identification in multi-channel audio.
+--
+-- Channel identification transcribes the audio on each channel
+-- independently, then appends the output for each channel into one
+-- transcript.
+--
+-- If you have multi-channel audio and do not enable channel
+-- identification, your audio is transcribed in a continuous manner and
+-- your transcript does not separate the speech by channel.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+medicalTranscriptionSetting_channelIdentification :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Bool)
+medicalTranscriptionSetting_channelIdentification = Lens.lens (\MedicalTranscriptionSetting' {channelIdentification} -> channelIdentification) (\s@MedicalTranscriptionSetting' {} a -> s {channelIdentification = a} :: MedicalTranscriptionSetting)
+
+-- | Indicate the maximum number of alternative transcriptions you want
+-- Amazon Transcribe Medical to include in your transcript.
+--
+-- If you select a number greater than the number of alternative
+-- transcriptions generated by Amazon Transcribe Medical, only the actual
+-- number of alternative transcriptions are included.
+--
+-- If you include @MaxAlternatives@ in your request, you must also include
+-- @ShowAlternatives@ with a value of @true@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+medicalTranscriptionSetting_maxAlternatives :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Natural)
+medicalTranscriptionSetting_maxAlternatives = Lens.lens (\MedicalTranscriptionSetting' {maxAlternatives} -> maxAlternatives) (\s@MedicalTranscriptionSetting' {} a -> s {maxAlternatives = a} :: MedicalTranscriptionSetting)
+
+-- | Specify the maximum number of speakers you want to partition in your
+-- media.
+--
+-- Note that if your media contains more speakers than the specified
+-- number, multiple speakers are treated as a single speaker.
+--
+-- If you specify the @MaxSpeakerLabels@ field, you must set the
+-- @ShowSpeakerLabels@ field to true.
+medicalTranscriptionSetting_maxSpeakerLabels :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Natural)
+medicalTranscriptionSetting_maxSpeakerLabels = Lens.lens (\MedicalTranscriptionSetting' {maxSpeakerLabels} -> maxSpeakerLabels) (\s@MedicalTranscriptionSetting' {} a -> s {maxSpeakerLabels = a} :: MedicalTranscriptionSetting)
+
+-- | To include alternative transcriptions within your transcription output,
+-- include @ShowAlternatives@ in your transcription request.
+--
+-- If you include @ShowAlternatives@, you must also include
+-- @MaxAlternatives@, which is the maximum number of alternative
+-- transcriptions you want Amazon Transcribe Medical to generate.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+medicalTranscriptionSetting_showAlternatives :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Bool)
+medicalTranscriptionSetting_showAlternatives = Lens.lens (\MedicalTranscriptionSetting' {showAlternatives} -> showAlternatives) (\s@MedicalTranscriptionSetting' {} a -> s {showAlternatives = a} :: MedicalTranscriptionSetting)
+
+-- | Enables speaker partitioning (diarization) in your transcription output.
+-- Speaker partitioning labels the speech from individual speakers in your
+-- media file.
+--
+-- If you enable @ShowSpeakerLabels@ in your request, you must also include
+-- @MaxSpeakerLabels@.
+--
+-- You can\'t include @ShowSpeakerLabels@ and @ChannelIdentification@ in
+-- the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+medicalTranscriptionSetting_showSpeakerLabels :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Bool)
+medicalTranscriptionSetting_showSpeakerLabels = Lens.lens (\MedicalTranscriptionSetting' {showSpeakerLabels} -> showSpeakerLabels) (\s@MedicalTranscriptionSetting' {} a -> s {showSpeakerLabels = a} :: MedicalTranscriptionSetting)
+
+-- | The name of the custom vocabulary you want to use when processing your
+-- medical transcription job. Custom vocabulary names are case sensitive.
+--
+-- The language of the specified custom vocabulary must match the language
+-- code that you specify in your transcription request. If the languages
+-- don\'t match, the custom vocabulary isn\'t applied. There are no errors
+-- or warnings associated with a language mismatch. US English (@en-US@) is
+-- the only valid language for Amazon Transcribe Medical.
+medicalTranscriptionSetting_vocabularyName :: Lens.Lens' MedicalTranscriptionSetting (Prelude.Maybe Prelude.Text)
+medicalTranscriptionSetting_vocabularyName = Lens.lens (\MedicalTranscriptionSetting' {vocabularyName} -> vocabularyName) (\s@MedicalTranscriptionSetting' {} a -> s {vocabularyName = a} :: MedicalTranscriptionSetting)
+
+instance Data.FromJSON MedicalTranscriptionSetting where
+  parseJSON =
+    Data.withObject
+      "MedicalTranscriptionSetting"
+      ( \x ->
+          MedicalTranscriptionSetting'
+            Prelude.<$> (x Data..:? "ChannelIdentification")
+            Prelude.<*> (x Data..:? "MaxAlternatives")
+            Prelude.<*> (x Data..:? "MaxSpeakerLabels")
+            Prelude.<*> (x Data..:? "ShowAlternatives")
+            Prelude.<*> (x Data..:? "ShowSpeakerLabels")
+            Prelude.<*> (x Data..:? "VocabularyName")
+      )
+
+instance Prelude.Hashable MedicalTranscriptionSetting where
+  hashWithSalt _salt MedicalTranscriptionSetting' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelIdentification
+      `Prelude.hashWithSalt` maxAlternatives
+      `Prelude.hashWithSalt` maxSpeakerLabels
+      `Prelude.hashWithSalt` showAlternatives
+      `Prelude.hashWithSalt` showSpeakerLabels
+      `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData MedicalTranscriptionSetting where
+  rnf MedicalTranscriptionSetting' {..} =
+    Prelude.rnf channelIdentification
+      `Prelude.seq` Prelude.rnf maxAlternatives
+      `Prelude.seq` Prelude.rnf maxSpeakerLabels
+      `Prelude.seq` Prelude.rnf showAlternatives
+      `Prelude.seq` Prelude.rnf showSpeakerLabels
+      `Prelude.seq` Prelude.rnf vocabularyName
+
+instance Data.ToJSON MedicalTranscriptionSetting where
+  toJSON MedicalTranscriptionSetting' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ChannelIdentification" Data..=)
+              Prelude.<$> channelIdentification,
+            ("MaxAlternatives" Data..=)
+              Prelude.<$> maxAlternatives,
+            ("MaxSpeakerLabels" Data..=)
+              Prelude.<$> maxSpeakerLabels,
+            ("ShowAlternatives" Data..=)
+              Prelude.<$> showAlternatives,
+            ("ShowSpeakerLabels" Data..=)
+              Prelude.<$> showSpeakerLabels,
+            ("VocabularyName" Data..=)
+              Prelude.<$> vocabularyName
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/ModelSettings.hs b/gen/Amazonka/Transcribe/Types/ModelSettings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/ModelSettings.hs
@@ -0,0 +1,105 @@
+{-# 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.Transcribe.Types.ModelSettings
+-- 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.Transcribe.Types.ModelSettings 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
+
+-- | Provides the name of the custom language model that was included in the
+-- specified transcription job.
+--
+-- Only use @ModelSettings@ with the @LanguageModelName@ sub-parameter if
+-- you\'re __not__ using automatic language identification (). If using
+-- @LanguageIdSettings@ in your request, this parameter contains a
+-- @LanguageModelName@ sub-parameter.
+--
+-- /See:/ 'newModelSettings' smart constructor.
+data ModelSettings = ModelSettings'
+  { -- | The name of the custom language model you want to use when processing
+    -- your transcription job. Note that custom language model names are case
+    -- sensitive.
+    --
+    -- The language of the specified custom language model must match the
+    -- language code that you specify in your transcription request. If the
+    -- languages don\'t match, the custom language model isn\'t applied. There
+    -- are no errors or warnings associated with a language mismatch.
+    languageModelName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelSettings' 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:
+--
+-- 'languageModelName', 'modelSettings_languageModelName' - The name of the custom language model you want to use when processing
+-- your transcription job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+newModelSettings ::
+  ModelSettings
+newModelSettings =
+  ModelSettings' {languageModelName = Prelude.Nothing}
+
+-- | The name of the custom language model you want to use when processing
+-- your transcription job. Note that custom language model names are case
+-- sensitive.
+--
+-- The language of the specified custom language model must match the
+-- language code that you specify in your transcription request. If the
+-- languages don\'t match, the custom language model isn\'t applied. There
+-- are no errors or warnings associated with a language mismatch.
+modelSettings_languageModelName :: Lens.Lens' ModelSettings (Prelude.Maybe Prelude.Text)
+modelSettings_languageModelName = Lens.lens (\ModelSettings' {languageModelName} -> languageModelName) (\s@ModelSettings' {} a -> s {languageModelName = a} :: ModelSettings)
+
+instance Data.FromJSON ModelSettings where
+  parseJSON =
+    Data.withObject
+      "ModelSettings"
+      ( \x ->
+          ModelSettings'
+            Prelude.<$> (x Data..:? "LanguageModelName")
+      )
+
+instance Prelude.Hashable ModelSettings where
+  hashWithSalt _salt ModelSettings' {..} =
+    _salt `Prelude.hashWithSalt` languageModelName
+
+instance Prelude.NFData ModelSettings where
+  rnf ModelSettings' {..} =
+    Prelude.rnf languageModelName
+
+instance Data.ToJSON ModelSettings where
+  toJSON ModelSettings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("LanguageModelName" Data..=)
+              Prelude.<$> languageModelName
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/ModelStatus.hs b/gen/Amazonka/Transcribe/Types/ModelStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/ModelStatus.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.Transcribe.Types.ModelStatus
+-- 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.Transcribe.Types.ModelStatus
+  ( ModelStatus
+      ( ..,
+        ModelStatus_COMPLETED,
+        ModelStatus_FAILED,
+        ModelStatus_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ModelStatus = ModelStatus'
+  { fromModelStatus ::
+      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 ModelStatus_COMPLETED :: ModelStatus
+pattern ModelStatus_COMPLETED = ModelStatus' "COMPLETED"
+
+pattern ModelStatus_FAILED :: ModelStatus
+pattern ModelStatus_FAILED = ModelStatus' "FAILED"
+
+pattern ModelStatus_IN_PROGRESS :: ModelStatus
+pattern ModelStatus_IN_PROGRESS = ModelStatus' "IN_PROGRESS"
+
+{-# COMPLETE
+  ModelStatus_COMPLETED,
+  ModelStatus_FAILED,
+  ModelStatus_IN_PROGRESS,
+  ModelStatus'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/NonTalkTimeFilter.hs b/gen/Amazonka/Transcribe/Types/NonTalkTimeFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/NonTalkTimeFilter.hs
@@ -0,0 +1,156 @@
+{-# 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.Transcribe.Types.NonTalkTimeFilter
+-- 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.Transcribe.Types.NonTalkTimeFilter 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.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.RelativeTimeRange
+
+-- | Flag the presence or absence of periods of silence in your Call
+-- Analytics transcription output.
+--
+-- Rules using @NonTalkTimeFilter@ are designed to match:
+--
+-- -   The presence of silence at specified periods throughout the call
+--
+-- -   The presence of speech at specified periods throughout the call
+--
+-- See
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html#tca-rules-batch Rule criteria for batch categories>
+-- for usage examples.
+--
+-- /See:/ 'newNonTalkTimeFilter' smart constructor.
+data NonTalkTimeFilter = NonTalkTimeFilter'
+  { -- | Makes it possible to specify a time range (in milliseconds) in your
+    -- audio, during which you want to search for a period of silence. See for
+    -- more detail.
+    absoluteTimeRange :: Prelude.Maybe AbsoluteTimeRange,
+    -- | Set to @TRUE@ to flag periods of speech. Set to @FALSE@ to flag periods
+    -- of silence
+    negate :: Prelude.Maybe Prelude.Bool,
+    -- | Makes it possible to specify a time range (in percentage) in your media
+    -- file, during which you want to search for a period of silence. See for
+    -- more detail.
+    relativeTimeRange :: Prelude.Maybe RelativeTimeRange,
+    -- | Specify the duration, in milliseconds, of the period of silence that you
+    -- want to flag. For example, you can flag a silent period that lasts
+    -- 30,000 milliseconds.
+    threshold :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'NonTalkTimeFilter' 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:
+--
+-- 'absoluteTimeRange', 'nonTalkTimeFilter_absoluteTimeRange' - Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for a period of silence. See for
+-- more detail.
+--
+-- 'negate', 'nonTalkTimeFilter_negate' - Set to @TRUE@ to flag periods of speech. Set to @FALSE@ to flag periods
+-- of silence
+--
+-- 'relativeTimeRange', 'nonTalkTimeFilter_relativeTimeRange' - Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for a period of silence. See for
+-- more detail.
+--
+-- 'threshold', 'nonTalkTimeFilter_threshold' - Specify the duration, in milliseconds, of the period of silence that you
+-- want to flag. For example, you can flag a silent period that lasts
+-- 30,000 milliseconds.
+newNonTalkTimeFilter ::
+  NonTalkTimeFilter
+newNonTalkTimeFilter =
+  NonTalkTimeFilter'
+    { absoluteTimeRange =
+        Prelude.Nothing,
+      negate = Prelude.Nothing,
+      relativeTimeRange = Prelude.Nothing,
+      threshold = Prelude.Nothing
+    }
+
+-- | Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for a period of silence. See for
+-- more detail.
+nonTalkTimeFilter_absoluteTimeRange :: Lens.Lens' NonTalkTimeFilter (Prelude.Maybe AbsoluteTimeRange)
+nonTalkTimeFilter_absoluteTimeRange = Lens.lens (\NonTalkTimeFilter' {absoluteTimeRange} -> absoluteTimeRange) (\s@NonTalkTimeFilter' {} a -> s {absoluteTimeRange = a} :: NonTalkTimeFilter)
+
+-- | Set to @TRUE@ to flag periods of speech. Set to @FALSE@ to flag periods
+-- of silence
+nonTalkTimeFilter_negate :: Lens.Lens' NonTalkTimeFilter (Prelude.Maybe Prelude.Bool)
+nonTalkTimeFilter_negate = Lens.lens (\NonTalkTimeFilter' {negate} -> negate) (\s@NonTalkTimeFilter' {} a -> s {negate = a} :: NonTalkTimeFilter)
+
+-- | Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for a period of silence. See for
+-- more detail.
+nonTalkTimeFilter_relativeTimeRange :: Lens.Lens' NonTalkTimeFilter (Prelude.Maybe RelativeTimeRange)
+nonTalkTimeFilter_relativeTimeRange = Lens.lens (\NonTalkTimeFilter' {relativeTimeRange} -> relativeTimeRange) (\s@NonTalkTimeFilter' {} a -> s {relativeTimeRange = a} :: NonTalkTimeFilter)
+
+-- | Specify the duration, in milliseconds, of the period of silence that you
+-- want to flag. For example, you can flag a silent period that lasts
+-- 30,000 milliseconds.
+nonTalkTimeFilter_threshold :: Lens.Lens' NonTalkTimeFilter (Prelude.Maybe Prelude.Natural)
+nonTalkTimeFilter_threshold = Lens.lens (\NonTalkTimeFilter' {threshold} -> threshold) (\s@NonTalkTimeFilter' {} a -> s {threshold = a} :: NonTalkTimeFilter)
+
+instance Data.FromJSON NonTalkTimeFilter where
+  parseJSON =
+    Data.withObject
+      "NonTalkTimeFilter"
+      ( \x ->
+          NonTalkTimeFilter'
+            Prelude.<$> (x Data..:? "AbsoluteTimeRange")
+            Prelude.<*> (x Data..:? "Negate")
+            Prelude.<*> (x Data..:? "RelativeTimeRange")
+            Prelude.<*> (x Data..:? "Threshold")
+      )
+
+instance Prelude.Hashable NonTalkTimeFilter where
+  hashWithSalt _salt NonTalkTimeFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` absoluteTimeRange
+      `Prelude.hashWithSalt` negate
+      `Prelude.hashWithSalt` relativeTimeRange
+      `Prelude.hashWithSalt` threshold
+
+instance Prelude.NFData NonTalkTimeFilter where
+  rnf NonTalkTimeFilter' {..} =
+    Prelude.rnf absoluteTimeRange
+      `Prelude.seq` Prelude.rnf negate
+      `Prelude.seq` Prelude.rnf relativeTimeRange
+      `Prelude.seq` Prelude.rnf threshold
+
+instance Data.ToJSON NonTalkTimeFilter where
+  toJSON NonTalkTimeFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AbsoluteTimeRange" Data..=)
+              Prelude.<$> absoluteTimeRange,
+            ("Negate" Data..=) Prelude.<$> negate,
+            ("RelativeTimeRange" Data..=)
+              Prelude.<$> relativeTimeRange,
+            ("Threshold" Data..=) Prelude.<$> threshold
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/OutputLocationType.hs b/gen/Amazonka/Transcribe/Types/OutputLocationType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/OutputLocationType.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.Transcribe.Types.OutputLocationType
+-- 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.Transcribe.Types.OutputLocationType
+  ( OutputLocationType
+      ( ..,
+        OutputLocationType_CUSTOMER_BUCKET,
+        OutputLocationType_SERVICE_BUCKET
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype OutputLocationType = OutputLocationType'
+  { fromOutputLocationType ::
+      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 OutputLocationType_CUSTOMER_BUCKET :: OutputLocationType
+pattern OutputLocationType_CUSTOMER_BUCKET = OutputLocationType' "CUSTOMER_BUCKET"
+
+pattern OutputLocationType_SERVICE_BUCKET :: OutputLocationType
+pattern OutputLocationType_SERVICE_BUCKET = OutputLocationType' "SERVICE_BUCKET"
+
+{-# COMPLETE
+  OutputLocationType_CUSTOMER_BUCKET,
+  OutputLocationType_SERVICE_BUCKET,
+  OutputLocationType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/ParticipantRole.hs b/gen/Amazonka/Transcribe/Types/ParticipantRole.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/ParticipantRole.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.Transcribe.Types.ParticipantRole
+-- 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.Transcribe.Types.ParticipantRole
+  ( ParticipantRole
+      ( ..,
+        ParticipantRole_AGENT,
+        ParticipantRole_CUSTOMER
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ParticipantRole = ParticipantRole'
+  { fromParticipantRole ::
+      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 ParticipantRole_AGENT :: ParticipantRole
+pattern ParticipantRole_AGENT = ParticipantRole' "AGENT"
+
+pattern ParticipantRole_CUSTOMER :: ParticipantRole
+pattern ParticipantRole_CUSTOMER = ParticipantRole' "CUSTOMER"
+
+{-# COMPLETE
+  ParticipantRole_AGENT,
+  ParticipantRole_CUSTOMER,
+  ParticipantRole'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/PiiEntityType.hs b/gen/Amazonka/Transcribe/Types/PiiEntityType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/PiiEntityType.hs
@@ -0,0 +1,121 @@
+{-# 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.Transcribe.Types.PiiEntityType
+-- 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.Transcribe.Types.PiiEntityType
+  ( PiiEntityType
+      ( ..,
+        PiiEntityType_ADDRESS,
+        PiiEntityType_ALL,
+        PiiEntityType_BANK_ACCOUNT_NUMBER,
+        PiiEntityType_BANK_ROUTING,
+        PiiEntityType_CREDIT_DEBIT_CVV,
+        PiiEntityType_CREDIT_DEBIT_EXPIRY,
+        PiiEntityType_CREDIT_DEBIT_NUMBER,
+        PiiEntityType_EMAIL,
+        PiiEntityType_NAME,
+        PiiEntityType_PHONE,
+        PiiEntityType_PIN,
+        PiiEntityType_SSN
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype PiiEntityType = PiiEntityType'
+  { fromPiiEntityType ::
+      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 PiiEntityType_ADDRESS :: PiiEntityType
+pattern PiiEntityType_ADDRESS = PiiEntityType' "ADDRESS"
+
+pattern PiiEntityType_ALL :: PiiEntityType
+pattern PiiEntityType_ALL = PiiEntityType' "ALL"
+
+pattern PiiEntityType_BANK_ACCOUNT_NUMBER :: PiiEntityType
+pattern PiiEntityType_BANK_ACCOUNT_NUMBER = PiiEntityType' "BANK_ACCOUNT_NUMBER"
+
+pattern PiiEntityType_BANK_ROUTING :: PiiEntityType
+pattern PiiEntityType_BANK_ROUTING = PiiEntityType' "BANK_ROUTING"
+
+pattern PiiEntityType_CREDIT_DEBIT_CVV :: PiiEntityType
+pattern PiiEntityType_CREDIT_DEBIT_CVV = PiiEntityType' "CREDIT_DEBIT_CVV"
+
+pattern PiiEntityType_CREDIT_DEBIT_EXPIRY :: PiiEntityType
+pattern PiiEntityType_CREDIT_DEBIT_EXPIRY = PiiEntityType' "CREDIT_DEBIT_EXPIRY"
+
+pattern PiiEntityType_CREDIT_DEBIT_NUMBER :: PiiEntityType
+pattern PiiEntityType_CREDIT_DEBIT_NUMBER = PiiEntityType' "CREDIT_DEBIT_NUMBER"
+
+pattern PiiEntityType_EMAIL :: PiiEntityType
+pattern PiiEntityType_EMAIL = PiiEntityType' "EMAIL"
+
+pattern PiiEntityType_NAME :: PiiEntityType
+pattern PiiEntityType_NAME = PiiEntityType' "NAME"
+
+pattern PiiEntityType_PHONE :: PiiEntityType
+pattern PiiEntityType_PHONE = PiiEntityType' "PHONE"
+
+pattern PiiEntityType_PIN :: PiiEntityType
+pattern PiiEntityType_PIN = PiiEntityType' "PIN"
+
+pattern PiiEntityType_SSN :: PiiEntityType
+pattern PiiEntityType_SSN = PiiEntityType' "SSN"
+
+{-# COMPLETE
+  PiiEntityType_ADDRESS,
+  PiiEntityType_ALL,
+  PiiEntityType_BANK_ACCOUNT_NUMBER,
+  PiiEntityType_BANK_ROUTING,
+  PiiEntityType_CREDIT_DEBIT_CVV,
+  PiiEntityType_CREDIT_DEBIT_EXPIRY,
+  PiiEntityType_CREDIT_DEBIT_NUMBER,
+  PiiEntityType_EMAIL,
+  PiiEntityType_NAME,
+  PiiEntityType_PHONE,
+  PiiEntityType_PIN,
+  PiiEntityType_SSN,
+  PiiEntityType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/RedactionOutput.hs b/gen/Amazonka/Transcribe/Types/RedactionOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/RedactionOutput.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.Transcribe.Types.RedactionOutput
+-- 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.Transcribe.Types.RedactionOutput
+  ( RedactionOutput
+      ( ..,
+        RedactionOutput_Redacted,
+        RedactionOutput_Redacted_and_unredacted
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RedactionOutput = RedactionOutput'
+  { fromRedactionOutput ::
+      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 RedactionOutput_Redacted :: RedactionOutput
+pattern RedactionOutput_Redacted = RedactionOutput' "redacted"
+
+pattern RedactionOutput_Redacted_and_unredacted :: RedactionOutput
+pattern RedactionOutput_Redacted_and_unredacted = RedactionOutput' "redacted_and_unredacted"
+
+{-# COMPLETE
+  RedactionOutput_Redacted,
+  RedactionOutput_Redacted_and_unredacted,
+  RedactionOutput'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/RedactionType.hs b/gen/Amazonka/Transcribe/Types/RedactionType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/RedactionType.hs
@@ -0,0 +1,66 @@
+{-# 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.Transcribe.Types.RedactionType
+-- 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.Transcribe.Types.RedactionType
+  ( RedactionType
+      ( ..,
+        RedactionType_PII
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RedactionType = RedactionType'
+  { fromRedactionType ::
+      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 RedactionType_PII :: RedactionType
+pattern RedactionType_PII = RedactionType' "PII"
+
+{-# COMPLETE
+  RedactionType_PII,
+  RedactionType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/RelativeTimeRange.hs b/gen/Amazonka/Transcribe/Types/RelativeTimeRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/RelativeTimeRange.hs
@@ -0,0 +1,158 @@
+{-# 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.Transcribe.Types.RelativeTimeRange
+-- 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.Transcribe.Types.RelativeTimeRange 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
+
+-- | A time range, in percentage, between two points in your media file.
+--
+-- You can use @StartPercentage@ and @EndPercentage@ to search a custom
+-- segment. For example, setting @StartPercentage@ to 10 and
+-- @EndPercentage@ to 50 only searches for your specified criteria in the
+-- audio contained between the 10 percent mark and the 50 percent mark of
+-- your media file.
+--
+-- You can use also @First@ to search from the start of the media file
+-- until the time that you specify. Or use @Last@ to search from the time
+-- that you specify until the end of the media file. For example, setting
+-- @First@ to 10 only searches for your specified criteria in the audio
+-- contained in the first 10 percent of the media file.
+--
+-- If you prefer to use milliseconds instead of percentage, see .
+--
+-- /See:/ 'newRelativeTimeRange' smart constructor.
+data RelativeTimeRange = RelativeTimeRange'
+  { -- | The time, in percentage, when Amazon Transcribe stops searching for the
+    -- specified criteria in your media file. If you include @EndPercentage@ in
+    -- your request, you must also include @StartPercentage@.
+    endPercentage :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in percentage, from the start of your media file until the
+    -- specified value. Amazon Transcribe searches for your specified criteria
+    -- in this time segment.
+    first :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in percentage, from the specified value until the end of your
+    -- media file. Amazon Transcribe searches for your specified criteria in
+    -- this time segment.
+    last :: Prelude.Maybe Prelude.Natural,
+    -- | The time, in percentage, when Amazon Transcribe starts searching for the
+    -- specified criteria in your media file. If you include @StartPercentage@
+    -- in your request, you must also include @EndPercentage@.
+    startPercentage :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RelativeTimeRange' 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:
+--
+-- 'endPercentage', 'relativeTimeRange_endPercentage' - The time, in percentage, when Amazon Transcribe stops searching for the
+-- specified criteria in your media file. If you include @EndPercentage@ in
+-- your request, you must also include @StartPercentage@.
+--
+-- 'first', 'relativeTimeRange_first' - The time, in percentage, from the start of your media file until the
+-- specified value. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+--
+-- 'last', 'relativeTimeRange_last' - The time, in percentage, from the specified value until the end of your
+-- media file. Amazon Transcribe searches for your specified criteria in
+-- this time segment.
+--
+-- 'startPercentage', 'relativeTimeRange_startPercentage' - The time, in percentage, when Amazon Transcribe starts searching for the
+-- specified criteria in your media file. If you include @StartPercentage@
+-- in your request, you must also include @EndPercentage@.
+newRelativeTimeRange ::
+  RelativeTimeRange
+newRelativeTimeRange =
+  RelativeTimeRange'
+    { endPercentage = Prelude.Nothing,
+      first = Prelude.Nothing,
+      last = Prelude.Nothing,
+      startPercentage = Prelude.Nothing
+    }
+
+-- | The time, in percentage, when Amazon Transcribe stops searching for the
+-- specified criteria in your media file. If you include @EndPercentage@ in
+-- your request, you must also include @StartPercentage@.
+relativeTimeRange_endPercentage :: Lens.Lens' RelativeTimeRange (Prelude.Maybe Prelude.Natural)
+relativeTimeRange_endPercentage = Lens.lens (\RelativeTimeRange' {endPercentage} -> endPercentage) (\s@RelativeTimeRange' {} a -> s {endPercentage = a} :: RelativeTimeRange)
+
+-- | The time, in percentage, from the start of your media file until the
+-- specified value. Amazon Transcribe searches for your specified criteria
+-- in this time segment.
+relativeTimeRange_first :: Lens.Lens' RelativeTimeRange (Prelude.Maybe Prelude.Natural)
+relativeTimeRange_first = Lens.lens (\RelativeTimeRange' {first} -> first) (\s@RelativeTimeRange' {} a -> s {first = a} :: RelativeTimeRange)
+
+-- | The time, in percentage, from the specified value until the end of your
+-- media file. Amazon Transcribe searches for your specified criteria in
+-- this time segment.
+relativeTimeRange_last :: Lens.Lens' RelativeTimeRange (Prelude.Maybe Prelude.Natural)
+relativeTimeRange_last = Lens.lens (\RelativeTimeRange' {last} -> last) (\s@RelativeTimeRange' {} a -> s {last = a} :: RelativeTimeRange)
+
+-- | The time, in percentage, when Amazon Transcribe starts searching for the
+-- specified criteria in your media file. If you include @StartPercentage@
+-- in your request, you must also include @EndPercentage@.
+relativeTimeRange_startPercentage :: Lens.Lens' RelativeTimeRange (Prelude.Maybe Prelude.Natural)
+relativeTimeRange_startPercentage = Lens.lens (\RelativeTimeRange' {startPercentage} -> startPercentage) (\s@RelativeTimeRange' {} a -> s {startPercentage = a} :: RelativeTimeRange)
+
+instance Data.FromJSON RelativeTimeRange where
+  parseJSON =
+    Data.withObject
+      "RelativeTimeRange"
+      ( \x ->
+          RelativeTimeRange'
+            Prelude.<$> (x Data..:? "EndPercentage")
+            Prelude.<*> (x Data..:? "First")
+            Prelude.<*> (x Data..:? "Last")
+            Prelude.<*> (x Data..:? "StartPercentage")
+      )
+
+instance Prelude.Hashable RelativeTimeRange where
+  hashWithSalt _salt RelativeTimeRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` endPercentage
+      `Prelude.hashWithSalt` first
+      `Prelude.hashWithSalt` last
+      `Prelude.hashWithSalt` startPercentage
+
+instance Prelude.NFData RelativeTimeRange where
+  rnf RelativeTimeRange' {..} =
+    Prelude.rnf endPercentage
+      `Prelude.seq` Prelude.rnf first
+      `Prelude.seq` Prelude.rnf last
+      `Prelude.seq` Prelude.rnf startPercentage
+
+instance Data.ToJSON RelativeTimeRange where
+  toJSON RelativeTimeRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("EndPercentage" Data..=) Prelude.<$> endPercentage,
+            ("First" Data..=) Prelude.<$> first,
+            ("Last" Data..=) Prelude.<$> last,
+            ("StartPercentage" Data..=)
+              Prelude.<$> startPercentage
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/Rule.hs b/gen/Amazonka/Transcribe/Types/Rule.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Rule.hs
@@ -0,0 +1,150 @@
+{-# 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.Transcribe.Types.Rule
+-- 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.Transcribe.Types.Rule 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.Transcribe.Types.InterruptionFilter
+import Amazonka.Transcribe.Types.NonTalkTimeFilter
+import Amazonka.Transcribe.Types.SentimentFilter
+import Amazonka.Transcribe.Types.TranscriptFilter
+
+-- | A rule is a set of criteria that you can specify to flag an attribute in
+-- your Call Analytics output. Rules define a Call Analytics category.
+--
+-- Rules can include these parameters: , , , and .
+--
+-- To learn more about Call Analytics rules and categories, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html Creating categories for batch transcriptions>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-stream.html Creating categories for streaming transcriptions>.
+--
+-- To learn more about Call Analytics, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/call-analytics.html Analyzing call center audio with Call Analytics>.
+--
+-- /See:/ 'newRule' smart constructor.
+data Rule = Rule'
+  { -- | Flag the presence or absence of interruptions in your Call Analytics
+    -- transcription output. Refer to for more detail.
+    interruptionFilter :: Prelude.Maybe InterruptionFilter,
+    -- | Flag the presence or absence of periods of silence in your Call
+    -- Analytics transcription output. Refer to for more detail.
+    nonTalkTimeFilter :: Prelude.Maybe NonTalkTimeFilter,
+    -- | Flag the presence or absence of specific sentiments in your Call
+    -- Analytics transcription output. Refer to for more detail.
+    sentimentFilter :: Prelude.Maybe SentimentFilter,
+    -- | Flag the presence or absence of specific words or phrases in your Call
+    -- Analytics transcription output. Refer to for more detail.
+    transcriptFilter :: Prelude.Maybe TranscriptFilter
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Rule' 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:
+--
+-- 'interruptionFilter', 'rule_interruptionFilter' - Flag the presence or absence of interruptions in your Call Analytics
+-- transcription output. Refer to for more detail.
+--
+-- 'nonTalkTimeFilter', 'rule_nonTalkTimeFilter' - Flag the presence or absence of periods of silence in your Call
+-- Analytics transcription output. Refer to for more detail.
+--
+-- 'sentimentFilter', 'rule_sentimentFilter' - Flag the presence or absence of specific sentiments in your Call
+-- Analytics transcription output. Refer to for more detail.
+--
+-- 'transcriptFilter', 'rule_transcriptFilter' - Flag the presence or absence of specific words or phrases in your Call
+-- Analytics transcription output. Refer to for more detail.
+newRule ::
+  Rule
+newRule =
+  Rule'
+    { interruptionFilter = Prelude.Nothing,
+      nonTalkTimeFilter = Prelude.Nothing,
+      sentimentFilter = Prelude.Nothing,
+      transcriptFilter = Prelude.Nothing
+    }
+
+-- | Flag the presence or absence of interruptions in your Call Analytics
+-- transcription output. Refer to for more detail.
+rule_interruptionFilter :: Lens.Lens' Rule (Prelude.Maybe InterruptionFilter)
+rule_interruptionFilter = Lens.lens (\Rule' {interruptionFilter} -> interruptionFilter) (\s@Rule' {} a -> s {interruptionFilter = a} :: Rule)
+
+-- | Flag the presence or absence of periods of silence in your Call
+-- Analytics transcription output. Refer to for more detail.
+rule_nonTalkTimeFilter :: Lens.Lens' Rule (Prelude.Maybe NonTalkTimeFilter)
+rule_nonTalkTimeFilter = Lens.lens (\Rule' {nonTalkTimeFilter} -> nonTalkTimeFilter) (\s@Rule' {} a -> s {nonTalkTimeFilter = a} :: Rule)
+
+-- | Flag the presence or absence of specific sentiments in your Call
+-- Analytics transcription output. Refer to for more detail.
+rule_sentimentFilter :: Lens.Lens' Rule (Prelude.Maybe SentimentFilter)
+rule_sentimentFilter = Lens.lens (\Rule' {sentimentFilter} -> sentimentFilter) (\s@Rule' {} a -> s {sentimentFilter = a} :: Rule)
+
+-- | Flag the presence or absence of specific words or phrases in your Call
+-- Analytics transcription output. Refer to for more detail.
+rule_transcriptFilter :: Lens.Lens' Rule (Prelude.Maybe TranscriptFilter)
+rule_transcriptFilter = Lens.lens (\Rule' {transcriptFilter} -> transcriptFilter) (\s@Rule' {} a -> s {transcriptFilter = a} :: Rule)
+
+instance Data.FromJSON Rule where
+  parseJSON =
+    Data.withObject
+      "Rule"
+      ( \x ->
+          Rule'
+            Prelude.<$> (x Data..:? "InterruptionFilter")
+            Prelude.<*> (x Data..:? "NonTalkTimeFilter")
+            Prelude.<*> (x Data..:? "SentimentFilter")
+            Prelude.<*> (x Data..:? "TranscriptFilter")
+      )
+
+instance Prelude.Hashable Rule where
+  hashWithSalt _salt Rule' {..} =
+    _salt
+      `Prelude.hashWithSalt` interruptionFilter
+      `Prelude.hashWithSalt` nonTalkTimeFilter
+      `Prelude.hashWithSalt` sentimentFilter
+      `Prelude.hashWithSalt` transcriptFilter
+
+instance Prelude.NFData Rule where
+  rnf Rule' {..} =
+    Prelude.rnf interruptionFilter
+      `Prelude.seq` Prelude.rnf nonTalkTimeFilter
+      `Prelude.seq` Prelude.rnf sentimentFilter
+      `Prelude.seq` Prelude.rnf transcriptFilter
+
+instance Data.ToJSON Rule where
+  toJSON Rule' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("InterruptionFilter" Data..=)
+              Prelude.<$> interruptionFilter,
+            ("NonTalkTimeFilter" Data..=)
+              Prelude.<$> nonTalkTimeFilter,
+            ("SentimentFilter" Data..=)
+              Prelude.<$> sentimentFilter,
+            ("TranscriptFilter" Data..=)
+              Prelude.<$> transcriptFilter
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/SentimentFilter.hs b/gen/Amazonka/Transcribe/Types/SentimentFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/SentimentFilter.hs
@@ -0,0 +1,182 @@
+{-# 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.Transcribe.Types.SentimentFilter
+-- 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.Transcribe.Types.SentimentFilter 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.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.ParticipantRole
+import Amazonka.Transcribe.Types.RelativeTimeRange
+import Amazonka.Transcribe.Types.SentimentValue
+
+-- | Flag the presence or absence of specific sentiments detected in your
+-- Call Analytics transcription output.
+--
+-- Rules using @SentimentFilter@ are designed to match:
+--
+-- -   The presence or absence of a positive sentiment felt by the
+--     customer, agent, or both at specified points in the call
+--
+-- -   The presence or absence of a negative sentiment felt by the
+--     customer, agent, or both at specified points in the call
+--
+-- -   The presence or absence of a neutral sentiment felt by the customer,
+--     agent, or both at specified points in the call
+--
+-- -   The presence or absence of a mixed sentiment felt by the customer,
+--     the agent, or both at specified points in the call
+--
+-- See
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html#tca-rules-batch Rule criteria for batch categories>
+-- for usage examples.
+--
+-- /See:/ 'newSentimentFilter' smart constructor.
+data SentimentFilter = SentimentFilter'
+  { -- | Makes it possible to specify a time range (in milliseconds) in your
+    -- audio, during which you want to search for the specified sentiments. See
+    -- for more detail.
+    absoluteTimeRange :: Prelude.Maybe AbsoluteTimeRange,
+    -- | Set to @TRUE@ to flag the sentiments that you didn\'t include in your
+    -- request. Set to @FALSE@ to flag the sentiments that you specified in
+    -- your request.
+    negate :: Prelude.Maybe Prelude.Bool,
+    -- | Specify the participant that you want to flag. Omitting this parameter
+    -- is equivalent to specifying both participants.
+    participantRole :: Prelude.Maybe ParticipantRole,
+    -- | Makes it possible to specify a time range (in percentage) in your media
+    -- file, during which you want to search for the specified sentiments. See
+    -- for more detail.
+    relativeTimeRange :: Prelude.Maybe RelativeTimeRange,
+    -- | Specify the sentiments that you want to flag.
+    sentiments :: Prelude.NonEmpty SentimentValue
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SentimentFilter' 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:
+--
+-- 'absoluteTimeRange', 'sentimentFilter_absoluteTimeRange' - Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for the specified sentiments. See
+-- for more detail.
+--
+-- 'negate', 'sentimentFilter_negate' - Set to @TRUE@ to flag the sentiments that you didn\'t include in your
+-- request. Set to @FALSE@ to flag the sentiments that you specified in
+-- your request.
+--
+-- 'participantRole', 'sentimentFilter_participantRole' - Specify the participant that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+--
+-- 'relativeTimeRange', 'sentimentFilter_relativeTimeRange' - Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for the specified sentiments. See
+-- for more detail.
+--
+-- 'sentiments', 'sentimentFilter_sentiments' - Specify the sentiments that you want to flag.
+newSentimentFilter ::
+  -- | 'sentiments'
+  Prelude.NonEmpty SentimentValue ->
+  SentimentFilter
+newSentimentFilter pSentiments_ =
+  SentimentFilter'
+    { absoluteTimeRange =
+        Prelude.Nothing,
+      negate = Prelude.Nothing,
+      participantRole = Prelude.Nothing,
+      relativeTimeRange = Prelude.Nothing,
+      sentiments = Lens.coerced Lens.# pSentiments_
+    }
+
+-- | Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for the specified sentiments. See
+-- for more detail.
+sentimentFilter_absoluteTimeRange :: Lens.Lens' SentimentFilter (Prelude.Maybe AbsoluteTimeRange)
+sentimentFilter_absoluteTimeRange = Lens.lens (\SentimentFilter' {absoluteTimeRange} -> absoluteTimeRange) (\s@SentimentFilter' {} a -> s {absoluteTimeRange = a} :: SentimentFilter)
+
+-- | Set to @TRUE@ to flag the sentiments that you didn\'t include in your
+-- request. Set to @FALSE@ to flag the sentiments that you specified in
+-- your request.
+sentimentFilter_negate :: Lens.Lens' SentimentFilter (Prelude.Maybe Prelude.Bool)
+sentimentFilter_negate = Lens.lens (\SentimentFilter' {negate} -> negate) (\s@SentimentFilter' {} a -> s {negate = a} :: SentimentFilter)
+
+-- | Specify the participant that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+sentimentFilter_participantRole :: Lens.Lens' SentimentFilter (Prelude.Maybe ParticipantRole)
+sentimentFilter_participantRole = Lens.lens (\SentimentFilter' {participantRole} -> participantRole) (\s@SentimentFilter' {} a -> s {participantRole = a} :: SentimentFilter)
+
+-- | Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for the specified sentiments. See
+-- for more detail.
+sentimentFilter_relativeTimeRange :: Lens.Lens' SentimentFilter (Prelude.Maybe RelativeTimeRange)
+sentimentFilter_relativeTimeRange = Lens.lens (\SentimentFilter' {relativeTimeRange} -> relativeTimeRange) (\s@SentimentFilter' {} a -> s {relativeTimeRange = a} :: SentimentFilter)
+
+-- | Specify the sentiments that you want to flag.
+sentimentFilter_sentiments :: Lens.Lens' SentimentFilter (Prelude.NonEmpty SentimentValue)
+sentimentFilter_sentiments = Lens.lens (\SentimentFilter' {sentiments} -> sentiments) (\s@SentimentFilter' {} a -> s {sentiments = a} :: SentimentFilter) Prelude.. Lens.coerced
+
+instance Data.FromJSON SentimentFilter where
+  parseJSON =
+    Data.withObject
+      "SentimentFilter"
+      ( \x ->
+          SentimentFilter'
+            Prelude.<$> (x Data..:? "AbsoluteTimeRange")
+            Prelude.<*> (x Data..:? "Negate")
+            Prelude.<*> (x Data..:? "ParticipantRole")
+            Prelude.<*> (x Data..:? "RelativeTimeRange")
+            Prelude.<*> (x Data..: "Sentiments")
+      )
+
+instance Prelude.Hashable SentimentFilter where
+  hashWithSalt _salt SentimentFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` absoluteTimeRange
+      `Prelude.hashWithSalt` negate
+      `Prelude.hashWithSalt` participantRole
+      `Prelude.hashWithSalt` relativeTimeRange
+      `Prelude.hashWithSalt` sentiments
+
+instance Prelude.NFData SentimentFilter where
+  rnf SentimentFilter' {..} =
+    Prelude.rnf absoluteTimeRange
+      `Prelude.seq` Prelude.rnf negate
+      `Prelude.seq` Prelude.rnf participantRole
+      `Prelude.seq` Prelude.rnf relativeTimeRange
+      `Prelude.seq` Prelude.rnf sentiments
+
+instance Data.ToJSON SentimentFilter where
+  toJSON SentimentFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AbsoluteTimeRange" Data..=)
+              Prelude.<$> absoluteTimeRange,
+            ("Negate" Data..=) Prelude.<$> negate,
+            ("ParticipantRole" Data..=)
+              Prelude.<$> participantRole,
+            ("RelativeTimeRange" Data..=)
+              Prelude.<$> relativeTimeRange,
+            Prelude.Just ("Sentiments" Data..= sentiments)
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/SentimentValue.hs b/gen/Amazonka/Transcribe/Types/SentimentValue.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/SentimentValue.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.Transcribe.Types.SentimentValue
+-- 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.Transcribe.Types.SentimentValue
+  ( SentimentValue
+      ( ..,
+        SentimentValue_MIXED,
+        SentimentValue_NEGATIVE,
+        SentimentValue_NEUTRAL,
+        SentimentValue_POSITIVE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SentimentValue = SentimentValue'
+  { fromSentimentValue ::
+      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 SentimentValue_MIXED :: SentimentValue
+pattern SentimentValue_MIXED = SentimentValue' "MIXED"
+
+pattern SentimentValue_NEGATIVE :: SentimentValue
+pattern SentimentValue_NEGATIVE = SentimentValue' "NEGATIVE"
+
+pattern SentimentValue_NEUTRAL :: SentimentValue
+pattern SentimentValue_NEUTRAL = SentimentValue' "NEUTRAL"
+
+pattern SentimentValue_POSITIVE :: SentimentValue
+pattern SentimentValue_POSITIVE = SentimentValue' "POSITIVE"
+
+{-# COMPLETE
+  SentimentValue_MIXED,
+  SentimentValue_NEGATIVE,
+  SentimentValue_NEUTRAL,
+  SentimentValue_POSITIVE,
+  SentimentValue'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/Settings.hs b/gen/Amazonka/Transcribe/Types/Settings.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Settings.hs
@@ -0,0 +1,383 @@
+{-# 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.Transcribe.Types.Settings
+-- 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.Transcribe.Types.Settings 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.Transcribe.Types.VocabularyFilterMethod
+
+-- | Allows additional optional settings in your request, including channel
+-- identification, alternative transcriptions, and speaker partitioning.
+-- You can use that to apply custom vocabularies to your transcription job.
+--
+-- /See:/ 'newSettings' smart constructor.
+data Settings = Settings'
+  { -- | Enables channel identification in multi-channel audio.
+    --
+    -- Channel identification transcribes the audio on each channel
+    -- independently, then appends the output for each channel into one
+    -- transcript.
+    --
+    -- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+    -- in the same request. Including both parameters returns a
+    -- @BadRequestException@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+    channelIdentification :: Prelude.Maybe Prelude.Bool,
+    -- | Indicate the maximum number of alternative transcriptions you want
+    -- Amazon Transcribe to include in your transcript.
+    --
+    -- If you select a number greater than the number of alternative
+    -- transcriptions generated by Amazon Transcribe, only the actual number of
+    -- alternative transcriptions are included.
+    --
+    -- If you include @MaxAlternatives@ in your request, you must also include
+    -- @ShowAlternatives@ with a value of @true@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+    maxAlternatives :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the maximum number of speakers you want to partition in your
+    -- media.
+    --
+    -- Note that if your media contains more speakers than the specified
+    -- number, multiple speakers are treated as a single speaker.
+    --
+    -- If you specify the @MaxSpeakerLabels@ field, you must set the
+    -- @ShowSpeakerLabels@ field to true.
+    maxSpeakerLabels :: Prelude.Maybe Prelude.Natural,
+    -- | To include alternative transcriptions within your transcription output,
+    -- include @ShowAlternatives@ in your transcription request.
+    --
+    -- If you have multi-channel audio and do not enable channel
+    -- identification, your audio is transcribed in a continuous manner and
+    -- your transcript does not separate the speech by channel.
+    --
+    -- If you include @ShowAlternatives@, you must also include
+    -- @MaxAlternatives@, which is the maximum number of alternative
+    -- transcriptions you want Amazon Transcribe to generate.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+    showAlternatives :: Prelude.Maybe Prelude.Bool,
+    -- | Enables speaker partitioning (diarization) in your transcription output.
+    -- Speaker partitioning labels the speech from individual speakers in your
+    -- media file.
+    --
+    -- If you enable @ShowSpeakerLabels@ in your request, you must also include
+    -- @MaxSpeakerLabels@.
+    --
+    -- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+    -- in the same request. Including both parameters returns a
+    -- @BadRequestException@.
+    --
+    -- For more information, see
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+    showSpeakerLabels :: Prelude.Maybe Prelude.Bool,
+    -- | Specify how you want your custom vocabulary filter applied to your
+    -- transcript.
+    --
+    -- To replace words with @***@, choose @mask@.
+    --
+    -- To delete words, choose @remove@.
+    --
+    -- To flag words without changing them, choose @tag@.
+    vocabularyFilterMethod :: Prelude.Maybe VocabularyFilterMethod,
+    -- | The name of the custom vocabulary filter you want to use in your
+    -- transcription job request. This name is case sensitive, cannot contain
+    -- spaces, and must be unique within an Amazon Web Services account.
+    --
+    -- Note that if you include @VocabularyFilterName@ in your request, you
+    -- must also include @VocabularyFilterMethod@.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the custom vocabulary you want to use in your transcription
+    -- job request. This name is case sensitive, cannot contain spaces, and
+    -- must be unique within an Amazon Web Services account.
+    vocabularyName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Settings' 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:
+--
+-- 'channelIdentification', 'settings_channelIdentification' - Enables channel identification in multi-channel audio.
+--
+-- Channel identification transcribes the audio on each channel
+-- independently, then appends the output for each channel into one
+-- transcript.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+--
+-- 'maxAlternatives', 'settings_maxAlternatives' - Indicate the maximum number of alternative transcriptions you want
+-- Amazon Transcribe to include in your transcript.
+--
+-- If you select a number greater than the number of alternative
+-- transcriptions generated by Amazon Transcribe, only the actual number of
+-- alternative transcriptions are included.
+--
+-- If you include @MaxAlternatives@ in your request, you must also include
+-- @ShowAlternatives@ with a value of @true@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+--
+-- 'maxSpeakerLabels', 'settings_maxSpeakerLabels' - Specify the maximum number of speakers you want to partition in your
+-- media.
+--
+-- Note that if your media contains more speakers than the specified
+-- number, multiple speakers are treated as a single speaker.
+--
+-- If you specify the @MaxSpeakerLabels@ field, you must set the
+-- @ShowSpeakerLabels@ field to true.
+--
+-- 'showAlternatives', 'settings_showAlternatives' - To include alternative transcriptions within your transcription output,
+-- include @ShowAlternatives@ in your transcription request.
+--
+-- If you have multi-channel audio and do not enable channel
+-- identification, your audio is transcribed in a continuous manner and
+-- your transcript does not separate the speech by channel.
+--
+-- If you include @ShowAlternatives@, you must also include
+-- @MaxAlternatives@, which is the maximum number of alternative
+-- transcriptions you want Amazon Transcribe to generate.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+--
+-- 'showSpeakerLabels', 'settings_showSpeakerLabels' - Enables speaker partitioning (diarization) in your transcription output.
+-- Speaker partitioning labels the speech from individual speakers in your
+-- media file.
+--
+-- If you enable @ShowSpeakerLabels@ in your request, you must also include
+-- @MaxSpeakerLabels@.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+--
+-- 'vocabularyFilterMethod', 'settings_vocabularyFilterMethod' - Specify how you want your custom vocabulary filter applied to your
+-- transcript.
+--
+-- To replace words with @***@, choose @mask@.
+--
+-- To delete words, choose @remove@.
+--
+-- To flag words without changing them, choose @tag@.
+--
+-- 'vocabularyFilterName', 'settings_vocabularyFilterName' - The name of the custom vocabulary filter you want to use in your
+-- transcription job request. This name is case sensitive, cannot contain
+-- spaces, and must be unique within an Amazon Web Services account.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+--
+-- 'vocabularyName', 'settings_vocabularyName' - The name of the custom vocabulary you want to use in your transcription
+-- job request. This name is case sensitive, cannot contain spaces, and
+-- must be unique within an Amazon Web Services account.
+newSettings ::
+  Settings
+newSettings =
+  Settings'
+    { channelIdentification = Prelude.Nothing,
+      maxAlternatives = Prelude.Nothing,
+      maxSpeakerLabels = Prelude.Nothing,
+      showAlternatives = Prelude.Nothing,
+      showSpeakerLabels = Prelude.Nothing,
+      vocabularyFilterMethod = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing
+    }
+
+-- | Enables channel identification in multi-channel audio.
+--
+-- Channel identification transcribes the audio on each channel
+-- independently, then appends the output for each channel into one
+-- transcript.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html Transcribing multi-channel audio>.
+settings_channelIdentification :: Lens.Lens' Settings (Prelude.Maybe Prelude.Bool)
+settings_channelIdentification = Lens.lens (\Settings' {channelIdentification} -> channelIdentification) (\s@Settings' {} a -> s {channelIdentification = a} :: Settings)
+
+-- | Indicate the maximum number of alternative transcriptions you want
+-- Amazon Transcribe to include in your transcript.
+--
+-- If you select a number greater than the number of alternative
+-- transcriptions generated by Amazon Transcribe, only the actual number of
+-- alternative transcriptions are included.
+--
+-- If you include @MaxAlternatives@ in your request, you must also include
+-- @ShowAlternatives@ with a value of @true@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+settings_maxAlternatives :: Lens.Lens' Settings (Prelude.Maybe Prelude.Natural)
+settings_maxAlternatives = Lens.lens (\Settings' {maxAlternatives} -> maxAlternatives) (\s@Settings' {} a -> s {maxAlternatives = a} :: Settings)
+
+-- | Specify the maximum number of speakers you want to partition in your
+-- media.
+--
+-- Note that if your media contains more speakers than the specified
+-- number, multiple speakers are treated as a single speaker.
+--
+-- If you specify the @MaxSpeakerLabels@ field, you must set the
+-- @ShowSpeakerLabels@ field to true.
+settings_maxSpeakerLabels :: Lens.Lens' Settings (Prelude.Maybe Prelude.Natural)
+settings_maxSpeakerLabels = Lens.lens (\Settings' {maxSpeakerLabels} -> maxSpeakerLabels) (\s@Settings' {} a -> s {maxSpeakerLabels = a} :: Settings)
+
+-- | To include alternative transcriptions within your transcription output,
+-- include @ShowAlternatives@ in your transcription request.
+--
+-- If you have multi-channel audio and do not enable channel
+-- identification, your audio is transcribed in a continuous manner and
+-- your transcript does not separate the speech by channel.
+--
+-- If you include @ShowAlternatives@, you must also include
+-- @MaxAlternatives@, which is the maximum number of alternative
+-- transcriptions you want Amazon Transcribe to generate.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/how-alternatives.html Alternative transcriptions>.
+settings_showAlternatives :: Lens.Lens' Settings (Prelude.Maybe Prelude.Bool)
+settings_showAlternatives = Lens.lens (\Settings' {showAlternatives} -> showAlternatives) (\s@Settings' {} a -> s {showAlternatives = a} :: Settings)
+
+-- | Enables speaker partitioning (diarization) in your transcription output.
+-- Speaker partitioning labels the speech from individual speakers in your
+-- media file.
+--
+-- If you enable @ShowSpeakerLabels@ in your request, you must also include
+-- @MaxSpeakerLabels@.
+--
+-- You can\'t include both @ShowSpeakerLabels@ and @ChannelIdentification@
+-- in the same request. Including both parameters returns a
+-- @BadRequestException@.
+--
+-- For more information, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html Partitioning speakers (diarization)>.
+settings_showSpeakerLabels :: Lens.Lens' Settings (Prelude.Maybe Prelude.Bool)
+settings_showSpeakerLabels = Lens.lens (\Settings' {showSpeakerLabels} -> showSpeakerLabels) (\s@Settings' {} a -> s {showSpeakerLabels = a} :: Settings)
+
+-- | Specify how you want your custom vocabulary filter applied to your
+-- transcript.
+--
+-- To replace words with @***@, choose @mask@.
+--
+-- To delete words, choose @remove@.
+--
+-- To flag words without changing them, choose @tag@.
+settings_vocabularyFilterMethod :: Lens.Lens' Settings (Prelude.Maybe VocabularyFilterMethod)
+settings_vocabularyFilterMethod = Lens.lens (\Settings' {vocabularyFilterMethod} -> vocabularyFilterMethod) (\s@Settings' {} a -> s {vocabularyFilterMethod = a} :: Settings)
+
+-- | The name of the custom vocabulary filter you want to use in your
+-- transcription job request. This name is case sensitive, cannot contain
+-- spaces, and must be unique within an Amazon Web Services account.
+--
+-- Note that if you include @VocabularyFilterName@ in your request, you
+-- must also include @VocabularyFilterMethod@.
+settings_vocabularyFilterName :: Lens.Lens' Settings (Prelude.Maybe Prelude.Text)
+settings_vocabularyFilterName = Lens.lens (\Settings' {vocabularyFilterName} -> vocabularyFilterName) (\s@Settings' {} a -> s {vocabularyFilterName = a} :: Settings)
+
+-- | The name of the custom vocabulary you want to use in your transcription
+-- job request. This name is case sensitive, cannot contain spaces, and
+-- must be unique within an Amazon Web Services account.
+settings_vocabularyName :: Lens.Lens' Settings (Prelude.Maybe Prelude.Text)
+settings_vocabularyName = Lens.lens (\Settings' {vocabularyName} -> vocabularyName) (\s@Settings' {} a -> s {vocabularyName = a} :: Settings)
+
+instance Data.FromJSON Settings where
+  parseJSON =
+    Data.withObject
+      "Settings"
+      ( \x ->
+          Settings'
+            Prelude.<$> (x Data..:? "ChannelIdentification")
+            Prelude.<*> (x Data..:? "MaxAlternatives")
+            Prelude.<*> (x Data..:? "MaxSpeakerLabels")
+            Prelude.<*> (x Data..:? "ShowAlternatives")
+            Prelude.<*> (x Data..:? "ShowSpeakerLabels")
+            Prelude.<*> (x Data..:? "VocabularyFilterMethod")
+            Prelude.<*> (x Data..:? "VocabularyFilterName")
+            Prelude.<*> (x Data..:? "VocabularyName")
+      )
+
+instance Prelude.Hashable Settings where
+  hashWithSalt _salt Settings' {..} =
+    _salt
+      `Prelude.hashWithSalt` channelIdentification
+      `Prelude.hashWithSalt` maxAlternatives
+      `Prelude.hashWithSalt` maxSpeakerLabels
+      `Prelude.hashWithSalt` showAlternatives
+      `Prelude.hashWithSalt` showSpeakerLabels
+      `Prelude.hashWithSalt` vocabularyFilterMethod
+      `Prelude.hashWithSalt` vocabularyFilterName
+      `Prelude.hashWithSalt` vocabularyName
+
+instance Prelude.NFData Settings where
+  rnf Settings' {..} =
+    Prelude.rnf channelIdentification
+      `Prelude.seq` Prelude.rnf maxAlternatives
+      `Prelude.seq` Prelude.rnf maxSpeakerLabels
+      `Prelude.seq` Prelude.rnf showAlternatives
+      `Prelude.seq` Prelude.rnf showSpeakerLabels
+      `Prelude.seq` Prelude.rnf vocabularyFilterMethod
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf vocabularyName
+
+instance Data.ToJSON Settings where
+  toJSON Settings' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ChannelIdentification" Data..=)
+              Prelude.<$> channelIdentification,
+            ("MaxAlternatives" Data..=)
+              Prelude.<$> maxAlternatives,
+            ("MaxSpeakerLabels" Data..=)
+              Prelude.<$> maxSpeakerLabels,
+            ("ShowAlternatives" Data..=)
+              Prelude.<$> showAlternatives,
+            ("ShowSpeakerLabels" Data..=)
+              Prelude.<$> showSpeakerLabels,
+            ("VocabularyFilterMethod" Data..=)
+              Prelude.<$> vocabularyFilterMethod,
+            ("VocabularyFilterName" Data..=)
+              Prelude.<$> vocabularyFilterName,
+            ("VocabularyName" Data..=)
+              Prelude.<$> vocabularyName
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/Specialty.hs b/gen/Amazonka/Transcribe/Types/Specialty.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Specialty.hs
@@ -0,0 +1,66 @@
+{-# 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.Transcribe.Types.Specialty
+-- 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.Transcribe.Types.Specialty
+  ( Specialty
+      ( ..,
+        Specialty_PRIMARYCARE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Specialty = Specialty'
+  { fromSpecialty ::
+      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 Specialty_PRIMARYCARE :: Specialty
+pattern Specialty_PRIMARYCARE = Specialty' "PRIMARYCARE"
+
+{-# COMPLETE
+  Specialty_PRIMARYCARE,
+  Specialty'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/SubtitleFormat.hs b/gen/Amazonka/Transcribe/Types/SubtitleFormat.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/SubtitleFormat.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.Transcribe.Types.SubtitleFormat
+-- 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.Transcribe.Types.SubtitleFormat
+  ( SubtitleFormat
+      ( ..,
+        SubtitleFormat_Srt,
+        SubtitleFormat_Vtt
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype SubtitleFormat = SubtitleFormat'
+  { fromSubtitleFormat ::
+      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 SubtitleFormat_Srt :: SubtitleFormat
+pattern SubtitleFormat_Srt = SubtitleFormat' "srt"
+
+pattern SubtitleFormat_Vtt :: SubtitleFormat
+pattern SubtitleFormat_Vtt = SubtitleFormat' "vtt"
+
+{-# COMPLETE
+  SubtitleFormat_Srt,
+  SubtitleFormat_Vtt,
+  SubtitleFormat'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/Subtitles.hs b/gen/Amazonka/Transcribe/Types/Subtitles.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Subtitles.hs
@@ -0,0 +1,115 @@
+{-# 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.Transcribe.Types.Subtitles
+-- 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.Transcribe.Types.Subtitles 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.Transcribe.Types.SubtitleFormat
+
+-- | Generate subtitles for your media file with your transcription request.
+--
+-- You can choose a start index of 0 or 1, and you can specify either
+-- WebVTT or SubRip (or both) as your output format.
+--
+-- Note that your subtitle files are placed in the same location as your
+-- transcription output.
+--
+-- /See:/ 'newSubtitles' smart constructor.
+data Subtitles = Subtitles'
+  { -- | Specify the output format for your subtitle file; if you select both
+    -- WebVTT (@vtt@) and SubRip (@srt@) formats, two output files are
+    -- generated.
+    formats :: Prelude.Maybe [SubtitleFormat],
+    -- | Specify the starting value that is assigned to the first subtitle
+    -- segment.
+    --
+    -- The default start index for Amazon Transcribe is @0@, which differs from
+    -- the more widely used standard of @1@. If you\'re uncertain which value
+    -- to use, we recommend choosing @1@, as this may improve compatibility
+    -- with other services.
+    outputStartIndex :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Subtitles' 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:
+--
+-- 'formats', 'subtitles_formats' - Specify the output format for your subtitle file; if you select both
+-- WebVTT (@vtt@) and SubRip (@srt@) formats, two output files are
+-- generated.
+--
+-- 'outputStartIndex', 'subtitles_outputStartIndex' - Specify the starting value that is assigned to the first subtitle
+-- segment.
+--
+-- The default start index for Amazon Transcribe is @0@, which differs from
+-- the more widely used standard of @1@. If you\'re uncertain which value
+-- to use, we recommend choosing @1@, as this may improve compatibility
+-- with other services.
+newSubtitles ::
+  Subtitles
+newSubtitles =
+  Subtitles'
+    { formats = Prelude.Nothing,
+      outputStartIndex = Prelude.Nothing
+    }
+
+-- | Specify the output format for your subtitle file; if you select both
+-- WebVTT (@vtt@) and SubRip (@srt@) formats, two output files are
+-- generated.
+subtitles_formats :: Lens.Lens' Subtitles (Prelude.Maybe [SubtitleFormat])
+subtitles_formats = Lens.lens (\Subtitles' {formats} -> formats) (\s@Subtitles' {} a -> s {formats = a} :: Subtitles) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the starting value that is assigned to the first subtitle
+-- segment.
+--
+-- The default start index for Amazon Transcribe is @0@, which differs from
+-- the more widely used standard of @1@. If you\'re uncertain which value
+-- to use, we recommend choosing @1@, as this may improve compatibility
+-- with other services.
+subtitles_outputStartIndex :: Lens.Lens' Subtitles (Prelude.Maybe Prelude.Natural)
+subtitles_outputStartIndex = Lens.lens (\Subtitles' {outputStartIndex} -> outputStartIndex) (\s@Subtitles' {} a -> s {outputStartIndex = a} :: Subtitles)
+
+instance Prelude.Hashable Subtitles where
+  hashWithSalt _salt Subtitles' {..} =
+    _salt
+      `Prelude.hashWithSalt` formats
+      `Prelude.hashWithSalt` outputStartIndex
+
+instance Prelude.NFData Subtitles where
+  rnf Subtitles' {..} =
+    Prelude.rnf formats
+      `Prelude.seq` Prelude.rnf outputStartIndex
+
+instance Data.ToJSON Subtitles where
+  toJSON Subtitles' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Formats" Data..=) Prelude.<$> formats,
+            ("OutputStartIndex" Data..=)
+              Prelude.<$> outputStartIndex
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/SubtitlesOutput.hs b/gen/Amazonka/Transcribe/Types/SubtitlesOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/SubtitlesOutput.hs
@@ -0,0 +1,161 @@
+{-# 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.Transcribe.Types.SubtitlesOutput
+-- 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.Transcribe.Types.SubtitlesOutput 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.Transcribe.Types.SubtitleFormat
+
+-- | Provides information about your subtitle file, including format, start
+-- index, and Amazon S3 location.
+--
+-- /See:/ 'newSubtitlesOutput' smart constructor.
+data SubtitlesOutput = SubtitlesOutput'
+  { -- | Provides the format of your subtitle files. If your request included
+    -- both WebVTT (@vtt@) and SubRip (@srt@) formats, both formats are shown.
+    formats :: Prelude.Maybe [SubtitleFormat],
+    -- | Provides the start index value for your subtitle files. If you did not
+    -- specify a value in your request, the default value of @0@ is used.
+    outputStartIndex :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon S3 location of your transcript. You can use this URI to
+    -- access or download your subtitle file. Your subtitle file is stored in
+    -- the same location as your transcript. If you specified both WebVTT and
+    -- SubRip subtitle formats, two URIs are provided.
+    --
+    -- If you included @OutputBucketName@ in your transcription job request,
+    -- this is the URI of that bucket. If you also included @OutputKey@ in your
+    -- request, your output is located in the path you specified in your
+    -- request.
+    --
+    -- If you didn\'t include @OutputBucketName@ in your transcription job
+    -- request, your subtitle file is stored in a service-managed bucket, and
+    -- @TranscriptFileUri@ provides you with a temporary URI you can use for
+    -- secure access to your subtitle file.
+    --
+    -- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+    -- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+    -- temporary URI by running a @GetTranscriptionJob@ or
+    -- @ListTranscriptionJob@ request.
+    subtitleFileUris :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SubtitlesOutput' 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:
+--
+-- 'formats', 'subtitlesOutput_formats' - Provides the format of your subtitle files. If your request included
+-- both WebVTT (@vtt@) and SubRip (@srt@) formats, both formats are shown.
+--
+-- 'outputStartIndex', 'subtitlesOutput_outputStartIndex' - Provides the start index value for your subtitle files. If you did not
+-- specify a value in your request, the default value of @0@ is used.
+--
+-- 'subtitleFileUris', 'subtitlesOutput_subtitleFileUris' - The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your subtitle file. Your subtitle file is stored in
+-- the same location as your transcript. If you specified both WebVTT and
+-- SubRip subtitle formats, two URIs are provided.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your subtitle file is stored in a service-managed bucket, and
+-- @TranscriptFileUri@ provides you with a temporary URI you can use for
+-- secure access to your subtitle file.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+newSubtitlesOutput ::
+  SubtitlesOutput
+newSubtitlesOutput =
+  SubtitlesOutput'
+    { formats = Prelude.Nothing,
+      outputStartIndex = Prelude.Nothing,
+      subtitleFileUris = Prelude.Nothing
+    }
+
+-- | Provides the format of your subtitle files. If your request included
+-- both WebVTT (@vtt@) and SubRip (@srt@) formats, both formats are shown.
+subtitlesOutput_formats :: Lens.Lens' SubtitlesOutput (Prelude.Maybe [SubtitleFormat])
+subtitlesOutput_formats = Lens.lens (\SubtitlesOutput' {formats} -> formats) (\s@SubtitlesOutput' {} a -> s {formats = a} :: SubtitlesOutput) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides the start index value for your subtitle files. If you did not
+-- specify a value in your request, the default value of @0@ is used.
+subtitlesOutput_outputStartIndex :: Lens.Lens' SubtitlesOutput (Prelude.Maybe Prelude.Natural)
+subtitlesOutput_outputStartIndex = Lens.lens (\SubtitlesOutput' {outputStartIndex} -> outputStartIndex) (\s@SubtitlesOutput' {} a -> s {outputStartIndex = a} :: SubtitlesOutput)
+
+-- | The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your subtitle file. Your subtitle file is stored in
+-- the same location as your transcript. If you specified both WebVTT and
+-- SubRip subtitle formats, two URIs are provided.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your subtitle file is stored in a service-managed bucket, and
+-- @TranscriptFileUri@ provides you with a temporary URI you can use for
+-- secure access to your subtitle file.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+subtitlesOutput_subtitleFileUris :: Lens.Lens' SubtitlesOutput (Prelude.Maybe [Prelude.Text])
+subtitlesOutput_subtitleFileUris = Lens.lens (\SubtitlesOutput' {subtitleFileUris} -> subtitleFileUris) (\s@SubtitlesOutput' {} a -> s {subtitleFileUris = a} :: SubtitlesOutput) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON SubtitlesOutput where
+  parseJSON =
+    Data.withObject
+      "SubtitlesOutput"
+      ( \x ->
+          SubtitlesOutput'
+            Prelude.<$> (x Data..:? "Formats" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "OutputStartIndex")
+            Prelude.<*> ( x
+                            Data..:? "SubtitleFileUris"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable SubtitlesOutput where
+  hashWithSalt _salt SubtitlesOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` formats
+      `Prelude.hashWithSalt` outputStartIndex
+      `Prelude.hashWithSalt` subtitleFileUris
+
+instance Prelude.NFData SubtitlesOutput where
+  rnf SubtitlesOutput' {..} =
+    Prelude.rnf formats
+      `Prelude.seq` Prelude.rnf outputStartIndex
+      `Prelude.seq` Prelude.rnf subtitleFileUris
diff --git a/gen/Amazonka/Transcribe/Types/Tag.hs b/gen/Amazonka/Transcribe/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Tag.hs
@@ -0,0 +1,125 @@
+{-# 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.Transcribe.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.Transcribe.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
+
+-- | Adds metadata, in the form of a key:value pair, to the specified
+-- resource.
+--
+-- For example, you could add the tag @Department:Sales@ to a resource to
+-- indicate that it pertains to your organization\'s sales department. You
+-- can also use tags for tag-based access control.
+--
+-- To learn more about tagging, see
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tagging.html Tagging resources>.
+--
+-- /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 :: 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\'.
+    --
+    -- Note that you can set the value of a tag to an empty string, but you
+    -- can\'t set the value of a tag to null. Omitting the tag value is the
+    -- same as using an empty string.
+    value :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, 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\'.
+--
+-- Note that you can set the value of a tag to an empty string, but you
+-- can\'t set the value of a tag to null. Omitting the tag value is the
+-- same as using an empty string.
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag' {key = pKey_, value = 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)
+
+-- | 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\'.
+--
+-- Note that you can set the value of a tag to an empty string, but you
+-- can\'t set the value of a tag to null. Omitting the tag value is the
+-- same as using an empty string.
+tag_value :: Lens.Lens' Tag Prelude.Text
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+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/Transcribe/Types/Transcript.hs b/gen/Amazonka/Transcribe/Types/Transcript.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Transcript.hs
@@ -0,0 +1,182 @@
+{-# 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.Transcribe.Types.Transcript
+-- 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.Transcribe.Types.Transcript 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
+
+-- | Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+--
+-- /See:/ 'newTranscript' smart constructor.
+data Transcript = Transcript'
+  { -- | The Amazon S3 location of your redacted transcript. You can use this URI
+    -- to access or download your transcript.
+    --
+    -- If you included @OutputBucketName@ in your transcription job request,
+    -- this is the URI of that bucket. If you also included @OutputKey@ in your
+    -- request, your output is located in the path you specified in your
+    -- request.
+    --
+    -- If you didn\'t include @OutputBucketName@ in your transcription job
+    -- request, your transcript is stored in a service-managed bucket, and
+    -- @RedactedTranscriptFileUri@ provides you with a temporary URI you can
+    -- use for secure access to your transcript.
+    --
+    -- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+    -- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+    -- temporary URI by running a @GetTranscriptionJob@ or
+    -- @ListTranscriptionJob@ request.
+    redactedTranscriptFileUri :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 location of your transcript. You can use this URI to
+    -- access or download your transcript.
+    --
+    -- If you included @OutputBucketName@ in your transcription job request,
+    -- this is the URI of that bucket. If you also included @OutputKey@ in your
+    -- request, your output is located in the path you specified in your
+    -- request.
+    --
+    -- If you didn\'t include @OutputBucketName@ in your transcription job
+    -- request, your transcript is stored in a service-managed bucket, and
+    -- @TranscriptFileUri@ provides you with a temporary URI you can use for
+    -- secure access to your transcript.
+    --
+    -- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+    -- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+    -- temporary URI by running a @GetTranscriptionJob@ or
+    -- @ListTranscriptionJob@ request.
+    transcriptFileUri :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Transcript' 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:
+--
+-- 'redactedTranscriptFileUri', 'transcript_redactedTranscriptFileUri' - The Amazon S3 location of your redacted transcript. You can use this URI
+-- to access or download your transcript.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your transcript is stored in a service-managed bucket, and
+-- @RedactedTranscriptFileUri@ provides you with a temporary URI you can
+-- use for secure access to your transcript.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+--
+-- 'transcriptFileUri', 'transcript_transcriptFileUri' - The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your transcript.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your transcript is stored in a service-managed bucket, and
+-- @TranscriptFileUri@ provides you with a temporary URI you can use for
+-- secure access to your transcript.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+newTranscript ::
+  Transcript
+newTranscript =
+  Transcript'
+    { redactedTranscriptFileUri =
+        Prelude.Nothing,
+      transcriptFileUri = Prelude.Nothing
+    }
+
+-- | The Amazon S3 location of your redacted transcript. You can use this URI
+-- to access or download your transcript.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your transcript is stored in a service-managed bucket, and
+-- @RedactedTranscriptFileUri@ provides you with a temporary URI you can
+-- use for secure access to your transcript.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+transcript_redactedTranscriptFileUri :: Lens.Lens' Transcript (Prelude.Maybe Prelude.Text)
+transcript_redactedTranscriptFileUri = Lens.lens (\Transcript' {redactedTranscriptFileUri} -> redactedTranscriptFileUri) (\s@Transcript' {} a -> s {redactedTranscriptFileUri = a} :: Transcript)
+
+-- | The Amazon S3 location of your transcript. You can use this URI to
+-- access or download your transcript.
+--
+-- If you included @OutputBucketName@ in your transcription job request,
+-- this is the URI of that bucket. If you also included @OutputKey@ in your
+-- request, your output is located in the path you specified in your
+-- request.
+--
+-- If you didn\'t include @OutputBucketName@ in your transcription job
+-- request, your transcript is stored in a service-managed bucket, and
+-- @TranscriptFileUri@ provides you with a temporary URI you can use for
+-- secure access to your transcript.
+--
+-- Temporary URIs for service-managed Amazon S3 buckets are only valid for
+-- 15 minutes. If you get an @AccesDenied@ error, you can get a new
+-- temporary URI by running a @GetTranscriptionJob@ or
+-- @ListTranscriptionJob@ request.
+transcript_transcriptFileUri :: Lens.Lens' Transcript (Prelude.Maybe Prelude.Text)
+transcript_transcriptFileUri = Lens.lens (\Transcript' {transcriptFileUri} -> transcriptFileUri) (\s@Transcript' {} a -> s {transcriptFileUri = a} :: Transcript)
+
+instance Data.FromJSON Transcript where
+  parseJSON =
+    Data.withObject
+      "Transcript"
+      ( \x ->
+          Transcript'
+            Prelude.<$> (x Data..:? "RedactedTranscriptFileUri")
+            Prelude.<*> (x Data..:? "TranscriptFileUri")
+      )
+
+instance Prelude.Hashable Transcript where
+  hashWithSalt _salt Transcript' {..} =
+    _salt
+      `Prelude.hashWithSalt` redactedTranscriptFileUri
+      `Prelude.hashWithSalt` transcriptFileUri
+
+instance Prelude.NFData Transcript where
+  rnf Transcript' {..} =
+    Prelude.rnf redactedTranscriptFileUri
+      `Prelude.seq` Prelude.rnf transcriptFileUri
diff --git a/gen/Amazonka/Transcribe/Types/TranscriptFilter.hs b/gen/Amazonka/Transcribe/Types/TranscriptFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/TranscriptFilter.hs
@@ -0,0 +1,215 @@
+{-# 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.Transcribe.Types.TranscriptFilter
+-- 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.Transcribe.Types.TranscriptFilter 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.Transcribe.Types.AbsoluteTimeRange
+import Amazonka.Transcribe.Types.ParticipantRole
+import Amazonka.Transcribe.Types.RelativeTimeRange
+import Amazonka.Transcribe.Types.TranscriptFilterType
+
+-- | Flag the presence or absence of specific words or phrases detected in
+-- your Call Analytics transcription output.
+--
+-- Rules using @TranscriptFilter@ are designed to match:
+--
+-- -   Custom words or phrases spoken by the agent, the customer, or both
+--
+-- -   Custom words or phrases __not__ spoken by the agent, the customer,
+--     or either
+--
+-- -   Custom words or phrases that occur at a specific time frame
+--
+-- See
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-batch.html#tca-rules-batch Rule criteria for batch categories>
+-- and
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/tca-categories-stream.html#tca-rules-stream Rule criteria for streaming categories>
+-- for usage examples.
+--
+-- /See:/ 'newTranscriptFilter' smart constructor.
+data TranscriptFilter = TranscriptFilter'
+  { -- | Makes it possible to specify a time range (in milliseconds) in your
+    -- audio, during which you want to search for the specified key words or
+    -- phrases. See for more detail.
+    absoluteTimeRange :: Prelude.Maybe AbsoluteTimeRange,
+    -- | Set to @TRUE@ to flag the absence of the phrase that you specified in
+    -- your request. Set to @FALSE@ to flag the presence of the phrase that you
+    -- specified in your request.
+    negate :: Prelude.Maybe Prelude.Bool,
+    -- | Specify the participant that you want to flag. Omitting this parameter
+    -- is equivalent to specifying both participants.
+    participantRole :: Prelude.Maybe ParticipantRole,
+    -- | Makes it possible to specify a time range (in percentage) in your media
+    -- file, during which you want to search for the specified key words or
+    -- phrases. See for more detail.
+    relativeTimeRange :: Prelude.Maybe RelativeTimeRange,
+    -- | Flag the presence or absence of an exact match to the phrases that you
+    -- specify. For example, if you specify the phrase \"speak to a manager\"
+    -- as your @Targets@ value, only that exact phrase is flagged.
+    --
+    -- Note that semantic matching is not supported. For example, if your
+    -- customer says \"speak to /the/ manager\", instead of \"speak to /a/
+    -- manager\", your content is not flagged.
+    transcriptFilterType :: TranscriptFilterType,
+    -- | Specify the phrases that you want to flag.
+    targets :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TranscriptFilter' 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:
+--
+-- 'absoluteTimeRange', 'transcriptFilter_absoluteTimeRange' - Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for the specified key words or
+-- phrases. See for more detail.
+--
+-- 'negate', 'transcriptFilter_negate' - Set to @TRUE@ to flag the absence of the phrase that you specified in
+-- your request. Set to @FALSE@ to flag the presence of the phrase that you
+-- specified in your request.
+--
+-- 'participantRole', 'transcriptFilter_participantRole' - Specify the participant that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+--
+-- 'relativeTimeRange', 'transcriptFilter_relativeTimeRange' - Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for the specified key words or
+-- phrases. See for more detail.
+--
+-- 'transcriptFilterType', 'transcriptFilter_transcriptFilterType' - Flag the presence or absence of an exact match to the phrases that you
+-- specify. For example, if you specify the phrase \"speak to a manager\"
+-- as your @Targets@ value, only that exact phrase is flagged.
+--
+-- Note that semantic matching is not supported. For example, if your
+-- customer says \"speak to /the/ manager\", instead of \"speak to /a/
+-- manager\", your content is not flagged.
+--
+-- 'targets', 'transcriptFilter_targets' - Specify the phrases that you want to flag.
+newTranscriptFilter ::
+  -- | 'transcriptFilterType'
+  TranscriptFilterType ->
+  -- | 'targets'
+  Prelude.NonEmpty Prelude.Text ->
+  TranscriptFilter
+newTranscriptFilter pTranscriptFilterType_ pTargets_ =
+  TranscriptFilter'
+    { absoluteTimeRange =
+        Prelude.Nothing,
+      negate = Prelude.Nothing,
+      participantRole = Prelude.Nothing,
+      relativeTimeRange = Prelude.Nothing,
+      transcriptFilterType = pTranscriptFilterType_,
+      targets = Lens.coerced Lens.# pTargets_
+    }
+
+-- | Makes it possible to specify a time range (in milliseconds) in your
+-- audio, during which you want to search for the specified key words or
+-- phrases. See for more detail.
+transcriptFilter_absoluteTimeRange :: Lens.Lens' TranscriptFilter (Prelude.Maybe AbsoluteTimeRange)
+transcriptFilter_absoluteTimeRange = Lens.lens (\TranscriptFilter' {absoluteTimeRange} -> absoluteTimeRange) (\s@TranscriptFilter' {} a -> s {absoluteTimeRange = a} :: TranscriptFilter)
+
+-- | Set to @TRUE@ to flag the absence of the phrase that you specified in
+-- your request. Set to @FALSE@ to flag the presence of the phrase that you
+-- specified in your request.
+transcriptFilter_negate :: Lens.Lens' TranscriptFilter (Prelude.Maybe Prelude.Bool)
+transcriptFilter_negate = Lens.lens (\TranscriptFilter' {negate} -> negate) (\s@TranscriptFilter' {} a -> s {negate = a} :: TranscriptFilter)
+
+-- | Specify the participant that you want to flag. Omitting this parameter
+-- is equivalent to specifying both participants.
+transcriptFilter_participantRole :: Lens.Lens' TranscriptFilter (Prelude.Maybe ParticipantRole)
+transcriptFilter_participantRole = Lens.lens (\TranscriptFilter' {participantRole} -> participantRole) (\s@TranscriptFilter' {} a -> s {participantRole = a} :: TranscriptFilter)
+
+-- | Makes it possible to specify a time range (in percentage) in your media
+-- file, during which you want to search for the specified key words or
+-- phrases. See for more detail.
+transcriptFilter_relativeTimeRange :: Lens.Lens' TranscriptFilter (Prelude.Maybe RelativeTimeRange)
+transcriptFilter_relativeTimeRange = Lens.lens (\TranscriptFilter' {relativeTimeRange} -> relativeTimeRange) (\s@TranscriptFilter' {} a -> s {relativeTimeRange = a} :: TranscriptFilter)
+
+-- | Flag the presence or absence of an exact match to the phrases that you
+-- specify. For example, if you specify the phrase \"speak to a manager\"
+-- as your @Targets@ value, only that exact phrase is flagged.
+--
+-- Note that semantic matching is not supported. For example, if your
+-- customer says \"speak to /the/ manager\", instead of \"speak to /a/
+-- manager\", your content is not flagged.
+transcriptFilter_transcriptFilterType :: Lens.Lens' TranscriptFilter TranscriptFilterType
+transcriptFilter_transcriptFilterType = Lens.lens (\TranscriptFilter' {transcriptFilterType} -> transcriptFilterType) (\s@TranscriptFilter' {} a -> s {transcriptFilterType = a} :: TranscriptFilter)
+
+-- | Specify the phrases that you want to flag.
+transcriptFilter_targets :: Lens.Lens' TranscriptFilter (Prelude.NonEmpty Prelude.Text)
+transcriptFilter_targets = Lens.lens (\TranscriptFilter' {targets} -> targets) (\s@TranscriptFilter' {} a -> s {targets = a} :: TranscriptFilter) Prelude.. Lens.coerced
+
+instance Data.FromJSON TranscriptFilter where
+  parseJSON =
+    Data.withObject
+      "TranscriptFilter"
+      ( \x ->
+          TranscriptFilter'
+            Prelude.<$> (x Data..:? "AbsoluteTimeRange")
+            Prelude.<*> (x Data..:? "Negate")
+            Prelude.<*> (x Data..:? "ParticipantRole")
+            Prelude.<*> (x Data..:? "RelativeTimeRange")
+            Prelude.<*> (x Data..: "TranscriptFilterType")
+            Prelude.<*> (x Data..: "Targets")
+      )
+
+instance Prelude.Hashable TranscriptFilter where
+  hashWithSalt _salt TranscriptFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` absoluteTimeRange
+      `Prelude.hashWithSalt` negate
+      `Prelude.hashWithSalt` participantRole
+      `Prelude.hashWithSalt` relativeTimeRange
+      `Prelude.hashWithSalt` transcriptFilterType
+      `Prelude.hashWithSalt` targets
+
+instance Prelude.NFData TranscriptFilter where
+  rnf TranscriptFilter' {..} =
+    Prelude.rnf absoluteTimeRange
+      `Prelude.seq` Prelude.rnf negate
+      `Prelude.seq` Prelude.rnf participantRole
+      `Prelude.seq` Prelude.rnf relativeTimeRange
+      `Prelude.seq` Prelude.rnf transcriptFilterType
+      `Prelude.seq` Prelude.rnf targets
+
+instance Data.ToJSON TranscriptFilter where
+  toJSON TranscriptFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("AbsoluteTimeRange" Data..=)
+              Prelude.<$> absoluteTimeRange,
+            ("Negate" Data..=) Prelude.<$> negate,
+            ("ParticipantRole" Data..=)
+              Prelude.<$> participantRole,
+            ("RelativeTimeRange" Data..=)
+              Prelude.<$> relativeTimeRange,
+            Prelude.Just
+              ( "TranscriptFilterType"
+                  Data..= transcriptFilterType
+              ),
+            Prelude.Just ("Targets" Data..= targets)
+          ]
+      )
diff --git a/gen/Amazonka/Transcribe/Types/TranscriptFilterType.hs b/gen/Amazonka/Transcribe/Types/TranscriptFilterType.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/TranscriptFilterType.hs
@@ -0,0 +1,66 @@
+{-# 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.Transcribe.Types.TranscriptFilterType
+-- 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.Transcribe.Types.TranscriptFilterType
+  ( TranscriptFilterType
+      ( ..,
+        TranscriptFilterType_EXACT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TranscriptFilterType = TranscriptFilterType'
+  { fromTranscriptFilterType ::
+      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 TranscriptFilterType_EXACT :: TranscriptFilterType
+pattern TranscriptFilterType_EXACT = TranscriptFilterType' "EXACT"
+
+{-# COMPLETE
+  TranscriptFilterType_EXACT,
+  TranscriptFilterType'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/TranscriptionJob.hs b/gen/Amazonka/Transcribe/Types/TranscriptionJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/TranscriptionJob.hs
@@ -0,0 +1,603 @@
+{-# 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.Transcribe.Types.TranscriptionJob
+-- 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.Transcribe.Types.TranscriptionJob 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.Transcribe.Types.ContentRedaction
+import Amazonka.Transcribe.Types.JobExecutionSettings
+import Amazonka.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.LanguageCodeItem
+import Amazonka.Transcribe.Types.LanguageIdSettings
+import Amazonka.Transcribe.Types.Media
+import Amazonka.Transcribe.Types.MediaFormat
+import Amazonka.Transcribe.Types.ModelSettings
+import Amazonka.Transcribe.Types.Settings
+import Amazonka.Transcribe.Types.SubtitlesOutput
+import Amazonka.Transcribe.Types.Tag
+import Amazonka.Transcribe.Types.Transcript
+import Amazonka.Transcribe.Types.TranscriptionJobStatus
+
+-- | Provides detailed information about a transcription job.
+--
+-- To view the status of the specified transcription job, check the
+-- @TranscriptionJobStatus@ field. If the status is @COMPLETED@, the job is
+-- finished and you can find the results at the location specified in
+-- @TranscriptFileUri@. If the status is @FAILED@, @FailureReason@ provides
+-- details on why your transcription job failed.
+--
+-- If you enabled content redaction, the redacted transcript can be found
+-- at the location specified in @RedactedTranscriptFileUri@.
+--
+-- /See:/ 'newTranscriptionJob' smart constructor.
+data TranscriptionJob = TranscriptionJob'
+  { -- | The date and time the specified transcription job finished processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | Indicates whether redaction was enabled in your transcript.
+    contentRedaction :: Prelude.Maybe ContentRedaction,
+    -- | The date and time the specified transcription job request was made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the transcription job request failed.
+    --
+    -- The @FailureReason@ field contains one of the following values:
+    --
+    -- -   @Unsupported media format@.
+    --
+    --     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+    --     __MediaFormat__ for a list of supported formats.
+    --
+    -- -   @The media format provided does not match the detected media format@.
+    --
+    --     The media format specified in @MediaFormat@ doesn\'t match the
+    --     format of the input file. Check the media format of your media file
+    --     and correct the specified value.
+    --
+    -- -   @Invalid sample rate for audio file@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+    --     The sample rate must be between 8,000 and 48,000 hertz.
+    --
+    -- -   @The sample rate provided does not match the detected sample rate@.
+    --
+    --     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+    --     the sample rate detected in your input media file. Check the sample
+    --     rate of your media file and correct the specified value.
+    --
+    -- -   @Invalid file size: file size too large@.
+    --
+    --     The size of your media file is larger than what Amazon Transcribe
+    --     can process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    --
+    -- -   @Invalid number of channels: number of channels too large@.
+    --
+    --     Your audio contains more channels than Amazon Transcribe is able to
+    --     process. For more information, refer to
+    --     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The confidence score associated with the language identified in your
+    -- media file.
+    --
+    -- Confidence scores are values between 0 and 1; a larger value indicates a
+    -- higher probability that the identified language correctly matches the
+    -- language spoken in your media.
+    identifiedLanguageScore :: Prelude.Maybe Prelude.Double,
+    -- | Indicates whether automatic language identification was enabled (@TRUE@)
+    -- for the specified transcription job.
+    identifyLanguage :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether automatic multi-language identification was enabled
+    -- (@TRUE@) for the specified transcription job.
+    identifyMultipleLanguages :: Prelude.Maybe Prelude.Bool,
+    -- | Provides information about how your transcription job was processed.
+    -- This parameter shows if your request was queued and what data access
+    -- role was used.
+    jobExecutionSettings :: Prelude.Maybe JobExecutionSettings,
+    -- | The language code used to create your transcription job. This parameter
+    -- is used with single-language identification. For multi-language
+    -- identification requests, refer to the plural version of this parameter,
+    -- @LanguageCodes@.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The language codes used to create your transcription job. This parameter
+    -- is used with multi-language identification. For single-language
+    -- identification requests, refer to the singular version of this
+    -- parameter, @LanguageCode@.
+    languageCodes :: Prelude.Maybe [LanguageCodeItem],
+    -- | Provides the name and language of all custom language models, custom
+    -- vocabularies, and custom vocabulary filters that you included in your
+    -- request.
+    languageIdSettings :: Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings),
+    -- | Provides the language codes you specified in your request.
+    languageOptions :: Prelude.Maybe (Prelude.NonEmpty LanguageCode),
+    -- | Provides the Amazon S3 location of the media file you used in your
+    -- request.
+    media :: Prelude.Maybe Media,
+    -- | The format of the input media file.
+    mediaFormat :: Prelude.Maybe MediaFormat,
+    -- | The sample rate, in hertz, of the audio track in your input media file.
+    mediaSampleRateHertz :: Prelude.Maybe Prelude.Natural,
+    -- | Provides information on the custom language model you included in your
+    -- request.
+    modelSettings :: Prelude.Maybe ModelSettings,
+    -- | Provides information on any additional settings that were included in
+    -- your request. Additional settings include channel identification,
+    -- alternative transcriptions, speaker partitioning, custom vocabularies,
+    -- and custom vocabulary filters.
+    settings :: Prelude.Maybe Settings,
+    -- | The date and time the specified transcription job began processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | Indicates whether subtitles were generated with your transcription.
+    subtitles :: Prelude.Maybe SubtitlesOutput,
+    -- | The tags, each in the form of a key:value pair, assigned to the
+    -- specified transcription job.
+    tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
+    -- | Provides you with the Amazon S3 URI you can use to access your
+    -- transcript.
+    transcript :: Prelude.Maybe Transcript,
+    -- | The name of the transcription job. Job names are case sensitive and must
+    -- be unique within an Amazon Web Services account.
+    transcriptionJobName :: Prelude.Maybe Prelude.Text,
+    -- | Provides the status of the specified transcription job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@ (or
+    -- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+    -- the status is @FAILED@, @FailureReason@ provides details on why your
+    -- transcription job failed.
+    transcriptionJobStatus :: Prelude.Maybe TranscriptionJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TranscriptionJob' 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:
+--
+-- 'completionTime', 'transcriptionJob_completionTime' - The date and time the specified transcription job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'contentRedaction', 'transcriptionJob_contentRedaction' - Indicates whether redaction was enabled in your transcript.
+--
+-- 'creationTime', 'transcriptionJob_creationTime' - The date and time the specified transcription job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'failureReason', 'transcriptionJob_failureReason' - If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 8,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- 'identifiedLanguageScore', 'transcriptionJob_identifiedLanguageScore' - The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+--
+-- 'identifyLanguage', 'transcriptionJob_identifyLanguage' - Indicates whether automatic language identification was enabled (@TRUE@)
+-- for the specified transcription job.
+--
+-- 'identifyMultipleLanguages', 'transcriptionJob_identifyMultipleLanguages' - Indicates whether automatic multi-language identification was enabled
+-- (@TRUE@) for the specified transcription job.
+--
+-- 'jobExecutionSettings', 'transcriptionJob_jobExecutionSettings' - Provides information about how your transcription job was processed.
+-- This parameter shows if your request was queued and what data access
+-- role was used.
+--
+-- 'languageCode', 'transcriptionJob_languageCode' - The language code used to create your transcription job. This parameter
+-- is used with single-language identification. For multi-language
+-- identification requests, refer to the plural version of this parameter,
+-- @LanguageCodes@.
+--
+-- 'languageCodes', 'transcriptionJob_languageCodes' - The language codes used to create your transcription job. This parameter
+-- is used with multi-language identification. For single-language
+-- identification requests, refer to the singular version of this
+-- parameter, @LanguageCode@.
+--
+-- 'languageIdSettings', 'transcriptionJob_languageIdSettings' - Provides the name and language of all custom language models, custom
+-- vocabularies, and custom vocabulary filters that you included in your
+-- request.
+--
+-- 'languageOptions', 'transcriptionJob_languageOptions' - Provides the language codes you specified in your request.
+--
+-- 'media', 'transcriptionJob_media' - Provides the Amazon S3 location of the media file you used in your
+-- request.
+--
+-- 'mediaFormat', 'transcriptionJob_mediaFormat' - The format of the input media file.
+--
+-- 'mediaSampleRateHertz', 'transcriptionJob_mediaSampleRateHertz' - The sample rate, in hertz, of the audio track in your input media file.
+--
+-- 'modelSettings', 'transcriptionJob_modelSettings' - Provides information on the custom language model you included in your
+-- request.
+--
+-- 'settings', 'transcriptionJob_settings' - Provides information on any additional settings that were included in
+-- your request. Additional settings include channel identification,
+-- alternative transcriptions, speaker partitioning, custom vocabularies,
+-- and custom vocabulary filters.
+--
+-- 'startTime', 'transcriptionJob_startTime' - The date and time the specified transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'subtitles', 'transcriptionJob_subtitles' - Indicates whether subtitles were generated with your transcription.
+--
+-- 'tags', 'transcriptionJob_tags' - The tags, each in the form of a key:value pair, assigned to the
+-- specified transcription job.
+--
+-- 'transcript', 'transcriptionJob_transcript' - Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+--
+-- 'transcriptionJobName', 'transcriptionJob_transcriptionJobName' - The name of the transcription job. Job names are case sensitive and must
+-- be unique within an Amazon Web Services account.
+--
+-- 'transcriptionJobStatus', 'transcriptionJob_transcriptionJobStatus' - Provides the status of the specified transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+newTranscriptionJob ::
+  TranscriptionJob
+newTranscriptionJob =
+  TranscriptionJob'
+    { completionTime = Prelude.Nothing,
+      contentRedaction = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      identifiedLanguageScore = Prelude.Nothing,
+      identifyLanguage = Prelude.Nothing,
+      identifyMultipleLanguages = Prelude.Nothing,
+      jobExecutionSettings = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      languageCodes = Prelude.Nothing,
+      languageIdSettings = Prelude.Nothing,
+      languageOptions = Prelude.Nothing,
+      media = Prelude.Nothing,
+      mediaFormat = Prelude.Nothing,
+      mediaSampleRateHertz = Prelude.Nothing,
+      modelSettings = Prelude.Nothing,
+      settings = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      subtitles = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      transcript = Prelude.Nothing,
+      transcriptionJobName = Prelude.Nothing,
+      transcriptionJobStatus = Prelude.Nothing
+    }
+
+-- | The date and time the specified transcription job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+transcriptionJob_completionTime :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+transcriptionJob_completionTime = Lens.lens (\TranscriptionJob' {completionTime} -> completionTime) (\s@TranscriptionJob' {} a -> s {completionTime = a} :: TranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | Indicates whether redaction was enabled in your transcript.
+transcriptionJob_contentRedaction :: Lens.Lens' TranscriptionJob (Prelude.Maybe ContentRedaction)
+transcriptionJob_contentRedaction = Lens.lens (\TranscriptionJob' {contentRedaction} -> contentRedaction) (\s@TranscriptionJob' {} a -> s {contentRedaction = a} :: TranscriptionJob)
+
+-- | The date and time the specified transcription job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+transcriptionJob_creationTime :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+transcriptionJob_creationTime = Lens.lens (\TranscriptionJob' {creationTime} -> creationTime) (\s@TranscriptionJob' {} a -> s {creationTime = a} :: TranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job request failed.
+--
+-- The @FailureReason@ field contains one of the following values:
+--
+-- -   @Unsupported media format@.
+--
+--     The media format specified in @MediaFormat@ isn\'t valid. Refer to
+--     __MediaFormat__ for a list of supported formats.
+--
+-- -   @The media format provided does not match the detected media format@.
+--
+--     The media format specified in @MediaFormat@ doesn\'t match the
+--     format of the input file. Check the media format of your media file
+--     and correct the specified value.
+--
+-- -   @Invalid sample rate for audio file@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ isn\'t valid.
+--     The sample rate must be between 8,000 and 48,000 hertz.
+--
+-- -   @The sample rate provided does not match the detected sample rate@.
+--
+--     The sample rate specified in @MediaSampleRateHertz@ doesn\'t match
+--     the sample rate detected in your input media file. Check the sample
+--     rate of your media file and correct the specified value.
+--
+-- -   @Invalid file size: file size too large@.
+--
+--     The size of your media file is larger than what Amazon Transcribe
+--     can process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+--
+-- -   @Invalid number of channels: number of channels too large@.
+--
+--     Your audio contains more channels than Amazon Transcribe is able to
+--     process. For more information, refer to
+--     <https://docs.aws.amazon.com/transcribe/latest/dg/limits-guidelines.html#limits Guidelines and quotas>.
+transcriptionJob_failureReason :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Text)
+transcriptionJob_failureReason = Lens.lens (\TranscriptionJob' {failureReason} -> failureReason) (\s@TranscriptionJob' {} a -> s {failureReason = a} :: TranscriptionJob)
+
+-- | The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+transcriptionJob_identifiedLanguageScore :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Double)
+transcriptionJob_identifiedLanguageScore = Lens.lens (\TranscriptionJob' {identifiedLanguageScore} -> identifiedLanguageScore) (\s@TranscriptionJob' {} a -> s {identifiedLanguageScore = a} :: TranscriptionJob)
+
+-- | Indicates whether automatic language identification was enabled (@TRUE@)
+-- for the specified transcription job.
+transcriptionJob_identifyLanguage :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Bool)
+transcriptionJob_identifyLanguage = Lens.lens (\TranscriptionJob' {identifyLanguage} -> identifyLanguage) (\s@TranscriptionJob' {} a -> s {identifyLanguage = a} :: TranscriptionJob)
+
+-- | Indicates whether automatic multi-language identification was enabled
+-- (@TRUE@) for the specified transcription job.
+transcriptionJob_identifyMultipleLanguages :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Bool)
+transcriptionJob_identifyMultipleLanguages = Lens.lens (\TranscriptionJob' {identifyMultipleLanguages} -> identifyMultipleLanguages) (\s@TranscriptionJob' {} a -> s {identifyMultipleLanguages = a} :: TranscriptionJob)
+
+-- | Provides information about how your transcription job was processed.
+-- This parameter shows if your request was queued and what data access
+-- role was used.
+transcriptionJob_jobExecutionSettings :: Lens.Lens' TranscriptionJob (Prelude.Maybe JobExecutionSettings)
+transcriptionJob_jobExecutionSettings = Lens.lens (\TranscriptionJob' {jobExecutionSettings} -> jobExecutionSettings) (\s@TranscriptionJob' {} a -> s {jobExecutionSettings = a} :: TranscriptionJob)
+
+-- | The language code used to create your transcription job. This parameter
+-- is used with single-language identification. For multi-language
+-- identification requests, refer to the plural version of this parameter,
+-- @LanguageCodes@.
+transcriptionJob_languageCode :: Lens.Lens' TranscriptionJob (Prelude.Maybe LanguageCode)
+transcriptionJob_languageCode = Lens.lens (\TranscriptionJob' {languageCode} -> languageCode) (\s@TranscriptionJob' {} a -> s {languageCode = a} :: TranscriptionJob)
+
+-- | The language codes used to create your transcription job. This parameter
+-- is used with multi-language identification. For single-language
+-- identification requests, refer to the singular version of this
+-- parameter, @LanguageCode@.
+transcriptionJob_languageCodes :: Lens.Lens' TranscriptionJob (Prelude.Maybe [LanguageCodeItem])
+transcriptionJob_languageCodes = Lens.lens (\TranscriptionJob' {languageCodes} -> languageCodes) (\s@TranscriptionJob' {} a -> s {languageCodes = a} :: TranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides the name and language of all custom language models, custom
+-- vocabularies, and custom vocabulary filters that you included in your
+-- request.
+transcriptionJob_languageIdSettings :: Lens.Lens' TranscriptionJob (Prelude.Maybe (Prelude.HashMap LanguageCode LanguageIdSettings))
+transcriptionJob_languageIdSettings = Lens.lens (\TranscriptionJob' {languageIdSettings} -> languageIdSettings) (\s@TranscriptionJob' {} a -> s {languageIdSettings = a} :: TranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides the language codes you specified in your request.
+transcriptionJob_languageOptions :: Lens.Lens' TranscriptionJob (Prelude.Maybe (Prelude.NonEmpty LanguageCode))
+transcriptionJob_languageOptions = Lens.lens (\TranscriptionJob' {languageOptions} -> languageOptions) (\s@TranscriptionJob' {} a -> s {languageOptions = a} :: TranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides the Amazon S3 location of the media file you used in your
+-- request.
+transcriptionJob_media :: Lens.Lens' TranscriptionJob (Prelude.Maybe Media)
+transcriptionJob_media = Lens.lens (\TranscriptionJob' {media} -> media) (\s@TranscriptionJob' {} a -> s {media = a} :: TranscriptionJob)
+
+-- | The format of the input media file.
+transcriptionJob_mediaFormat :: Lens.Lens' TranscriptionJob (Prelude.Maybe MediaFormat)
+transcriptionJob_mediaFormat = Lens.lens (\TranscriptionJob' {mediaFormat} -> mediaFormat) (\s@TranscriptionJob' {} a -> s {mediaFormat = a} :: TranscriptionJob)
+
+-- | The sample rate, in hertz, of the audio track in your input media file.
+transcriptionJob_mediaSampleRateHertz :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Natural)
+transcriptionJob_mediaSampleRateHertz = Lens.lens (\TranscriptionJob' {mediaSampleRateHertz} -> mediaSampleRateHertz) (\s@TranscriptionJob' {} a -> s {mediaSampleRateHertz = a} :: TranscriptionJob)
+
+-- | Provides information on the custom language model you included in your
+-- request.
+transcriptionJob_modelSettings :: Lens.Lens' TranscriptionJob (Prelude.Maybe ModelSettings)
+transcriptionJob_modelSettings = Lens.lens (\TranscriptionJob' {modelSettings} -> modelSettings) (\s@TranscriptionJob' {} a -> s {modelSettings = a} :: TranscriptionJob)
+
+-- | Provides information on any additional settings that were included in
+-- your request. Additional settings include channel identification,
+-- alternative transcriptions, speaker partitioning, custom vocabularies,
+-- and custom vocabulary filters.
+transcriptionJob_settings :: Lens.Lens' TranscriptionJob (Prelude.Maybe Settings)
+transcriptionJob_settings = Lens.lens (\TranscriptionJob' {settings} -> settings) (\s@TranscriptionJob' {} a -> s {settings = a} :: TranscriptionJob)
+
+-- | The date and time the specified transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+transcriptionJob_startTime :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.UTCTime)
+transcriptionJob_startTime = Lens.lens (\TranscriptionJob' {startTime} -> startTime) (\s@TranscriptionJob' {} a -> s {startTime = a} :: TranscriptionJob) Prelude.. Lens.mapping Data._Time
+
+-- | Indicates whether subtitles were generated with your transcription.
+transcriptionJob_subtitles :: Lens.Lens' TranscriptionJob (Prelude.Maybe SubtitlesOutput)
+transcriptionJob_subtitles = Lens.lens (\TranscriptionJob' {subtitles} -> subtitles) (\s@TranscriptionJob' {} a -> s {subtitles = a} :: TranscriptionJob)
+
+-- | The tags, each in the form of a key:value pair, assigned to the
+-- specified transcription job.
+transcriptionJob_tags :: Lens.Lens' TranscriptionJob (Prelude.Maybe (Prelude.NonEmpty Tag))
+transcriptionJob_tags = Lens.lens (\TranscriptionJob' {tags} -> tags) (\s@TranscriptionJob' {} a -> s {tags = a} :: TranscriptionJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | Provides you with the Amazon S3 URI you can use to access your
+-- transcript.
+transcriptionJob_transcript :: Lens.Lens' TranscriptionJob (Prelude.Maybe Transcript)
+transcriptionJob_transcript = Lens.lens (\TranscriptionJob' {transcript} -> transcript) (\s@TranscriptionJob' {} a -> s {transcript = a} :: TranscriptionJob)
+
+-- | The name of the transcription job. Job names are case sensitive and must
+-- be unique within an Amazon Web Services account.
+transcriptionJob_transcriptionJobName :: Lens.Lens' TranscriptionJob (Prelude.Maybe Prelude.Text)
+transcriptionJob_transcriptionJobName = Lens.lens (\TranscriptionJob' {transcriptionJobName} -> transcriptionJobName) (\s@TranscriptionJob' {} a -> s {transcriptionJobName = a} :: TranscriptionJob)
+
+-- | Provides the status of the specified transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+transcriptionJob_transcriptionJobStatus :: Lens.Lens' TranscriptionJob (Prelude.Maybe TranscriptionJobStatus)
+transcriptionJob_transcriptionJobStatus = Lens.lens (\TranscriptionJob' {transcriptionJobStatus} -> transcriptionJobStatus) (\s@TranscriptionJob' {} a -> s {transcriptionJobStatus = a} :: TranscriptionJob)
+
+instance Data.FromJSON TranscriptionJob where
+  parseJSON =
+    Data.withObject
+      "TranscriptionJob"
+      ( \x ->
+          TranscriptionJob'
+            Prelude.<$> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "ContentRedaction")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "IdentifiedLanguageScore")
+            Prelude.<*> (x Data..:? "IdentifyLanguage")
+            Prelude.<*> (x Data..:? "IdentifyMultipleLanguages")
+            Prelude.<*> (x Data..:? "JobExecutionSettings")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "LanguageCodes" Data..!= Prelude.mempty)
+            Prelude.<*> ( x
+                            Data..:? "LanguageIdSettings"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "LanguageOptions")
+            Prelude.<*> (x Data..:? "Media")
+            Prelude.<*> (x Data..:? "MediaFormat")
+            Prelude.<*> (x Data..:? "MediaSampleRateHertz")
+            Prelude.<*> (x Data..:? "ModelSettings")
+            Prelude.<*> (x Data..:? "Settings")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "Subtitles")
+            Prelude.<*> (x Data..:? "Tags")
+            Prelude.<*> (x Data..:? "Transcript")
+            Prelude.<*> (x Data..:? "TranscriptionJobName")
+            Prelude.<*> (x Data..:? "TranscriptionJobStatus")
+      )
+
+instance Prelude.Hashable TranscriptionJob where
+  hashWithSalt _salt TranscriptionJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` completionTime
+      `Prelude.hashWithSalt` contentRedaction
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` identifiedLanguageScore
+      `Prelude.hashWithSalt` identifyLanguage
+      `Prelude.hashWithSalt` identifyMultipleLanguages
+      `Prelude.hashWithSalt` jobExecutionSettings
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` languageCodes
+      `Prelude.hashWithSalt` languageIdSettings
+      `Prelude.hashWithSalt` languageOptions
+      `Prelude.hashWithSalt` media
+      `Prelude.hashWithSalt` mediaFormat
+      `Prelude.hashWithSalt` mediaSampleRateHertz
+      `Prelude.hashWithSalt` modelSettings
+      `Prelude.hashWithSalt` settings
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` subtitles
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` transcript
+      `Prelude.hashWithSalt` transcriptionJobName
+      `Prelude.hashWithSalt` transcriptionJobStatus
+
+instance Prelude.NFData TranscriptionJob where
+  rnf TranscriptionJob' {..} =
+    Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf contentRedaction
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf identifiedLanguageScore
+      `Prelude.seq` Prelude.rnf identifyLanguage
+      `Prelude.seq` Prelude.rnf identifyMultipleLanguages
+      `Prelude.seq` Prelude.rnf jobExecutionSettings
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf languageCodes
+      `Prelude.seq` Prelude.rnf languageIdSettings
+      `Prelude.seq` Prelude.rnf languageOptions
+      `Prelude.seq` Prelude.rnf media
+      `Prelude.seq` Prelude.rnf mediaFormat
+      `Prelude.seq` Prelude.rnf mediaSampleRateHertz
+      `Prelude.seq` Prelude.rnf modelSettings
+      `Prelude.seq` Prelude.rnf settings
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf subtitles
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf transcript
+      `Prelude.seq` Prelude.rnf
+        transcriptionJobName
+      `Prelude.seq` Prelude.rnf
+        transcriptionJobStatus
diff --git a/gen/Amazonka/Transcribe/Types/TranscriptionJobStatus.hs b/gen/Amazonka/Transcribe/Types/TranscriptionJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/TranscriptionJobStatus.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.Transcribe.Types.TranscriptionJobStatus
+-- 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.Transcribe.Types.TranscriptionJobStatus
+  ( TranscriptionJobStatus
+      ( ..,
+        TranscriptionJobStatus_COMPLETED,
+        TranscriptionJobStatus_FAILED,
+        TranscriptionJobStatus_IN_PROGRESS,
+        TranscriptionJobStatus_QUEUED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TranscriptionJobStatus = TranscriptionJobStatus'
+  { fromTranscriptionJobStatus ::
+      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 TranscriptionJobStatus_COMPLETED :: TranscriptionJobStatus
+pattern TranscriptionJobStatus_COMPLETED = TranscriptionJobStatus' "COMPLETED"
+
+pattern TranscriptionJobStatus_FAILED :: TranscriptionJobStatus
+pattern TranscriptionJobStatus_FAILED = TranscriptionJobStatus' "FAILED"
+
+pattern TranscriptionJobStatus_IN_PROGRESS :: TranscriptionJobStatus
+pattern TranscriptionJobStatus_IN_PROGRESS = TranscriptionJobStatus' "IN_PROGRESS"
+
+pattern TranscriptionJobStatus_QUEUED :: TranscriptionJobStatus
+pattern TranscriptionJobStatus_QUEUED = TranscriptionJobStatus' "QUEUED"
+
+{-# COMPLETE
+  TranscriptionJobStatus_COMPLETED,
+  TranscriptionJobStatus_FAILED,
+  TranscriptionJobStatus_IN_PROGRESS,
+  TranscriptionJobStatus_QUEUED,
+  TranscriptionJobStatus'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/TranscriptionJobSummary.hs b/gen/Amazonka/Transcribe/Types/TranscriptionJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/TranscriptionJobSummary.hs
@@ -0,0 +1,357 @@
+{-# 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.Transcribe.Types.TranscriptionJobSummary
+-- 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.Transcribe.Types.TranscriptionJobSummary 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.Transcribe.Types.ContentRedaction
+import Amazonka.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.LanguageCodeItem
+import Amazonka.Transcribe.Types.ModelSettings
+import Amazonka.Transcribe.Types.OutputLocationType
+import Amazonka.Transcribe.Types.TranscriptionJobStatus
+
+-- | Provides detailed information about a specific transcription job.
+--
+-- /See:/ 'newTranscriptionJobSummary' smart constructor.
+data TranscriptionJobSummary = TranscriptionJobSummary'
+  { -- | The date and time the specified transcription job finished processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+    -- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+    completionTime :: Prelude.Maybe Data.POSIX,
+    -- | The content redaction settings of the transcription job.
+    contentRedaction :: Prelude.Maybe ContentRedaction,
+    -- | The date and time the specified transcription job request was made.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    creationTime :: Prelude.Maybe Data.POSIX,
+    -- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+    -- information about why the transcription job failed. See also:
+    -- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The confidence score associated with the language identified in your
+    -- media file.
+    --
+    -- Confidence scores are values between 0 and 1; a larger value indicates a
+    -- higher probability that the identified language correctly matches the
+    -- language spoken in your media.
+    identifiedLanguageScore :: Prelude.Maybe Prelude.Double,
+    -- | Indicates whether automatic language identification was enabled (@TRUE@)
+    -- for the specified transcription job.
+    identifyLanguage :: Prelude.Maybe Prelude.Bool,
+    -- | Indicates whether automatic multi-language identification was enabled
+    -- (@TRUE@) for the specified transcription job.
+    identifyMultipleLanguages :: Prelude.Maybe Prelude.Bool,
+    -- | The language code used to create your transcription.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The language codes used to create your transcription job. This parameter
+    -- is used with multi-language identification. For single-language
+    -- identification, the singular version of this parameter, @LanguageCode@,
+    -- is present.
+    languageCodes :: Prelude.Maybe [LanguageCodeItem],
+    modelSettings :: Prelude.Maybe ModelSettings,
+    -- | Indicates where the specified transcription output is stored.
+    --
+    -- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+    -- you specified using the @OutputBucketName@ parameter in your request. If
+    -- you also included @OutputKey@ in your request, your output is located in
+    -- the path you specified in your request.
+    --
+    -- If the value is @SERVICE_BUCKET@, the location is a service-managed
+    -- Amazon S3 bucket. To access a transcript stored in a service-managed
+    -- bucket, use the URI shown in the @TranscriptFileUri@ or
+    -- @RedactedTranscriptFileUri@ field.
+    outputLocationType :: Prelude.Maybe OutputLocationType,
+    -- | The date and time your transcription job began processing.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+    -- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+    startTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the transcription job. Job names are case sensitive and must
+    -- be unique within an Amazon Web Services account.
+    transcriptionJobName :: Prelude.Maybe Prelude.Text,
+    -- | Provides the status of your transcription job.
+    --
+    -- If the status is @COMPLETED@, the job is finished and you can find the
+    -- results at the location specified in @TranscriptFileUri@ (or
+    -- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+    -- the status is @FAILED@, @FailureReason@ provides details on why your
+    -- transcription job failed.
+    transcriptionJobStatus :: Prelude.Maybe TranscriptionJobStatus
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TranscriptionJobSummary' 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:
+--
+-- 'completionTime', 'transcriptionJobSummary_completionTime' - The date and time the specified transcription job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+--
+-- 'contentRedaction', 'transcriptionJobSummary_contentRedaction' - The content redaction settings of the transcription job.
+--
+-- 'creationTime', 'transcriptionJobSummary_creationTime' - The date and time the specified transcription job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'failureReason', 'transcriptionJobSummary_failureReason' - If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+--
+-- 'identifiedLanguageScore', 'transcriptionJobSummary_identifiedLanguageScore' - The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+--
+-- 'identifyLanguage', 'transcriptionJobSummary_identifyLanguage' - Indicates whether automatic language identification was enabled (@TRUE@)
+-- for the specified transcription job.
+--
+-- 'identifyMultipleLanguages', 'transcriptionJobSummary_identifyMultipleLanguages' - Indicates whether automatic multi-language identification was enabled
+-- (@TRUE@) for the specified transcription job.
+--
+-- 'languageCode', 'transcriptionJobSummary_languageCode' - The language code used to create your transcription.
+--
+-- 'languageCodes', 'transcriptionJobSummary_languageCodes' - The language codes used to create your transcription job. This parameter
+-- is used with multi-language identification. For single-language
+-- identification, the singular version of this parameter, @LanguageCode@,
+-- is present.
+--
+-- 'modelSettings', 'transcriptionJobSummary_modelSettings' - Undocumented member.
+--
+-- 'outputLocationType', 'transcriptionJobSummary_outputLocationType' - Indicates where the specified transcription output is stored.
+--
+-- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+-- you specified using the @OutputBucketName@ parameter in your request. If
+-- you also included @OutputKey@ in your request, your output is located in
+-- the path you specified in your request.
+--
+-- If the value is @SERVICE_BUCKET@, the location is a service-managed
+-- Amazon S3 bucket. To access a transcript stored in a service-managed
+-- bucket, use the URI shown in the @TranscriptFileUri@ or
+-- @RedactedTranscriptFileUri@ field.
+--
+-- 'startTime', 'transcriptionJobSummary_startTime' - The date and time your transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+--
+-- 'transcriptionJobName', 'transcriptionJobSummary_transcriptionJobName' - The name of the transcription job. Job names are case sensitive and must
+-- be unique within an Amazon Web Services account.
+--
+-- 'transcriptionJobStatus', 'transcriptionJobSummary_transcriptionJobStatus' - Provides the status of your transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+newTranscriptionJobSummary ::
+  TranscriptionJobSummary
+newTranscriptionJobSummary =
+  TranscriptionJobSummary'
+    { completionTime =
+        Prelude.Nothing,
+      contentRedaction = Prelude.Nothing,
+      creationTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      identifiedLanguageScore = Prelude.Nothing,
+      identifyLanguage = Prelude.Nothing,
+      identifyMultipleLanguages = Prelude.Nothing,
+      languageCode = Prelude.Nothing,
+      languageCodes = Prelude.Nothing,
+      modelSettings = Prelude.Nothing,
+      outputLocationType = Prelude.Nothing,
+      startTime = Prelude.Nothing,
+      transcriptionJobName = Prelude.Nothing,
+      transcriptionJobStatus = Prelude.Nothing
+    }
+
+-- | The date and time the specified transcription job finished processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:33:13.922000-07:00@ represents a transcription
+-- job that started processing at 12:33 PM UTC-7 on May 4, 2022.
+transcriptionJobSummary_completionTime :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+transcriptionJobSummary_completionTime = Lens.lens (\TranscriptionJobSummary' {completionTime} -> completionTime) (\s@TranscriptionJobSummary' {} a -> s {completionTime = a} :: TranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The content redaction settings of the transcription job.
+transcriptionJobSummary_contentRedaction :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe ContentRedaction)
+transcriptionJobSummary_contentRedaction = Lens.lens (\TranscriptionJobSummary' {contentRedaction} -> contentRedaction) (\s@TranscriptionJobSummary' {} a -> s {contentRedaction = a} :: TranscriptionJobSummary)
+
+-- | The date and time the specified transcription job request was made.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+transcriptionJobSummary_creationTime :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+transcriptionJobSummary_creationTime = Lens.lens (\TranscriptionJobSummary' {creationTime} -> creationTime) (\s@TranscriptionJobSummary' {} a -> s {creationTime = a} :: TranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If @TranscriptionJobStatus@ is @FAILED@, @FailureReason@ contains
+-- information about why the transcription job failed. See also:
+-- <https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html Common Errors>.
+transcriptionJobSummary_failureReason :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.Text)
+transcriptionJobSummary_failureReason = Lens.lens (\TranscriptionJobSummary' {failureReason} -> failureReason) (\s@TranscriptionJobSummary' {} a -> s {failureReason = a} :: TranscriptionJobSummary)
+
+-- | The confidence score associated with the language identified in your
+-- media file.
+--
+-- Confidence scores are values between 0 and 1; a larger value indicates a
+-- higher probability that the identified language correctly matches the
+-- language spoken in your media.
+transcriptionJobSummary_identifiedLanguageScore :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.Double)
+transcriptionJobSummary_identifiedLanguageScore = Lens.lens (\TranscriptionJobSummary' {identifiedLanguageScore} -> identifiedLanguageScore) (\s@TranscriptionJobSummary' {} a -> s {identifiedLanguageScore = a} :: TranscriptionJobSummary)
+
+-- | Indicates whether automatic language identification was enabled (@TRUE@)
+-- for the specified transcription job.
+transcriptionJobSummary_identifyLanguage :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.Bool)
+transcriptionJobSummary_identifyLanguage = Lens.lens (\TranscriptionJobSummary' {identifyLanguage} -> identifyLanguage) (\s@TranscriptionJobSummary' {} a -> s {identifyLanguage = a} :: TranscriptionJobSummary)
+
+-- | Indicates whether automatic multi-language identification was enabled
+-- (@TRUE@) for the specified transcription job.
+transcriptionJobSummary_identifyMultipleLanguages :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.Bool)
+transcriptionJobSummary_identifyMultipleLanguages = Lens.lens (\TranscriptionJobSummary' {identifyMultipleLanguages} -> identifyMultipleLanguages) (\s@TranscriptionJobSummary' {} a -> s {identifyMultipleLanguages = a} :: TranscriptionJobSummary)
+
+-- | The language code used to create your transcription.
+transcriptionJobSummary_languageCode :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe LanguageCode)
+transcriptionJobSummary_languageCode = Lens.lens (\TranscriptionJobSummary' {languageCode} -> languageCode) (\s@TranscriptionJobSummary' {} a -> s {languageCode = a} :: TranscriptionJobSummary)
+
+-- | The language codes used to create your transcription job. This parameter
+-- is used with multi-language identification. For single-language
+-- identification, the singular version of this parameter, @LanguageCode@,
+-- is present.
+transcriptionJobSummary_languageCodes :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe [LanguageCodeItem])
+transcriptionJobSummary_languageCodes = Lens.lens (\TranscriptionJobSummary' {languageCodes} -> languageCodes) (\s@TranscriptionJobSummary' {} a -> s {languageCodes = a} :: TranscriptionJobSummary) Prelude.. Lens.mapping Lens.coerced
+
+-- | Undocumented member.
+transcriptionJobSummary_modelSettings :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe ModelSettings)
+transcriptionJobSummary_modelSettings = Lens.lens (\TranscriptionJobSummary' {modelSettings} -> modelSettings) (\s@TranscriptionJobSummary' {} a -> s {modelSettings = a} :: TranscriptionJobSummary)
+
+-- | Indicates where the specified transcription output is stored.
+--
+-- If the value is @CUSTOMER_BUCKET@, the location is the Amazon S3 bucket
+-- you specified using the @OutputBucketName@ parameter in your request. If
+-- you also included @OutputKey@ in your request, your output is located in
+-- the path you specified in your request.
+--
+-- If the value is @SERVICE_BUCKET@, the location is a service-managed
+-- Amazon S3 bucket. To access a transcript stored in a service-managed
+-- bucket, use the URI shown in the @TranscriptFileUri@ or
+-- @RedactedTranscriptFileUri@ field.
+transcriptionJobSummary_outputLocationType :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe OutputLocationType)
+transcriptionJobSummary_outputLocationType = Lens.lens (\TranscriptionJobSummary' {outputLocationType} -> outputLocationType) (\s@TranscriptionJobSummary' {} a -> s {outputLocationType = a} :: TranscriptionJobSummary)
+
+-- | The date and time your transcription job began processing.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.789000-07:00@ represents a transcription
+-- job that started processing at 12:32 PM UTC-7 on May 4, 2022.
+transcriptionJobSummary_startTime :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.UTCTime)
+transcriptionJobSummary_startTime = Lens.lens (\TranscriptionJobSummary' {startTime} -> startTime) (\s@TranscriptionJobSummary' {} a -> s {startTime = a} :: TranscriptionJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the transcription job. Job names are case sensitive and must
+-- be unique within an Amazon Web Services account.
+transcriptionJobSummary_transcriptionJobName :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe Prelude.Text)
+transcriptionJobSummary_transcriptionJobName = Lens.lens (\TranscriptionJobSummary' {transcriptionJobName} -> transcriptionJobName) (\s@TranscriptionJobSummary' {} a -> s {transcriptionJobName = a} :: TranscriptionJobSummary)
+
+-- | Provides the status of your transcription job.
+--
+-- If the status is @COMPLETED@, the job is finished and you can find the
+-- results at the location specified in @TranscriptFileUri@ (or
+-- @RedactedTranscriptFileUri@, if you requested transcript redaction). If
+-- the status is @FAILED@, @FailureReason@ provides details on why your
+-- transcription job failed.
+transcriptionJobSummary_transcriptionJobStatus :: Lens.Lens' TranscriptionJobSummary (Prelude.Maybe TranscriptionJobStatus)
+transcriptionJobSummary_transcriptionJobStatus = Lens.lens (\TranscriptionJobSummary' {transcriptionJobStatus} -> transcriptionJobStatus) (\s@TranscriptionJobSummary' {} a -> s {transcriptionJobStatus = a} :: TranscriptionJobSummary)
+
+instance Data.FromJSON TranscriptionJobSummary where
+  parseJSON =
+    Data.withObject
+      "TranscriptionJobSummary"
+      ( \x ->
+          TranscriptionJobSummary'
+            Prelude.<$> (x Data..:? "CompletionTime")
+            Prelude.<*> (x Data..:? "ContentRedaction")
+            Prelude.<*> (x Data..:? "CreationTime")
+            Prelude.<*> (x Data..:? "FailureReason")
+            Prelude.<*> (x Data..:? "IdentifiedLanguageScore")
+            Prelude.<*> (x Data..:? "IdentifyLanguage")
+            Prelude.<*> (x Data..:? "IdentifyMultipleLanguages")
+            Prelude.<*> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "LanguageCodes" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ModelSettings")
+            Prelude.<*> (x Data..:? "OutputLocationType")
+            Prelude.<*> (x Data..:? "StartTime")
+            Prelude.<*> (x Data..:? "TranscriptionJobName")
+            Prelude.<*> (x Data..:? "TranscriptionJobStatus")
+      )
+
+instance Prelude.Hashable TranscriptionJobSummary where
+  hashWithSalt _salt TranscriptionJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` completionTime
+      `Prelude.hashWithSalt` contentRedaction
+      `Prelude.hashWithSalt` creationTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` identifiedLanguageScore
+      `Prelude.hashWithSalt` identifyLanguage
+      `Prelude.hashWithSalt` identifyMultipleLanguages
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` languageCodes
+      `Prelude.hashWithSalt` modelSettings
+      `Prelude.hashWithSalt` outputLocationType
+      `Prelude.hashWithSalt` startTime
+      `Prelude.hashWithSalt` transcriptionJobName
+      `Prelude.hashWithSalt` transcriptionJobStatus
+
+instance Prelude.NFData TranscriptionJobSummary where
+  rnf TranscriptionJobSummary' {..} =
+    Prelude.rnf completionTime
+      `Prelude.seq` Prelude.rnf contentRedaction
+      `Prelude.seq` Prelude.rnf creationTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf identifiedLanguageScore
+      `Prelude.seq` Prelude.rnf identifyLanguage
+      `Prelude.seq` Prelude.rnf identifyMultipleLanguages
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf languageCodes
+      `Prelude.seq` Prelude.rnf modelSettings
+      `Prelude.seq` Prelude.rnf outputLocationType
+      `Prelude.seq` Prelude.rnf startTime
+      `Prelude.seq` Prelude.rnf transcriptionJobName
+      `Prelude.seq` Prelude.rnf transcriptionJobStatus
diff --git a/gen/Amazonka/Transcribe/Types/Type.hs b/gen/Amazonka/Transcribe/Types/Type.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/Type.hs
@@ -0,0 +1,68 @@
+{-# 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.Transcribe.Types.Type
+-- 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.Transcribe.Types.Type
+  ( Type
+      ( ..,
+        Type_CONVERSATION,
+        Type_DICTATION
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Type = Type' {fromType :: 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 Type_CONVERSATION :: Type
+pattern Type_CONVERSATION = Type' "CONVERSATION"
+
+pattern Type_DICTATION :: Type
+pattern Type_DICTATION = Type' "DICTATION"
+
+{-# COMPLETE
+  Type_CONVERSATION,
+  Type_DICTATION,
+  Type'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/VocabularyFilterInfo.hs b/gen/Amazonka/Transcribe/Types/VocabularyFilterInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/VocabularyFilterInfo.hs
@@ -0,0 +1,156 @@
+{-# 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.Transcribe.Types.VocabularyFilterInfo
+-- 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.Transcribe.Types.VocabularyFilterInfo 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.Transcribe.Types.LanguageCode
+
+-- | Provides information about a custom vocabulary filter, including the
+-- language of the filter, when it was last modified, and its name.
+--
+-- /See:/ 'newVocabularyFilterInfo' smart constructor.
+data VocabularyFilterInfo = VocabularyFilterInfo'
+  { -- | The language code that represents the language of the entries in your
+    -- vocabulary filter. Each custom vocabulary filter must contain terms in
+    -- only one language.
+    --
+    -- A custom vocabulary filter can only be used to transcribe files in the
+    -- same language as the filter. For example, if you create a custom
+    -- vocabulary filter using US English (@en-US@), you can only apply this
+    -- filter to files that contain English audio.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary filter was last
+    -- modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | A unique name, chosen by you, for your custom vocabulary filter. This
+    -- name is case sensitive, cannot contain spaces, and must be unique within
+    -- an Amazon Web Services account.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VocabularyFilterInfo' 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:
+--
+-- 'languageCode', 'vocabularyFilterInfo_languageCode' - The language code that represents the language of the entries in your
+-- vocabulary filter. Each custom vocabulary filter must contain terms in
+-- only one language.
+--
+-- A custom vocabulary filter can only be used to transcribe files in the
+-- same language as the filter. For example, if you create a custom
+-- vocabulary filter using US English (@en-US@), you can only apply this
+-- filter to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+--
+-- 'lastModifiedTime', 'vocabularyFilterInfo_lastModifiedTime' - The date and time the specified custom vocabulary filter was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyFilterName', 'vocabularyFilterInfo_vocabularyFilterName' - A unique name, chosen by you, for your custom vocabulary filter. This
+-- name is case sensitive, cannot contain spaces, and must be unique within
+-- an Amazon Web Services account.
+newVocabularyFilterInfo ::
+  VocabularyFilterInfo
+newVocabularyFilterInfo =
+  VocabularyFilterInfo'
+    { languageCode =
+        Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing
+    }
+
+-- | The language code that represents the language of the entries in your
+-- vocabulary filter. Each custom vocabulary filter must contain terms in
+-- only one language.
+--
+-- A custom vocabulary filter can only be used to transcribe files in the
+-- same language as the filter. For example, if you create a custom
+-- vocabulary filter using US English (@en-US@), you can only apply this
+-- filter to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+vocabularyFilterInfo_languageCode :: Lens.Lens' VocabularyFilterInfo (Prelude.Maybe LanguageCode)
+vocabularyFilterInfo_languageCode = Lens.lens (\VocabularyFilterInfo' {languageCode} -> languageCode) (\s@VocabularyFilterInfo' {} a -> s {languageCode = a} :: VocabularyFilterInfo)
+
+-- | The date and time the specified custom vocabulary filter was last
+-- modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+vocabularyFilterInfo_lastModifiedTime :: Lens.Lens' VocabularyFilterInfo (Prelude.Maybe Prelude.UTCTime)
+vocabularyFilterInfo_lastModifiedTime = Lens.lens (\VocabularyFilterInfo' {lastModifiedTime} -> lastModifiedTime) (\s@VocabularyFilterInfo' {} a -> s {lastModifiedTime = a} :: VocabularyFilterInfo) Prelude.. Lens.mapping Data._Time
+
+-- | A unique name, chosen by you, for your custom vocabulary filter. This
+-- name is case sensitive, cannot contain spaces, and must be unique within
+-- an Amazon Web Services account.
+vocabularyFilterInfo_vocabularyFilterName :: Lens.Lens' VocabularyFilterInfo (Prelude.Maybe Prelude.Text)
+vocabularyFilterInfo_vocabularyFilterName = Lens.lens (\VocabularyFilterInfo' {vocabularyFilterName} -> vocabularyFilterName) (\s@VocabularyFilterInfo' {} a -> s {vocabularyFilterName = a} :: VocabularyFilterInfo)
+
+instance Data.FromJSON VocabularyFilterInfo where
+  parseJSON =
+    Data.withObject
+      "VocabularyFilterInfo"
+      ( \x ->
+          VocabularyFilterInfo'
+            Prelude.<$> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "LastModifiedTime")
+            Prelude.<*> (x Data..:? "VocabularyFilterName")
+      )
+
+instance Prelude.Hashable VocabularyFilterInfo where
+  hashWithSalt _salt VocabularyFilterInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` vocabularyFilterName
+
+instance Prelude.NFData VocabularyFilterInfo where
+  rnf VocabularyFilterInfo' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
diff --git a/gen/Amazonka/Transcribe/Types/VocabularyFilterMethod.hs b/gen/Amazonka/Transcribe/Types/VocabularyFilterMethod.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/VocabularyFilterMethod.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.Transcribe.Types.VocabularyFilterMethod
+-- 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.Transcribe.Types.VocabularyFilterMethod
+  ( VocabularyFilterMethod
+      ( ..,
+        VocabularyFilterMethod_Mask,
+        VocabularyFilterMethod_Remove,
+        VocabularyFilterMethod_Tag
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VocabularyFilterMethod = VocabularyFilterMethod'
+  { fromVocabularyFilterMethod ::
+      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 VocabularyFilterMethod_Mask :: VocabularyFilterMethod
+pattern VocabularyFilterMethod_Mask = VocabularyFilterMethod' "mask"
+
+pattern VocabularyFilterMethod_Remove :: VocabularyFilterMethod
+pattern VocabularyFilterMethod_Remove = VocabularyFilterMethod' "remove"
+
+pattern VocabularyFilterMethod_Tag :: VocabularyFilterMethod
+pattern VocabularyFilterMethod_Tag = VocabularyFilterMethod' "tag"
+
+{-# COMPLETE
+  VocabularyFilterMethod_Mask,
+  VocabularyFilterMethod_Remove,
+  VocabularyFilterMethod_Tag,
+  VocabularyFilterMethod'
+  #-}
diff --git a/gen/Amazonka/Transcribe/Types/VocabularyInfo.hs b/gen/Amazonka/Transcribe/Types/VocabularyInfo.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/VocabularyInfo.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.Transcribe.Types.VocabularyInfo
+-- 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.Transcribe.Types.VocabularyInfo 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.Transcribe.Types.LanguageCode
+import Amazonka.Transcribe.Types.VocabularyState
+
+-- | Provides information about a custom vocabulary, including the language
+-- of the custom vocabulary, when it was last modified, its name, and the
+-- processing state.
+--
+-- /See:/ 'newVocabularyInfo' smart constructor.
+data VocabularyInfo = VocabularyInfo'
+  { -- | The language code used to create your custom vocabulary. Each custom
+    -- vocabulary must contain terms in only one language.
+    --
+    -- A custom vocabulary can only be used to transcribe files in the same
+    -- language as the custom vocabulary. For example, if you create a custom
+    -- vocabulary using US English (@en-US@), you can only apply this custom
+    -- vocabulary to files that contain English audio.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary was last modified.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | A unique name, chosen by you, for your custom vocabulary. This name is
+    -- case sensitive, cannot contain spaces, and must be unique within an
+    -- Amazon Web Services account.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom vocabulary. If the state is @READY@,
+    -- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'VocabularyInfo' 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:
+--
+-- 'languageCode', 'vocabularyInfo_languageCode' - The language code used to create your custom vocabulary. Each custom
+-- vocabulary must contain terms in only one language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+--
+-- 'lastModifiedTime', 'vocabularyInfo_lastModifiedTime' - The date and time the specified custom vocabulary was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'vocabularyInfo_vocabularyName' - A unique name, chosen by you, for your custom vocabulary. This name is
+-- case sensitive, cannot contain spaces, and must be unique within an
+-- Amazon Web Services account.
+--
+-- 'vocabularyState', 'vocabularyInfo_vocabularyState' - The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+newVocabularyInfo ::
+  VocabularyInfo
+newVocabularyInfo =
+  VocabularyInfo'
+    { languageCode = Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing
+    }
+
+-- | The language code used to create your custom vocabulary. Each custom
+-- vocabulary must contain terms in only one language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+vocabularyInfo_languageCode :: Lens.Lens' VocabularyInfo (Prelude.Maybe LanguageCode)
+vocabularyInfo_languageCode = Lens.lens (\VocabularyInfo' {languageCode} -> languageCode) (\s@VocabularyInfo' {} a -> s {languageCode = a} :: VocabularyInfo)
+
+-- | The date and time the specified custom vocabulary was last modified.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+vocabularyInfo_lastModifiedTime :: Lens.Lens' VocabularyInfo (Prelude.Maybe Prelude.UTCTime)
+vocabularyInfo_lastModifiedTime = Lens.lens (\VocabularyInfo' {lastModifiedTime} -> lastModifiedTime) (\s@VocabularyInfo' {} a -> s {lastModifiedTime = a} :: VocabularyInfo) Prelude.. Lens.mapping Data._Time
+
+-- | A unique name, chosen by you, for your custom vocabulary. This name is
+-- case sensitive, cannot contain spaces, and must be unique within an
+-- Amazon Web Services account.
+vocabularyInfo_vocabularyName :: Lens.Lens' VocabularyInfo (Prelude.Maybe Prelude.Text)
+vocabularyInfo_vocabularyName = Lens.lens (\VocabularyInfo' {vocabularyName} -> vocabularyName) (\s@VocabularyInfo' {} a -> s {vocabularyName = a} :: VocabularyInfo)
+
+-- | The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+vocabularyInfo_vocabularyState :: Lens.Lens' VocabularyInfo (Prelude.Maybe VocabularyState)
+vocabularyInfo_vocabularyState = Lens.lens (\VocabularyInfo' {vocabularyState} -> vocabularyState) (\s@VocabularyInfo' {} a -> s {vocabularyState = a} :: VocabularyInfo)
+
+instance Data.FromJSON VocabularyInfo where
+  parseJSON =
+    Data.withObject
+      "VocabularyInfo"
+      ( \x ->
+          VocabularyInfo'
+            Prelude.<$> (x Data..:? "LanguageCode")
+            Prelude.<*> (x Data..:? "LastModifiedTime")
+            Prelude.<*> (x Data..:? "VocabularyName")
+            Prelude.<*> (x Data..:? "VocabularyState")
+      )
+
+instance Prelude.Hashable VocabularyInfo where
+  hashWithSalt _salt VocabularyInfo' {..} =
+    _salt
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` lastModifiedTime
+      `Prelude.hashWithSalt` vocabularyName
+      `Prelude.hashWithSalt` vocabularyState
+
+instance Prelude.NFData VocabularyInfo where
+  rnf VocabularyInfo' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
diff --git a/gen/Amazonka/Transcribe/Types/VocabularyState.hs b/gen/Amazonka/Transcribe/Types/VocabularyState.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/Types/VocabularyState.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.Transcribe.Types.VocabularyState
+-- 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.Transcribe.Types.VocabularyState
+  ( VocabularyState
+      ( ..,
+        VocabularyState_FAILED,
+        VocabularyState_PENDING,
+        VocabularyState_READY
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype VocabularyState = VocabularyState'
+  { fromVocabularyState ::
+      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 VocabularyState_FAILED :: VocabularyState
+pattern VocabularyState_FAILED = VocabularyState' "FAILED"
+
+pattern VocabularyState_PENDING :: VocabularyState
+pattern VocabularyState_PENDING = VocabularyState' "PENDING"
+
+pattern VocabularyState_READY :: VocabularyState
+pattern VocabularyState_READY = VocabularyState' "READY"
+
+{-# COMPLETE
+  VocabularyState_FAILED,
+  VocabularyState_PENDING,
+  VocabularyState_READY,
+  VocabularyState'
+  #-}
diff --git a/gen/Amazonka/Transcribe/UntagResource.hs b/gen/Amazonka/Transcribe/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/UntagResource.hs
@@ -0,0 +1,205 @@
+{-# 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.Transcribe.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 the specified tags from the specified Amazon Transcribe
+-- resource.
+--
+-- If you include @UntagResource@ in your request, you must also include
+-- @ResourceArn@ and @TagKeys@.
+module Amazonka.Transcribe.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.Transcribe.Types
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The Amazon Resource Name (ARN) of the Amazon Transcribe resource you
+    -- want to remove tags from. ARNs have the format
+    -- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+    --
+    -- For example,
+    -- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+    --
+    -- Valid values for @resource-type@ are: @transcription-job@,
+    -- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+    -- @vocabulary-filter@, and @language-model@.
+    resourceArn :: Prelude.Text,
+    -- | Removes the specified tag keys from the specified Amazon Transcribe
+    -- resource.
+    tagKeys :: Prelude.NonEmpty Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, 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 Amazon Transcribe resource you
+-- want to remove tags from. ARNs have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Removes the specified tag keys from the specified Amazon Transcribe
+-- resource.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  -- | 'tagKeys'
+  Prelude.NonEmpty Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ pTagKeys_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Lens.coerced Lens.# pTagKeys_
+    }
+
+-- | The Amazon Resource Name (ARN) of the Amazon Transcribe resource you
+-- want to remove tags from. ARNs have the format
+-- @arn:partition:service:region:account-id:resource-type\/resource-id@.
+--
+-- For example,
+-- @arn:aws:transcribe:us-west-2:111122223333:transcription-job\/transcription-job-name@.
+--
+-- Valid values for @resource-type@ are: @transcription-job@,
+-- @medical-transcription-job@, @vocabulary@, @medical-vocabulary@,
+-- @vocabulary-filter@, and @language-model@.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Removes the specified tag keys from the specified Amazon Transcribe
+-- resource.
+untagResource_tagKeys :: Lens.Lens' UntagResource (Prelude.NonEmpty 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.=# ("Transcribe.UntagResource" :: Prelude.ByteString),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          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/Transcribe/UpdateCallAnalyticsCategory.hs b/gen/Amazonka/Transcribe/UpdateCallAnalyticsCategory.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/UpdateCallAnalyticsCategory.hs
@@ -0,0 +1,234 @@
+{-# 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.Transcribe.UpdateCallAnalyticsCategory
+-- 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 Call Analytics category with new rules. Note that
+-- the @UpdateCallAnalyticsCategory@ operation overwrites all existing
+-- rules contained in the specified category. You cannot append additional
+-- rules onto an existing category.
+--
+-- To create a new category, see .
+module Amazonka.Transcribe.UpdateCallAnalyticsCategory
+  ( -- * Creating a Request
+    UpdateCallAnalyticsCategory (..),
+    newUpdateCallAnalyticsCategory,
+
+    -- * Request Lenses
+    updateCallAnalyticsCategory_inputType,
+    updateCallAnalyticsCategory_categoryName,
+    updateCallAnalyticsCategory_rules,
+
+    -- * Destructuring the Response
+    UpdateCallAnalyticsCategoryResponse (..),
+    newUpdateCallAnalyticsCategoryResponse,
+
+    -- * Response Lenses
+    updateCallAnalyticsCategoryResponse_categoryProperties,
+    updateCallAnalyticsCategoryResponse_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.Transcribe.Types
+
+-- | /See:/ 'newUpdateCallAnalyticsCategory' smart constructor.
+data UpdateCallAnalyticsCategory = UpdateCallAnalyticsCategory'
+  { -- | Choose whether you want to update a streaming or a batch Call Analytics
+    -- category. The input type you specify must match the input type specified
+    -- when the category was created. For example, if you created a category
+    -- with the @POST_CALL@ input type, you must use @POST_CALL@ as the input
+    -- type when updating this category.
+    inputType :: Prelude.Maybe InputType,
+    -- | The name of the Call Analytics category you want to update. Category
+    -- names are case sensitive.
+    categoryName :: Prelude.Text,
+    -- | The rules used for the updated Call Analytics category. The rules you
+    -- provide in this field replace the ones that are currently being used in
+    -- the specified category.
+    rules :: Prelude.NonEmpty Rule
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateCallAnalyticsCategory' 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:
+--
+-- 'inputType', 'updateCallAnalyticsCategory_inputType' - Choose whether you want to update a streaming or a batch Call Analytics
+-- category. The input type you specify must match the input type specified
+-- when the category was created. For example, if you created a category
+-- with the @POST_CALL@ input type, you must use @POST_CALL@ as the input
+-- type when updating this category.
+--
+-- 'categoryName', 'updateCallAnalyticsCategory_categoryName' - The name of the Call Analytics category you want to update. Category
+-- names are case sensitive.
+--
+-- 'rules', 'updateCallAnalyticsCategory_rules' - The rules used for the updated Call Analytics category. The rules you
+-- provide in this field replace the ones that are currently being used in
+-- the specified category.
+newUpdateCallAnalyticsCategory ::
+  -- | 'categoryName'
+  Prelude.Text ->
+  -- | 'rules'
+  Prelude.NonEmpty Rule ->
+  UpdateCallAnalyticsCategory
+newUpdateCallAnalyticsCategory pCategoryName_ pRules_ =
+  UpdateCallAnalyticsCategory'
+    { inputType =
+        Prelude.Nothing,
+      categoryName = pCategoryName_,
+      rules = Lens.coerced Lens.# pRules_
+    }
+
+-- | Choose whether you want to update a streaming or a batch Call Analytics
+-- category. The input type you specify must match the input type specified
+-- when the category was created. For example, if you created a category
+-- with the @POST_CALL@ input type, you must use @POST_CALL@ as the input
+-- type when updating this category.
+updateCallAnalyticsCategory_inputType :: Lens.Lens' UpdateCallAnalyticsCategory (Prelude.Maybe InputType)
+updateCallAnalyticsCategory_inputType = Lens.lens (\UpdateCallAnalyticsCategory' {inputType} -> inputType) (\s@UpdateCallAnalyticsCategory' {} a -> s {inputType = a} :: UpdateCallAnalyticsCategory)
+
+-- | The name of the Call Analytics category you want to update. Category
+-- names are case sensitive.
+updateCallAnalyticsCategory_categoryName :: Lens.Lens' UpdateCallAnalyticsCategory Prelude.Text
+updateCallAnalyticsCategory_categoryName = Lens.lens (\UpdateCallAnalyticsCategory' {categoryName} -> categoryName) (\s@UpdateCallAnalyticsCategory' {} a -> s {categoryName = a} :: UpdateCallAnalyticsCategory)
+
+-- | The rules used for the updated Call Analytics category. The rules you
+-- provide in this field replace the ones that are currently being used in
+-- the specified category.
+updateCallAnalyticsCategory_rules :: Lens.Lens' UpdateCallAnalyticsCategory (Prelude.NonEmpty Rule)
+updateCallAnalyticsCategory_rules = Lens.lens (\UpdateCallAnalyticsCategory' {rules} -> rules) (\s@UpdateCallAnalyticsCategory' {} a -> s {rules = a} :: UpdateCallAnalyticsCategory) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UpdateCallAnalyticsCategory where
+  type
+    AWSResponse UpdateCallAnalyticsCategory =
+      UpdateCallAnalyticsCategoryResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateCallAnalyticsCategoryResponse'
+            Prelude.<$> (x Data..?> "CategoryProperties")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateCallAnalyticsCategory where
+  hashWithSalt _salt UpdateCallAnalyticsCategory' {..} =
+    _salt
+      `Prelude.hashWithSalt` inputType
+      `Prelude.hashWithSalt` categoryName
+      `Prelude.hashWithSalt` rules
+
+instance Prelude.NFData UpdateCallAnalyticsCategory where
+  rnf UpdateCallAnalyticsCategory' {..} =
+    Prelude.rnf inputType
+      `Prelude.seq` Prelude.rnf categoryName
+      `Prelude.seq` Prelude.rnf rules
+
+instance Data.ToHeaders UpdateCallAnalyticsCategory where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.UpdateCallAnalyticsCategory" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateCallAnalyticsCategory where
+  toJSON UpdateCallAnalyticsCategory' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("InputType" Data..=) Prelude.<$> inputType,
+            Prelude.Just ("CategoryName" Data..= categoryName),
+            Prelude.Just ("Rules" Data..= rules)
+          ]
+      )
+
+instance Data.ToPath UpdateCallAnalyticsCategory where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateCallAnalyticsCategory where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateCallAnalyticsCategoryResponse' smart constructor.
+data UpdateCallAnalyticsCategoryResponse = UpdateCallAnalyticsCategoryResponse'
+  { -- | Provides you with the properties of the Call Analytics category you
+    -- specified in your @UpdateCallAnalyticsCategory@ request.
+    categoryProperties :: Prelude.Maybe CategoryProperties,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateCallAnalyticsCategoryResponse' 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:
+--
+-- 'categoryProperties', 'updateCallAnalyticsCategoryResponse_categoryProperties' - Provides you with the properties of the Call Analytics category you
+-- specified in your @UpdateCallAnalyticsCategory@ request.
+--
+-- 'httpStatus', 'updateCallAnalyticsCategoryResponse_httpStatus' - The response's http status code.
+newUpdateCallAnalyticsCategoryResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateCallAnalyticsCategoryResponse
+newUpdateCallAnalyticsCategoryResponse pHttpStatus_ =
+  UpdateCallAnalyticsCategoryResponse'
+    { categoryProperties =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Provides you with the properties of the Call Analytics category you
+-- specified in your @UpdateCallAnalyticsCategory@ request.
+updateCallAnalyticsCategoryResponse_categoryProperties :: Lens.Lens' UpdateCallAnalyticsCategoryResponse (Prelude.Maybe CategoryProperties)
+updateCallAnalyticsCategoryResponse_categoryProperties = Lens.lens (\UpdateCallAnalyticsCategoryResponse' {categoryProperties} -> categoryProperties) (\s@UpdateCallAnalyticsCategoryResponse' {} a -> s {categoryProperties = a} :: UpdateCallAnalyticsCategoryResponse)
+
+-- | The response's http status code.
+updateCallAnalyticsCategoryResponse_httpStatus :: Lens.Lens' UpdateCallAnalyticsCategoryResponse Prelude.Int
+updateCallAnalyticsCategoryResponse_httpStatus = Lens.lens (\UpdateCallAnalyticsCategoryResponse' {httpStatus} -> httpStatus) (\s@UpdateCallAnalyticsCategoryResponse' {} a -> s {httpStatus = a} :: UpdateCallAnalyticsCategoryResponse)
+
+instance
+  Prelude.NFData
+    UpdateCallAnalyticsCategoryResponse
+  where
+  rnf UpdateCallAnalyticsCategoryResponse' {..} =
+    Prelude.rnf categoryProperties
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/UpdateMedicalVocabulary.hs b/gen/Amazonka/Transcribe/UpdateMedicalVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/UpdateMedicalVocabulary.hs
@@ -0,0 +1,301 @@
+{-# 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.Transcribe.UpdateMedicalVocabulary
+-- 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 an existing custom medical vocabulary with new values. This
+-- operation overwrites all existing information with your new values; you
+-- cannot append new terms onto an existing custom vocabulary.
+module Amazonka.Transcribe.UpdateMedicalVocabulary
+  ( -- * Creating a Request
+    UpdateMedicalVocabulary (..),
+    newUpdateMedicalVocabulary,
+
+    -- * Request Lenses
+    updateMedicalVocabulary_vocabularyName,
+    updateMedicalVocabulary_languageCode,
+    updateMedicalVocabulary_vocabularyFileUri,
+
+    -- * Destructuring the Response
+    UpdateMedicalVocabularyResponse (..),
+    newUpdateMedicalVocabularyResponse,
+
+    -- * Response Lenses
+    updateMedicalVocabularyResponse_languageCode,
+    updateMedicalVocabularyResponse_lastModifiedTime,
+    updateMedicalVocabularyResponse_vocabularyName,
+    updateMedicalVocabularyResponse_vocabularyState,
+    updateMedicalVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newUpdateMedicalVocabulary' smart constructor.
+data UpdateMedicalVocabulary = UpdateMedicalVocabulary'
+  { -- | The name of the custom medical vocabulary you want to update. Custom
+    -- medical vocabulary names are case sensitive.
+    vocabularyName :: Prelude.Text,
+    -- | The language code that represents the language of the entries in the
+    -- custom vocabulary you want to update. US English (@en-US@) is the only
+    -- language supported with Amazon Transcribe Medical.
+    languageCode :: LanguageCode,
+    -- | The Amazon S3 location of the text file that contains your custom
+    -- medical vocabulary. The URI must be located in the same Amazon Web
+    -- Services Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+    vocabularyFileUri :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMedicalVocabulary' 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:
+--
+-- 'vocabularyName', 'updateMedicalVocabulary_vocabularyName' - The name of the custom medical vocabulary you want to update. Custom
+-- medical vocabulary names are case sensitive.
+--
+-- 'languageCode', 'updateMedicalVocabulary_languageCode' - The language code that represents the language of the entries in the
+-- custom vocabulary you want to update. US English (@en-US@) is the only
+-- language supported with Amazon Transcribe Medical.
+--
+-- 'vocabularyFileUri', 'updateMedicalVocabulary_vocabularyFileUri' - The Amazon S3 location of the text file that contains your custom
+-- medical vocabulary. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+newUpdateMedicalVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  -- | 'vocabularyFileUri'
+  Prelude.Text ->
+  UpdateMedicalVocabulary
+newUpdateMedicalVocabulary
+  pVocabularyName_
+  pLanguageCode_
+  pVocabularyFileUri_ =
+    UpdateMedicalVocabulary'
+      { vocabularyName =
+          pVocabularyName_,
+        languageCode = pLanguageCode_,
+        vocabularyFileUri = pVocabularyFileUri_
+      }
+
+-- | The name of the custom medical vocabulary you want to update. Custom
+-- medical vocabulary names are case sensitive.
+updateMedicalVocabulary_vocabularyName :: Lens.Lens' UpdateMedicalVocabulary Prelude.Text
+updateMedicalVocabulary_vocabularyName = Lens.lens (\UpdateMedicalVocabulary' {vocabularyName} -> vocabularyName) (\s@UpdateMedicalVocabulary' {} a -> s {vocabularyName = a} :: UpdateMedicalVocabulary)
+
+-- | The language code that represents the language of the entries in the
+-- custom vocabulary you want to update. US English (@en-US@) is the only
+-- language supported with Amazon Transcribe Medical.
+updateMedicalVocabulary_languageCode :: Lens.Lens' UpdateMedicalVocabulary LanguageCode
+updateMedicalVocabulary_languageCode = Lens.lens (\UpdateMedicalVocabulary' {languageCode} -> languageCode) (\s@UpdateMedicalVocabulary' {} a -> s {languageCode = a} :: UpdateMedicalVocabulary)
+
+-- | The Amazon S3 location of the text file that contains your custom
+-- medical vocabulary. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+updateMedicalVocabulary_vocabularyFileUri :: Lens.Lens' UpdateMedicalVocabulary Prelude.Text
+updateMedicalVocabulary_vocabularyFileUri = Lens.lens (\UpdateMedicalVocabulary' {vocabularyFileUri} -> vocabularyFileUri) (\s@UpdateMedicalVocabulary' {} a -> s {vocabularyFileUri = a} :: UpdateMedicalVocabulary)
+
+instance Core.AWSRequest UpdateMedicalVocabulary where
+  type
+    AWSResponse UpdateMedicalVocabulary =
+      UpdateMedicalVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateMedicalVocabularyResponse'
+            Prelude.<$> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateMedicalVocabulary where
+  hashWithSalt _salt UpdateMedicalVocabulary' {..} =
+    _salt
+      `Prelude.hashWithSalt` vocabularyName
+      `Prelude.hashWithSalt` languageCode
+      `Prelude.hashWithSalt` vocabularyFileUri
+
+instance Prelude.NFData UpdateMedicalVocabulary where
+  rnf UpdateMedicalVocabulary' {..} =
+    Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf vocabularyFileUri
+
+instance Data.ToHeaders UpdateMedicalVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.UpdateMedicalVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateMedicalVocabulary where
+  toJSON UpdateMedicalVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("VocabularyName" Data..= vocabularyName),
+            Prelude.Just ("LanguageCode" Data..= languageCode),
+            Prelude.Just
+              ("VocabularyFileUri" Data..= vocabularyFileUri)
+          ]
+      )
+
+instance Data.ToPath UpdateMedicalVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateMedicalVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateMedicalVocabularyResponse' smart constructor.
+data UpdateMedicalVocabularyResponse = UpdateMedicalVocabularyResponse'
+  { -- | The language code you selected for your custom medical vocabulary. US
+    -- English (@en-US@) is the only language supported with Amazon Transcribe
+    -- Medical.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom medical vocabulary was last
+    -- updated.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the updated custom medical vocabulary.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom medical vocabulary. If the state is
+    -- @READY@, you can use the custom vocabulary in a
+    -- @StartMedicalTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMedicalVocabularyResponse' 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:
+--
+-- 'languageCode', 'updateMedicalVocabularyResponse_languageCode' - The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+--
+-- 'lastModifiedTime', 'updateMedicalVocabularyResponse_lastModifiedTime' - The date and time the specified custom medical vocabulary was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'updateMedicalVocabularyResponse_vocabularyName' - The name of the updated custom medical vocabulary.
+--
+-- 'vocabularyState', 'updateMedicalVocabularyResponse_vocabularyState' - The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+--
+-- 'httpStatus', 'updateMedicalVocabularyResponse_httpStatus' - The response's http status code.
+newUpdateMedicalVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateMedicalVocabularyResponse
+newUpdateMedicalVocabularyResponse pHttpStatus_ =
+  UpdateMedicalVocabularyResponse'
+    { languageCode =
+        Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The language code you selected for your custom medical vocabulary. US
+-- English (@en-US@) is the only language supported with Amazon Transcribe
+-- Medical.
+updateMedicalVocabularyResponse_languageCode :: Lens.Lens' UpdateMedicalVocabularyResponse (Prelude.Maybe LanguageCode)
+updateMedicalVocabularyResponse_languageCode = Lens.lens (\UpdateMedicalVocabularyResponse' {languageCode} -> languageCode) (\s@UpdateMedicalVocabularyResponse' {} a -> s {languageCode = a} :: UpdateMedicalVocabularyResponse)
+
+-- | The date and time the specified custom medical vocabulary was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+updateMedicalVocabularyResponse_lastModifiedTime :: Lens.Lens' UpdateMedicalVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+updateMedicalVocabularyResponse_lastModifiedTime = Lens.lens (\UpdateMedicalVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@UpdateMedicalVocabularyResponse' {} a -> s {lastModifiedTime = a} :: UpdateMedicalVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the updated custom medical vocabulary.
+updateMedicalVocabularyResponse_vocabularyName :: Lens.Lens' UpdateMedicalVocabularyResponse (Prelude.Maybe Prelude.Text)
+updateMedicalVocabularyResponse_vocabularyName = Lens.lens (\UpdateMedicalVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@UpdateMedicalVocabularyResponse' {} a -> s {vocabularyName = a} :: UpdateMedicalVocabularyResponse)
+
+-- | The processing state of your custom medical vocabulary. If the state is
+-- @READY@, you can use the custom vocabulary in a
+-- @StartMedicalTranscriptionJob@ request.
+updateMedicalVocabularyResponse_vocabularyState :: Lens.Lens' UpdateMedicalVocabularyResponse (Prelude.Maybe VocabularyState)
+updateMedicalVocabularyResponse_vocabularyState = Lens.lens (\UpdateMedicalVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@UpdateMedicalVocabularyResponse' {} a -> s {vocabularyState = a} :: UpdateMedicalVocabularyResponse)
+
+-- | The response's http status code.
+updateMedicalVocabularyResponse_httpStatus :: Lens.Lens' UpdateMedicalVocabularyResponse Prelude.Int
+updateMedicalVocabularyResponse_httpStatus = Lens.lens (\UpdateMedicalVocabularyResponse' {httpStatus} -> httpStatus) (\s@UpdateMedicalVocabularyResponse' {} a -> s {httpStatus = a} :: UpdateMedicalVocabularyResponse)
+
+instance
+  Prelude.NFData
+    UpdateMedicalVocabularyResponse
+  where
+  rnf UpdateMedicalVocabularyResponse' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/UpdateVocabulary.hs b/gen/Amazonka/Transcribe/UpdateVocabulary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/UpdateVocabulary.hs
@@ -0,0 +1,374 @@
+{-# 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.Transcribe.UpdateVocabulary
+-- 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 an existing custom vocabulary with new values. This operation
+-- overwrites all existing information with your new values; you cannot
+-- append new terms onto an existing custom vocabulary.
+module Amazonka.Transcribe.UpdateVocabulary
+  ( -- * Creating a Request
+    UpdateVocabulary (..),
+    newUpdateVocabulary,
+
+    -- * Request Lenses
+    updateVocabulary_phrases,
+    updateVocabulary_vocabularyFileUri,
+    updateVocabulary_vocabularyName,
+    updateVocabulary_languageCode,
+
+    -- * Destructuring the Response
+    UpdateVocabularyResponse (..),
+    newUpdateVocabularyResponse,
+
+    -- * Response Lenses
+    updateVocabularyResponse_languageCode,
+    updateVocabularyResponse_lastModifiedTime,
+    updateVocabularyResponse_vocabularyName,
+    updateVocabularyResponse_vocabularyState,
+    updateVocabularyResponse_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.Transcribe.Types
+
+-- | /See:/ 'newUpdateVocabulary' smart constructor.
+data UpdateVocabulary = UpdateVocabulary'
+  { -- | Use this parameter if you want to update your custom vocabulary by
+    -- including all desired terms, as comma-separated values, within your
+    -- request. The other option for updating your custom vocabulary is to save
+    -- your entries in a text file and upload them to an Amazon S3 bucket, then
+    -- specify the location of your file using the @VocabularyFileUri@
+    -- parameter.
+    --
+    -- Note that if you include @Phrases@ in your request, you cannot use
+    -- @VocabularyFileUri@; you must choose one or the other.
+    --
+    -- Each language has a character set that contains all allowed characters
+    -- for that specific language. If you use unsupported characters, your
+    -- custom vocabulary filter request fails. Refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+    -- to get the character set for your language.
+    phrases :: Prelude.Maybe [Prelude.Text],
+    -- | The Amazon S3 location of the text file that contains your custom
+    -- vocabulary. The URI must be located in the same Amazon Web Services
+    -- Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+    --
+    -- Note that if you include @VocabularyFileUri@ in your request, you cannot
+    -- use the @Phrases@ flag; you must choose one or the other.
+    vocabularyFileUri :: Prelude.Maybe Prelude.Text,
+    -- | The name of the custom vocabulary you want to update. Custom vocabulary
+    -- names are case sensitive.
+    vocabularyName :: Prelude.Text,
+    -- | The language code that represents the language of the entries in the
+    -- custom vocabulary you want to update. Each custom vocabulary must
+    -- contain terms in only one language.
+    --
+    -- A custom vocabulary can only be used to transcribe files in the same
+    -- language as the custom vocabulary. For example, if you create a custom
+    -- vocabulary using US English (@en-US@), you can only apply this custom
+    -- vocabulary to files that contain English audio.
+    --
+    -- For a list of supported languages and their associated language codes,
+    -- refer to the
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+    -- table.
+    languageCode :: LanguageCode
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVocabulary' 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:
+--
+-- 'phrases', 'updateVocabulary_phrases' - Use this parameter if you want to update your custom vocabulary by
+-- including all desired terms, as comma-separated values, within your
+-- request. The other option for updating your custom vocabulary is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFileUri@
+-- parameter.
+--
+-- Note that if you include @Phrases@ in your request, you cannot use
+-- @VocabularyFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- 'vocabularyFileUri', 'updateVocabulary_vocabularyFileUri' - The Amazon S3 location of the text file that contains your custom
+-- vocabulary. The URI must be located in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+--
+-- Note that if you include @VocabularyFileUri@ in your request, you cannot
+-- use the @Phrases@ flag; you must choose one or the other.
+--
+-- 'vocabularyName', 'updateVocabulary_vocabularyName' - The name of the custom vocabulary you want to update. Custom vocabulary
+-- names are case sensitive.
+--
+-- 'languageCode', 'updateVocabulary_languageCode' - The language code that represents the language of the entries in the
+-- custom vocabulary you want to update. Each custom vocabulary must
+-- contain terms in only one language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+newUpdateVocabulary ::
+  -- | 'vocabularyName'
+  Prelude.Text ->
+  -- | 'languageCode'
+  LanguageCode ->
+  UpdateVocabulary
+newUpdateVocabulary pVocabularyName_ pLanguageCode_ =
+  UpdateVocabulary'
+    { phrases = Prelude.Nothing,
+      vocabularyFileUri = Prelude.Nothing,
+      vocabularyName = pVocabularyName_,
+      languageCode = pLanguageCode_
+    }
+
+-- | Use this parameter if you want to update your custom vocabulary by
+-- including all desired terms, as comma-separated values, within your
+-- request. The other option for updating your custom vocabulary is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFileUri@
+-- parameter.
+--
+-- Note that if you include @Phrases@ in your request, you cannot use
+-- @VocabularyFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+updateVocabulary_phrases :: Lens.Lens' UpdateVocabulary (Prelude.Maybe [Prelude.Text])
+updateVocabulary_phrases = Lens.lens (\UpdateVocabulary' {phrases} -> phrases) (\s@UpdateVocabulary' {} a -> s {phrases = a} :: UpdateVocabulary) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon S3 location of the text file that contains your custom
+-- vocabulary. The URI must be located in the same Amazon Web Services
+-- Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-file.txt@
+--
+-- Note that if you include @VocabularyFileUri@ in your request, you cannot
+-- use the @Phrases@ flag; you must choose one or the other.
+updateVocabulary_vocabularyFileUri :: Lens.Lens' UpdateVocabulary (Prelude.Maybe Prelude.Text)
+updateVocabulary_vocabularyFileUri = Lens.lens (\UpdateVocabulary' {vocabularyFileUri} -> vocabularyFileUri) (\s@UpdateVocabulary' {} a -> s {vocabularyFileUri = a} :: UpdateVocabulary)
+
+-- | The name of the custom vocabulary you want to update. Custom vocabulary
+-- names are case sensitive.
+updateVocabulary_vocabularyName :: Lens.Lens' UpdateVocabulary Prelude.Text
+updateVocabulary_vocabularyName = Lens.lens (\UpdateVocabulary' {vocabularyName} -> vocabularyName) (\s@UpdateVocabulary' {} a -> s {vocabularyName = a} :: UpdateVocabulary)
+
+-- | The language code that represents the language of the entries in the
+-- custom vocabulary you want to update. Each custom vocabulary must
+-- contain terms in only one language.
+--
+-- A custom vocabulary can only be used to transcribe files in the same
+-- language as the custom vocabulary. For example, if you create a custom
+-- vocabulary using US English (@en-US@), you can only apply this custom
+-- vocabulary to files that contain English audio.
+--
+-- For a list of supported languages and their associated language codes,
+-- refer to the
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html Supported languages>
+-- table.
+updateVocabulary_languageCode :: Lens.Lens' UpdateVocabulary LanguageCode
+updateVocabulary_languageCode = Lens.lens (\UpdateVocabulary' {languageCode} -> languageCode) (\s@UpdateVocabulary' {} a -> s {languageCode = a} :: UpdateVocabulary)
+
+instance Core.AWSRequest UpdateVocabulary where
+  type
+    AWSResponse UpdateVocabulary =
+      UpdateVocabularyResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVocabularyResponse'
+            Prelude.<$> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyName")
+            Prelude.<*> (x Data..?> "VocabularyState")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateVocabulary where
+  hashWithSalt _salt UpdateVocabulary' {..} =
+    _salt
+      `Prelude.hashWithSalt` phrases
+      `Prelude.hashWithSalt` vocabularyFileUri
+      `Prelude.hashWithSalt` vocabularyName
+      `Prelude.hashWithSalt` languageCode
+
+instance Prelude.NFData UpdateVocabulary where
+  rnf UpdateVocabulary' {..} =
+    Prelude.rnf phrases
+      `Prelude.seq` Prelude.rnf vocabularyFileUri
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf languageCode
+
+instance Data.ToHeaders UpdateVocabulary where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.UpdateVocabulary" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVocabulary where
+  toJSON UpdateVocabulary' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Phrases" Data..=) Prelude.<$> phrases,
+            ("VocabularyFileUri" Data..=)
+              Prelude.<$> vocabularyFileUri,
+            Prelude.Just
+              ("VocabularyName" Data..= vocabularyName),
+            Prelude.Just ("LanguageCode" Data..= languageCode)
+          ]
+      )
+
+instance Data.ToPath UpdateVocabulary where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateVocabulary where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateVocabularyResponse' smart constructor.
+data UpdateVocabularyResponse = UpdateVocabularyResponse'
+  { -- | The language code you selected for your custom vocabulary.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary was last updated.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the updated custom vocabulary.
+    vocabularyName :: Prelude.Maybe Prelude.Text,
+    -- | The processing state of your custom vocabulary. If the state is @READY@,
+    -- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+    vocabularyState :: Prelude.Maybe VocabularyState,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVocabularyResponse' 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:
+--
+-- 'languageCode', 'updateVocabularyResponse_languageCode' - The language code you selected for your custom vocabulary.
+--
+-- 'lastModifiedTime', 'updateVocabularyResponse_lastModifiedTime' - The date and time the specified custom vocabulary was last updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyName', 'updateVocabularyResponse_vocabularyName' - The name of the updated custom vocabulary.
+--
+-- 'vocabularyState', 'updateVocabularyResponse_vocabularyState' - The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+--
+-- 'httpStatus', 'updateVocabularyResponse_httpStatus' - The response's http status code.
+newUpdateVocabularyResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateVocabularyResponse
+newUpdateVocabularyResponse pHttpStatus_ =
+  UpdateVocabularyResponse'
+    { languageCode =
+        Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyName = Prelude.Nothing,
+      vocabularyState = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The language code you selected for your custom vocabulary.
+updateVocabularyResponse_languageCode :: Lens.Lens' UpdateVocabularyResponse (Prelude.Maybe LanguageCode)
+updateVocabularyResponse_languageCode = Lens.lens (\UpdateVocabularyResponse' {languageCode} -> languageCode) (\s@UpdateVocabularyResponse' {} a -> s {languageCode = a} :: UpdateVocabularyResponse)
+
+-- | The date and time the specified custom vocabulary was last updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+updateVocabularyResponse_lastModifiedTime :: Lens.Lens' UpdateVocabularyResponse (Prelude.Maybe Prelude.UTCTime)
+updateVocabularyResponse_lastModifiedTime = Lens.lens (\UpdateVocabularyResponse' {lastModifiedTime} -> lastModifiedTime) (\s@UpdateVocabularyResponse' {} a -> s {lastModifiedTime = a} :: UpdateVocabularyResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the updated custom vocabulary.
+updateVocabularyResponse_vocabularyName :: Lens.Lens' UpdateVocabularyResponse (Prelude.Maybe Prelude.Text)
+updateVocabularyResponse_vocabularyName = Lens.lens (\UpdateVocabularyResponse' {vocabularyName} -> vocabularyName) (\s@UpdateVocabularyResponse' {} a -> s {vocabularyName = a} :: UpdateVocabularyResponse)
+
+-- | The processing state of your custom vocabulary. If the state is @READY@,
+-- you can use the custom vocabulary in a @StartTranscriptionJob@ request.
+updateVocabularyResponse_vocabularyState :: Lens.Lens' UpdateVocabularyResponse (Prelude.Maybe VocabularyState)
+updateVocabularyResponse_vocabularyState = Lens.lens (\UpdateVocabularyResponse' {vocabularyState} -> vocabularyState) (\s@UpdateVocabularyResponse' {} a -> s {vocabularyState = a} :: UpdateVocabularyResponse)
+
+-- | The response's http status code.
+updateVocabularyResponse_httpStatus :: Lens.Lens' UpdateVocabularyResponse Prelude.Int
+updateVocabularyResponse_httpStatus = Lens.lens (\UpdateVocabularyResponse' {httpStatus} -> httpStatus) (\s@UpdateVocabularyResponse' {} a -> s {httpStatus = a} :: UpdateVocabularyResponse)
+
+instance Prelude.NFData UpdateVocabularyResponse where
+  rnf UpdateVocabularyResponse' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyName
+      `Prelude.seq` Prelude.rnf vocabularyState
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/UpdateVocabularyFilter.hs b/gen/Amazonka/Transcribe/UpdateVocabularyFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/UpdateVocabularyFilter.hs
@@ -0,0 +1,317 @@
+{-# 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.Transcribe.UpdateVocabularyFilter
+-- 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 an existing custom vocabulary filter with a new list of words.
+-- The new list you provide overwrites all previous entries; you cannot
+-- append new terms onto an existing custom vocabulary filter.
+module Amazonka.Transcribe.UpdateVocabularyFilter
+  ( -- * Creating a Request
+    UpdateVocabularyFilter (..),
+    newUpdateVocabularyFilter,
+
+    -- * Request Lenses
+    updateVocabularyFilter_vocabularyFilterFileUri,
+    updateVocabularyFilter_words,
+    updateVocabularyFilter_vocabularyFilterName,
+
+    -- * Destructuring the Response
+    UpdateVocabularyFilterResponse (..),
+    newUpdateVocabularyFilterResponse,
+
+    -- * Response Lenses
+    updateVocabularyFilterResponse_languageCode,
+    updateVocabularyFilterResponse_lastModifiedTime,
+    updateVocabularyFilterResponse_vocabularyFilterName,
+    updateVocabularyFilterResponse_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.Transcribe.Types
+
+-- | /See:/ 'newUpdateVocabularyFilter' smart constructor.
+data UpdateVocabularyFilter = UpdateVocabularyFilter'
+  { -- | The Amazon S3 location of the text file that contains your custom
+    -- vocabulary filter terms. The URI must be located in the same Amazon Web
+    -- Services Region as the resource you\'re calling.
+    --
+    -- Here\'s an example URI path:
+    -- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+    --
+    -- Note that if you include @VocabularyFilterFileUri@ in your request, you
+    -- cannot use @Words@; you must choose one or the other.
+    vocabularyFilterFileUri :: Prelude.Maybe Prelude.Text,
+    -- | Use this parameter if you want to update your custom vocabulary filter
+    -- by including all desired terms, as comma-separated values, within your
+    -- request. The other option for updating your vocabulary filter is to save
+    -- your entries in a text file and upload them to an Amazon S3 bucket, then
+    -- specify the location of your file using the @VocabularyFilterFileUri@
+    -- parameter.
+    --
+    -- Note that if you include @Words@ in your request, you cannot use
+    -- @VocabularyFilterFileUri@; you must choose one or the other.
+    --
+    -- Each language has a character set that contains all allowed characters
+    -- for that specific language. If you use unsupported characters, your
+    -- custom vocabulary filter request fails. Refer to
+    -- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+    -- to get the character set for your language.
+    words :: Prelude.Maybe (Prelude.NonEmpty Prelude.Text),
+    -- | The name of the custom vocabulary filter you want to update. Custom
+    -- vocabulary filter names are case sensitive.
+    vocabularyFilterName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVocabularyFilter' 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:
+--
+-- 'vocabularyFilterFileUri', 'updateVocabularyFilter_vocabularyFilterFileUri' - The Amazon S3 location of the text file that contains your custom
+-- vocabulary filter terms. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+--
+-- Note that if you include @VocabularyFilterFileUri@ in your request, you
+-- cannot use @Words@; you must choose one or the other.
+--
+-- 'words', 'updateVocabularyFilter_words' - Use this parameter if you want to update your custom vocabulary filter
+-- by including all desired terms, as comma-separated values, within your
+-- request. The other option for updating your vocabulary filter is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFilterFileUri@
+-- parameter.
+--
+-- Note that if you include @Words@ in your request, you cannot use
+-- @VocabularyFilterFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+--
+-- 'vocabularyFilterName', 'updateVocabularyFilter_vocabularyFilterName' - The name of the custom vocabulary filter you want to update. Custom
+-- vocabulary filter names are case sensitive.
+newUpdateVocabularyFilter ::
+  -- | 'vocabularyFilterName'
+  Prelude.Text ->
+  UpdateVocabularyFilter
+newUpdateVocabularyFilter pVocabularyFilterName_ =
+  UpdateVocabularyFilter'
+    { vocabularyFilterFileUri =
+        Prelude.Nothing,
+      words = Prelude.Nothing,
+      vocabularyFilterName = pVocabularyFilterName_
+    }
+
+-- | The Amazon S3 location of the text file that contains your custom
+-- vocabulary filter terms. The URI must be located in the same Amazon Web
+-- Services Region as the resource you\'re calling.
+--
+-- Here\'s an example URI path:
+-- @s3:\/\/DOC-EXAMPLE-BUCKET\/my-vocab-filter-file.txt@
+--
+-- Note that if you include @VocabularyFilterFileUri@ in your request, you
+-- cannot use @Words@; you must choose one or the other.
+updateVocabularyFilter_vocabularyFilterFileUri :: Lens.Lens' UpdateVocabularyFilter (Prelude.Maybe Prelude.Text)
+updateVocabularyFilter_vocabularyFilterFileUri = Lens.lens (\UpdateVocabularyFilter' {vocabularyFilterFileUri} -> vocabularyFilterFileUri) (\s@UpdateVocabularyFilter' {} a -> s {vocabularyFilterFileUri = a} :: UpdateVocabularyFilter)
+
+-- | Use this parameter if you want to update your custom vocabulary filter
+-- by including all desired terms, as comma-separated values, within your
+-- request. The other option for updating your vocabulary filter is to save
+-- your entries in a text file and upload them to an Amazon S3 bucket, then
+-- specify the location of your file using the @VocabularyFilterFileUri@
+-- parameter.
+--
+-- Note that if you include @Words@ in your request, you cannot use
+-- @VocabularyFilterFileUri@; you must choose one or the other.
+--
+-- Each language has a character set that contains all allowed characters
+-- for that specific language. If you use unsupported characters, your
+-- custom vocabulary filter request fails. Refer to
+-- <https://docs.aws.amazon.com/transcribe/latest/dg/charsets.html Character Sets for Custom Vocabularies>
+-- to get the character set for your language.
+updateVocabularyFilter_words :: Lens.Lens' UpdateVocabularyFilter (Prelude.Maybe (Prelude.NonEmpty Prelude.Text))
+updateVocabularyFilter_words = Lens.lens (\UpdateVocabularyFilter' {words} -> words) (\s@UpdateVocabularyFilter' {} a -> s {words = a} :: UpdateVocabularyFilter) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the custom vocabulary filter you want to update. Custom
+-- vocabulary filter names are case sensitive.
+updateVocabularyFilter_vocabularyFilterName :: Lens.Lens' UpdateVocabularyFilter Prelude.Text
+updateVocabularyFilter_vocabularyFilterName = Lens.lens (\UpdateVocabularyFilter' {vocabularyFilterName} -> vocabularyFilterName) (\s@UpdateVocabularyFilter' {} a -> s {vocabularyFilterName = a} :: UpdateVocabularyFilter)
+
+instance Core.AWSRequest UpdateVocabularyFilter where
+  type
+    AWSResponse UpdateVocabularyFilter =
+      UpdateVocabularyFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateVocabularyFilterResponse'
+            Prelude.<$> (x Data..?> "LanguageCode")
+            Prelude.<*> (x Data..?> "LastModifiedTime")
+            Prelude.<*> (x Data..?> "VocabularyFilterName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateVocabularyFilter where
+  hashWithSalt _salt UpdateVocabularyFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` vocabularyFilterFileUri
+      `Prelude.hashWithSalt` words
+      `Prelude.hashWithSalt` vocabularyFilterName
+
+instance Prelude.NFData UpdateVocabularyFilter where
+  rnf UpdateVocabularyFilter' {..} =
+    Prelude.rnf vocabularyFilterFileUri
+      `Prelude.seq` Prelude.rnf words
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+
+instance Data.ToHeaders UpdateVocabularyFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "Transcribe.UpdateVocabularyFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateVocabularyFilter where
+  toJSON UpdateVocabularyFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("VocabularyFilterFileUri" Data..=)
+              Prelude.<$> vocabularyFilterFileUri,
+            ("Words" Data..=) Prelude.<$> words,
+            Prelude.Just
+              ( "VocabularyFilterName"
+                  Data..= vocabularyFilterName
+              )
+          ]
+      )
+
+instance Data.ToPath UpdateVocabularyFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateVocabularyFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateVocabularyFilterResponse' smart constructor.
+data UpdateVocabularyFilterResponse = UpdateVocabularyFilterResponse'
+  { -- | The language code you selected for your custom vocabulary filter.
+    languageCode :: Prelude.Maybe LanguageCode,
+    -- | The date and time the specified custom vocabulary filter was last
+    -- updated.
+    --
+    -- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+    -- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+    -- May 4, 2022.
+    lastModifiedTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the updated custom vocabulary filter.
+    vocabularyFilterName :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateVocabularyFilterResponse' 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:
+--
+-- 'languageCode', 'updateVocabularyFilterResponse_languageCode' - The language code you selected for your custom vocabulary filter.
+--
+-- 'lastModifiedTime', 'updateVocabularyFilterResponse_lastModifiedTime' - The date and time the specified custom vocabulary filter was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+--
+-- 'vocabularyFilterName', 'updateVocabularyFilterResponse_vocabularyFilterName' - The name of the updated custom vocabulary filter.
+--
+-- 'httpStatus', 'updateVocabularyFilterResponse_httpStatus' - The response's http status code.
+newUpdateVocabularyFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateVocabularyFilterResponse
+newUpdateVocabularyFilterResponse pHttpStatus_ =
+  UpdateVocabularyFilterResponse'
+    { languageCode =
+        Prelude.Nothing,
+      lastModifiedTime = Prelude.Nothing,
+      vocabularyFilterName = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The language code you selected for your custom vocabulary filter.
+updateVocabularyFilterResponse_languageCode :: Lens.Lens' UpdateVocabularyFilterResponse (Prelude.Maybe LanguageCode)
+updateVocabularyFilterResponse_languageCode = Lens.lens (\UpdateVocabularyFilterResponse' {languageCode} -> languageCode) (\s@UpdateVocabularyFilterResponse' {} a -> s {languageCode = a} :: UpdateVocabularyFilterResponse)
+
+-- | The date and time the specified custom vocabulary filter was last
+-- updated.
+--
+-- Timestamps are in the format @YYYY-MM-DD\'T\'HH:MM:SS.SSSSSS-UTC@. For
+-- example, @2022-05-04T12:32:58.761000-07:00@ represents 12:32 PM UTC-7 on
+-- May 4, 2022.
+updateVocabularyFilterResponse_lastModifiedTime :: Lens.Lens' UpdateVocabularyFilterResponse (Prelude.Maybe Prelude.UTCTime)
+updateVocabularyFilterResponse_lastModifiedTime = Lens.lens (\UpdateVocabularyFilterResponse' {lastModifiedTime} -> lastModifiedTime) (\s@UpdateVocabularyFilterResponse' {} a -> s {lastModifiedTime = a} :: UpdateVocabularyFilterResponse) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the updated custom vocabulary filter.
+updateVocabularyFilterResponse_vocabularyFilterName :: Lens.Lens' UpdateVocabularyFilterResponse (Prelude.Maybe Prelude.Text)
+updateVocabularyFilterResponse_vocabularyFilterName = Lens.lens (\UpdateVocabularyFilterResponse' {vocabularyFilterName} -> vocabularyFilterName) (\s@UpdateVocabularyFilterResponse' {} a -> s {vocabularyFilterName = a} :: UpdateVocabularyFilterResponse)
+
+-- | The response's http status code.
+updateVocabularyFilterResponse_httpStatus :: Lens.Lens' UpdateVocabularyFilterResponse Prelude.Int
+updateVocabularyFilterResponse_httpStatus = Lens.lens (\UpdateVocabularyFilterResponse' {httpStatus} -> httpStatus) (\s@UpdateVocabularyFilterResponse' {} a -> s {httpStatus = a} :: UpdateVocabularyFilterResponse)
+
+instance
+  Prelude.NFData
+    UpdateVocabularyFilterResponse
+  where
+  rnf UpdateVocabularyFilterResponse' {..} =
+    Prelude.rnf languageCode
+      `Prelude.seq` Prelude.rnf lastModifiedTime
+      `Prelude.seq` Prelude.rnf vocabularyFilterName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Transcribe/Waiters.hs b/gen/Amazonka/Transcribe/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Transcribe/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.Transcribe.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.Transcribe.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.Transcribe.Lens
+import Amazonka.Transcribe.Types
diff --git a/gen/Network/AWS/Transcribe.hs b/gen/Network/AWS/Transcribe.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe.hs
+++ /dev/null
@@ -1,174 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports    #-}
-{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Operations and objects for transcribing speech to text.
---
---
-module Network.AWS.Transcribe
-    (
-    -- * Service Configuration
-      transcribe
-
-    -- * Errors
-    -- $errors
-
-    -- ** ConflictException
-    , _ConflictException
-
-    -- ** NotFoundException
-    , _NotFoundException
-
-    -- ** InternalFailureException
-    , _InternalFailureException
-
-    -- ** BadRequestException
-    , _BadRequestException
-
-    -- ** LimitExceededException
-    , _LimitExceededException
-
-    -- * Waiters
-    -- $waiters
-
-    -- * Operations
-    -- $operations
-
-    -- ** GetVocabulary
-    , module Network.AWS.Transcribe.GetVocabulary
-
-    -- ** GetTranscriptionJob
-    , module Network.AWS.Transcribe.GetTranscriptionJob
-
-    -- ** DeleteVocabulary
-    , module Network.AWS.Transcribe.DeleteVocabulary
-
-    -- ** UpdateVocabulary
-    , module Network.AWS.Transcribe.UpdateVocabulary
-
-    -- ** ListTranscriptionJobs
-    , module Network.AWS.Transcribe.ListTranscriptionJobs
-
-    -- ** ListVocabularies
-    , module Network.AWS.Transcribe.ListVocabularies
-
-    -- ** CreateVocabulary
-    , module Network.AWS.Transcribe.CreateVocabulary
-
-    -- ** StartTranscriptionJob
-    , module Network.AWS.Transcribe.StartTranscriptionJob
-
-    -- * Types
-
-    -- ** LanguageCode
-    , LanguageCode (..)
-
-    -- ** MediaFormat
-    , MediaFormat (..)
-
-    -- ** TranscriptionJobStatus
-    , TranscriptionJobStatus (..)
-
-    -- ** VocabularyState
-    , VocabularyState (..)
-
-    -- ** Media
-    , Media
-    , media
-    , mMediaFileURI
-
-    -- ** Settings
-    , Settings
-    , settings
-    , sVocabularyName
-    , sMaxSpeakerLabels
-    , sShowSpeakerLabels
-
-    -- ** Transcript
-    , Transcript
-    , transcript
-    , tTranscriptFileURI
-
-    -- ** TranscriptionJob
-    , TranscriptionJob
-    , transcriptionJob
-    , tjCreationTime
-    , tjFailureReason
-    , tjLanguageCode
-    , tjSettings
-    , tjCompletionTime
-    , tjMedia
-    , tjMediaFormat
-    , tjTranscriptionJobStatus
-    , tjTranscriptionJobName
-    , tjTranscript
-    , tjMediaSampleRateHertz
-
-    -- ** TranscriptionJobSummary
-    , TranscriptionJobSummary
-    , transcriptionJobSummary
-    , tjsCreationTime
-    , tjsFailureReason
-    , tjsLanguageCode
-    , tjsCompletionTime
-    , tjsTranscriptionJobStatus
-    , tjsTranscriptionJobName
-
-    -- ** VocabularyInfo
-    , VocabularyInfo
-    , vocabularyInfo
-    , viLanguageCode
-    , viVocabularyName
-    , viLastModifiedTime
-    , viVocabularyState
-    ) where
-
-import Network.AWS.Transcribe.CreateVocabulary
-import Network.AWS.Transcribe.DeleteVocabulary
-import Network.AWS.Transcribe.GetTranscriptionJob
-import Network.AWS.Transcribe.GetVocabulary
-import Network.AWS.Transcribe.ListTranscriptionJobs
-import Network.AWS.Transcribe.ListVocabularies
-import Network.AWS.Transcribe.StartTranscriptionJob
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.UpdateVocabulary
-import Network.AWS.Transcribe.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 'Transcribe'.
--}
-
-{- $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/Network/AWS/Transcribe/CreateVocabulary.hs b/gen/Network/AWS/Transcribe/CreateVocabulary.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/CreateVocabulary.hs
+++ /dev/null
@@ -1,198 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.CreateVocabulary
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Creates a new custom vocabulary that you can use to change the way Amazon Transcribe handles transcription of an audio file.
---
---
-module Network.AWS.Transcribe.CreateVocabulary
-    (
-    -- * Creating a Request
-      createVocabulary
-    , CreateVocabulary
-    -- * Request Lenses
-    , cvVocabularyName
-    , cvLanguageCode
-    , cvPhrases
-
-    -- * Destructuring the Response
-    , createVocabularyResponse
-    , CreateVocabularyResponse
-    -- * Response Lenses
-    , cvrsFailureReason
-    , cvrsLanguageCode
-    , cvrsVocabularyName
-    , cvrsLastModifiedTime
-    , cvrsVocabularyState
-    , cvrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'createVocabulary' smart constructor.
-data CreateVocabulary = CreateVocabulary'
-  { _cvVocabularyName :: !Text
-  , _cvLanguageCode   :: !LanguageCode
-  , _cvPhrases        :: ![Text]
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CreateVocabulary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'cvVocabularyName' - The name of the vocabulary. The name must be unique within an AWS account. The name is case-sensitive.
---
--- * 'cvLanguageCode' - The language code of the vocabulary entries.
---
--- * 'cvPhrases' - An array of strings that contains the vocabulary entries.
-createVocabulary
-    :: Text -- ^ 'cvVocabularyName'
-    -> LanguageCode -- ^ 'cvLanguageCode'
-    -> CreateVocabulary
-createVocabulary pVocabularyName_ pLanguageCode_ =
-  CreateVocabulary'
-    { _cvVocabularyName = pVocabularyName_
-    , _cvLanguageCode = pLanguageCode_
-    , _cvPhrases = mempty
-    }
-
-
--- | The name of the vocabulary. The name must be unique within an AWS account. The name is case-sensitive.
-cvVocabularyName :: Lens' CreateVocabulary Text
-cvVocabularyName = lens _cvVocabularyName (\ s a -> s{_cvVocabularyName = a})
-
--- | The language code of the vocabulary entries.
-cvLanguageCode :: Lens' CreateVocabulary LanguageCode
-cvLanguageCode = lens _cvLanguageCode (\ s a -> s{_cvLanguageCode = a})
-
--- | An array of strings that contains the vocabulary entries.
-cvPhrases :: Lens' CreateVocabulary [Text]
-cvPhrases = lens _cvPhrases (\ s a -> s{_cvPhrases = a}) . _Coerce
-
-instance AWSRequest CreateVocabulary where
-        type Rs CreateVocabulary = CreateVocabularyResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 CreateVocabularyResponse' <$>
-                   (x .?> "FailureReason") <*> (x .?> "LanguageCode")
-                     <*> (x .?> "VocabularyName")
-                     <*> (x .?> "LastModifiedTime")
-                     <*> (x .?> "VocabularyState")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable CreateVocabulary where
-
-instance NFData CreateVocabulary where
-
-instance ToHeaders CreateVocabulary where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.CreateVocabulary" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON CreateVocabulary where
-        toJSON CreateVocabulary'{..}
-          = object
-              (catMaybes
-                 [Just ("VocabularyName" .= _cvVocabularyName),
-                  Just ("LanguageCode" .= _cvLanguageCode),
-                  Just ("Phrases" .= _cvPhrases)])
-
-instance ToPath CreateVocabulary where
-        toPath = const "/"
-
-instance ToQuery CreateVocabulary where
-        toQuery = const mempty
-
--- | /See:/ 'createVocabularyResponse' smart constructor.
-data CreateVocabularyResponse = CreateVocabularyResponse'
-  { _cvrsFailureReason    :: !(Maybe Text)
-  , _cvrsLanguageCode     :: !(Maybe LanguageCode)
-  , _cvrsVocabularyName   :: !(Maybe Text)
-  , _cvrsLastModifiedTime :: !(Maybe POSIX)
-  , _cvrsVocabularyState  :: !(Maybe VocabularyState)
-  , _cvrsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'CreateVocabularyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'cvrsFailureReason' - If the @VocabularyState@ field is @FAILED@ , this field contains information about why the job failed.
---
--- * 'cvrsLanguageCode' - The language code of the vocabulary entries.
---
--- * 'cvrsVocabularyName' - The name of the vocabulary.
---
--- * 'cvrsLastModifiedTime' - The date and time that the vocabulary was created.
---
--- * 'cvrsVocabularyState' - The processing state of the vocabulary. When the @VocabularyState@ field contains @READY@ the vocabulary is ready to be used in a @StartTranscriptionJob@ request.
---
--- * 'cvrsResponseStatus' - -- | The response status code.
-createVocabularyResponse
-    :: Int -- ^ 'cvrsResponseStatus'
-    -> CreateVocabularyResponse
-createVocabularyResponse pResponseStatus_ =
-  CreateVocabularyResponse'
-    { _cvrsFailureReason = Nothing
-    , _cvrsLanguageCode = Nothing
-    , _cvrsVocabularyName = Nothing
-    , _cvrsLastModifiedTime = Nothing
-    , _cvrsVocabularyState = Nothing
-    , _cvrsResponseStatus = pResponseStatus_
-    }
-
-
--- | If the @VocabularyState@ field is @FAILED@ , this field contains information about why the job failed.
-cvrsFailureReason :: Lens' CreateVocabularyResponse (Maybe Text)
-cvrsFailureReason = lens _cvrsFailureReason (\ s a -> s{_cvrsFailureReason = a})
-
--- | The language code of the vocabulary entries.
-cvrsLanguageCode :: Lens' CreateVocabularyResponse (Maybe LanguageCode)
-cvrsLanguageCode = lens _cvrsLanguageCode (\ s a -> s{_cvrsLanguageCode = a})
-
--- | The name of the vocabulary.
-cvrsVocabularyName :: Lens' CreateVocabularyResponse (Maybe Text)
-cvrsVocabularyName = lens _cvrsVocabularyName (\ s a -> s{_cvrsVocabularyName = a})
-
--- | The date and time that the vocabulary was created.
-cvrsLastModifiedTime :: Lens' CreateVocabularyResponse (Maybe UTCTime)
-cvrsLastModifiedTime = lens _cvrsLastModifiedTime (\ s a -> s{_cvrsLastModifiedTime = a}) . mapping _Time
-
--- | The processing state of the vocabulary. When the @VocabularyState@ field contains @READY@ the vocabulary is ready to be used in a @StartTranscriptionJob@ request.
-cvrsVocabularyState :: Lens' CreateVocabularyResponse (Maybe VocabularyState)
-cvrsVocabularyState = lens _cvrsVocabularyState (\ s a -> s{_cvrsVocabularyState = a})
-
--- | -- | The response status code.
-cvrsResponseStatus :: Lens' CreateVocabularyResponse Int
-cvrsResponseStatus = lens _cvrsResponseStatus (\ s a -> s{_cvrsResponseStatus = a})
-
-instance NFData CreateVocabularyResponse where
diff --git a/gen/Network/AWS/Transcribe/DeleteVocabulary.hs b/gen/Network/AWS/Transcribe/DeleteVocabulary.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/DeleteVocabulary.hs
+++ /dev/null
@@ -1,109 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.DeleteVocabulary
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Deletes a vocabulary from Amazon Transcribe.
---
---
-module Network.AWS.Transcribe.DeleteVocabulary
-    (
-    -- * Creating a Request
-      deleteVocabulary
-    , DeleteVocabulary
-    -- * Request Lenses
-    , dvVocabularyName
-
-    -- * Destructuring the Response
-    , deleteVocabularyResponse
-    , DeleteVocabularyResponse
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'deleteVocabulary' smart constructor.
-newtype DeleteVocabulary = DeleteVocabulary'
-  { _dvVocabularyName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteVocabulary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'dvVocabularyName' - The name of the vocabulary to delete.
-deleteVocabulary
-    :: Text -- ^ 'dvVocabularyName'
-    -> DeleteVocabulary
-deleteVocabulary pVocabularyName_ =
-  DeleteVocabulary' {_dvVocabularyName = pVocabularyName_}
-
-
--- | The name of the vocabulary to delete.
-dvVocabularyName :: Lens' DeleteVocabulary Text
-dvVocabularyName = lens _dvVocabularyName (\ s a -> s{_dvVocabularyName = a})
-
-instance AWSRequest DeleteVocabulary where
-        type Rs DeleteVocabulary = DeleteVocabularyResponse
-        request = postJSON transcribe
-        response = receiveNull DeleteVocabularyResponse'
-
-instance Hashable DeleteVocabulary where
-
-instance NFData DeleteVocabulary where
-
-instance ToHeaders DeleteVocabulary where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.DeleteVocabulary" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON DeleteVocabulary where
-        toJSON DeleteVocabulary'{..}
-          = object
-              (catMaybes
-                 [Just ("VocabularyName" .= _dvVocabularyName)])
-
-instance ToPath DeleteVocabulary where
-        toPath = const "/"
-
-instance ToQuery DeleteVocabulary where
-        toQuery = const mempty
-
--- | /See:/ 'deleteVocabularyResponse' smart constructor.
-data DeleteVocabularyResponse =
-  DeleteVocabularyResponse'
-  deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'DeleteVocabularyResponse' with the minimum fields required to make a request.
---
-deleteVocabularyResponse
-    :: DeleteVocabularyResponse
-deleteVocabularyResponse = DeleteVocabularyResponse'
-
-
-instance NFData DeleteVocabularyResponse where
diff --git a/gen/Network/AWS/Transcribe/GetTranscriptionJob.hs b/gen/Network/AWS/Transcribe/GetTranscriptionJob.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/GetTranscriptionJob.hs
+++ /dev/null
@@ -1,136 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.GetTranscriptionJob
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns information about a transcription job. To see the status of the job, check the @TranscriptionJobStatus@ field. If the status is @COMPLETED@ , the job is finished and you can find the results at the location specified in the @TranscriptionFileUri@ field.
---
---
-module Network.AWS.Transcribe.GetTranscriptionJob
-    (
-    -- * Creating a Request
-      getTranscriptionJob
-    , GetTranscriptionJob
-    -- * Request Lenses
-    , gtjTranscriptionJobName
-
-    -- * Destructuring the Response
-    , getTranscriptionJobResponse
-    , GetTranscriptionJobResponse
-    -- * Response Lenses
-    , gtjrsTranscriptionJob
-    , gtjrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'getTranscriptionJob' smart constructor.
-newtype GetTranscriptionJob = GetTranscriptionJob'
-  { _gtjTranscriptionJobName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetTranscriptionJob' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gtjTranscriptionJobName' - The name of the job.
-getTranscriptionJob
-    :: Text -- ^ 'gtjTranscriptionJobName'
-    -> GetTranscriptionJob
-getTranscriptionJob pTranscriptionJobName_ =
-  GetTranscriptionJob' {_gtjTranscriptionJobName = pTranscriptionJobName_}
-
-
--- | The name of the job.
-gtjTranscriptionJobName :: Lens' GetTranscriptionJob Text
-gtjTranscriptionJobName = lens _gtjTranscriptionJobName (\ s a -> s{_gtjTranscriptionJobName = a})
-
-instance AWSRequest GetTranscriptionJob where
-        type Rs GetTranscriptionJob =
-             GetTranscriptionJobResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetTranscriptionJobResponse' <$>
-                   (x .?> "TranscriptionJob") <*> (pure (fromEnum s)))
-
-instance Hashable GetTranscriptionJob where
-
-instance NFData GetTranscriptionJob where
-
-instance ToHeaders GetTranscriptionJob where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.GetTranscriptionJob" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetTranscriptionJob where
-        toJSON GetTranscriptionJob'{..}
-          = object
-              (catMaybes
-                 [Just
-                    ("TranscriptionJobName" .=
-                       _gtjTranscriptionJobName)])
-
-instance ToPath GetTranscriptionJob where
-        toPath = const "/"
-
-instance ToQuery GetTranscriptionJob where
-        toQuery = const mempty
-
--- | /See:/ 'getTranscriptionJobResponse' smart constructor.
-data GetTranscriptionJobResponse = GetTranscriptionJobResponse'
-  { _gtjrsTranscriptionJob :: !(Maybe TranscriptionJob)
-  , _gtjrsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetTranscriptionJobResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gtjrsTranscriptionJob' - An object that contains the results of the transcription job.
---
--- * 'gtjrsResponseStatus' - -- | The response status code.
-getTranscriptionJobResponse
-    :: Int -- ^ 'gtjrsResponseStatus'
-    -> GetTranscriptionJobResponse
-getTranscriptionJobResponse pResponseStatus_ =
-  GetTranscriptionJobResponse'
-    {_gtjrsTranscriptionJob = Nothing, _gtjrsResponseStatus = pResponseStatus_}
-
-
--- | An object that contains the results of the transcription job.
-gtjrsTranscriptionJob :: Lens' GetTranscriptionJobResponse (Maybe TranscriptionJob)
-gtjrsTranscriptionJob = lens _gtjrsTranscriptionJob (\ s a -> s{_gtjrsTranscriptionJob = a})
-
--- | -- | The response status code.
-gtjrsResponseStatus :: Lens' GetTranscriptionJobResponse Int
-gtjrsResponseStatus = lens _gtjrsResponseStatus (\ s a -> s{_gtjrsResponseStatus = a})
-
-instance NFData GetTranscriptionJobResponse where
diff --git a/gen/Network/AWS/Transcribe/GetVocabulary.hs b/gen/Network/AWS/Transcribe/GetVocabulary.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/GetVocabulary.hs
+++ /dev/null
@@ -1,185 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.GetVocabulary
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Gets information about a vocabulary.
---
---
-module Network.AWS.Transcribe.GetVocabulary
-    (
-    -- * Creating a Request
-      getVocabulary
-    , GetVocabulary
-    -- * Request Lenses
-    , gvVocabularyName
-
-    -- * Destructuring the Response
-    , getVocabularyResponse
-    , GetVocabularyResponse
-    -- * Response Lenses
-    , gvrsFailureReason
-    , gvrsLanguageCode
-    , gvrsDownloadURI
-    , gvrsVocabularyName
-    , gvrsLastModifiedTime
-    , gvrsVocabularyState
-    , gvrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'getVocabulary' smart constructor.
-newtype GetVocabulary = GetVocabulary'
-  { _gvVocabularyName :: Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetVocabulary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gvVocabularyName' - The name of the vocabulary to return information about. The name is case-sensitive.
-getVocabulary
-    :: Text -- ^ 'gvVocabularyName'
-    -> GetVocabulary
-getVocabulary pVocabularyName_ =
-  GetVocabulary' {_gvVocabularyName = pVocabularyName_}
-
-
--- | The name of the vocabulary to return information about. The name is case-sensitive.
-gvVocabularyName :: Lens' GetVocabulary Text
-gvVocabularyName = lens _gvVocabularyName (\ s a -> s{_gvVocabularyName = a})
-
-instance AWSRequest GetVocabulary where
-        type Rs GetVocabulary = GetVocabularyResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 GetVocabularyResponse' <$>
-                   (x .?> "FailureReason") <*> (x .?> "LanguageCode")
-                     <*> (x .?> "DownloadUri")
-                     <*> (x .?> "VocabularyName")
-                     <*> (x .?> "LastModifiedTime")
-                     <*> (x .?> "VocabularyState")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable GetVocabulary where
-
-instance NFData GetVocabulary where
-
-instance ToHeaders GetVocabulary where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.GetVocabulary" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON GetVocabulary where
-        toJSON GetVocabulary'{..}
-          = object
-              (catMaybes
-                 [Just ("VocabularyName" .= _gvVocabularyName)])
-
-instance ToPath GetVocabulary where
-        toPath = const "/"
-
-instance ToQuery GetVocabulary where
-        toQuery = const mempty
-
--- | /See:/ 'getVocabularyResponse' smart constructor.
-data GetVocabularyResponse = GetVocabularyResponse'
-  { _gvrsFailureReason    :: !(Maybe Text)
-  , _gvrsLanguageCode     :: !(Maybe LanguageCode)
-  , _gvrsDownloadURI      :: !(Maybe Text)
-  , _gvrsVocabularyName   :: !(Maybe Text)
-  , _gvrsLastModifiedTime :: !(Maybe POSIX)
-  , _gvrsVocabularyState  :: !(Maybe VocabularyState)
-  , _gvrsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'GetVocabularyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'gvrsFailureReason' - If the @VocabularyState@ field is @FAILED@ , this field contains information about why the job failed.
---
--- * 'gvrsLanguageCode' - The language code of the vocabulary entries.
---
--- * 'gvrsDownloadURI' - The S3 location where the vocabulary is stored. Use this URI to get the contents of the vocabulary. The URI is available for a limited time.
---
--- * 'gvrsVocabularyName' - The name of the vocabulary to return.
---
--- * 'gvrsLastModifiedTime' - The date and time that the vocabulary was last modified.
---
--- * 'gvrsVocabularyState' - The processing state of the vocabulary.
---
--- * 'gvrsResponseStatus' - -- | The response status code.
-getVocabularyResponse
-    :: Int -- ^ 'gvrsResponseStatus'
-    -> GetVocabularyResponse
-getVocabularyResponse pResponseStatus_ =
-  GetVocabularyResponse'
-    { _gvrsFailureReason = Nothing
-    , _gvrsLanguageCode = Nothing
-    , _gvrsDownloadURI = Nothing
-    , _gvrsVocabularyName = Nothing
-    , _gvrsLastModifiedTime = Nothing
-    , _gvrsVocabularyState = Nothing
-    , _gvrsResponseStatus = pResponseStatus_
-    }
-
-
--- | If the @VocabularyState@ field is @FAILED@ , this field contains information about why the job failed.
-gvrsFailureReason :: Lens' GetVocabularyResponse (Maybe Text)
-gvrsFailureReason = lens _gvrsFailureReason (\ s a -> s{_gvrsFailureReason = a})
-
--- | The language code of the vocabulary entries.
-gvrsLanguageCode :: Lens' GetVocabularyResponse (Maybe LanguageCode)
-gvrsLanguageCode = lens _gvrsLanguageCode (\ s a -> s{_gvrsLanguageCode = a})
-
--- | The S3 location where the vocabulary is stored. Use this URI to get the contents of the vocabulary. The URI is available for a limited time.
-gvrsDownloadURI :: Lens' GetVocabularyResponse (Maybe Text)
-gvrsDownloadURI = lens _gvrsDownloadURI (\ s a -> s{_gvrsDownloadURI = a})
-
--- | The name of the vocabulary to return.
-gvrsVocabularyName :: Lens' GetVocabularyResponse (Maybe Text)
-gvrsVocabularyName = lens _gvrsVocabularyName (\ s a -> s{_gvrsVocabularyName = a})
-
--- | The date and time that the vocabulary was last modified.
-gvrsLastModifiedTime :: Lens' GetVocabularyResponse (Maybe UTCTime)
-gvrsLastModifiedTime = lens _gvrsLastModifiedTime (\ s a -> s{_gvrsLastModifiedTime = a}) . mapping _Time
-
--- | The processing state of the vocabulary.
-gvrsVocabularyState :: Lens' GetVocabularyResponse (Maybe VocabularyState)
-gvrsVocabularyState = lens _gvrsVocabularyState (\ s a -> s{_gvrsVocabularyState = a})
-
--- | -- | The response status code.
-gvrsResponseStatus :: Lens' GetVocabularyResponse Int
-gvrsResponseStatus = lens _gvrsResponseStatus (\ s a -> s{_gvrsResponseStatus = a})
-
-instance NFData GetVocabularyResponse where
diff --git a/gen/Network/AWS/Transcribe/ListTranscriptionJobs.hs b/gen/Network/AWS/Transcribe/ListTranscriptionJobs.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/ListTranscriptionJobs.hs
+++ /dev/null
@@ -1,187 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.ListTranscriptionJobs
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Lists transcription jobs with the specified status.
---
---
-module Network.AWS.Transcribe.ListTranscriptionJobs
-    (
-    -- * Creating a Request
-      listTranscriptionJobs
-    , ListTranscriptionJobs
-    -- * Request Lenses
-    , ltjStatus
-    , ltjNextToken
-    , ltjJobNameContains
-    , ltjMaxResults
-
-    -- * Destructuring the Response
-    , listTranscriptionJobsResponse
-    , ListTranscriptionJobsResponse
-    -- * Response Lenses
-    , ltjrsStatus
-    , ltjrsNextToken
-    , ltjrsTranscriptionJobSummaries
-    , ltjrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'listTranscriptionJobs' smart constructor.
-data ListTranscriptionJobs = ListTranscriptionJobs'
-  { _ltjStatus          :: !(Maybe TranscriptionJobStatus)
-  , _ltjNextToken       :: !(Maybe Text)
-  , _ltjJobNameContains :: !(Maybe Text)
-  , _ltjMaxResults      :: !(Maybe Nat)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListTranscriptionJobs' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ltjStatus' - When specified, returns only transcription jobs with the specified status.
---
--- * 'ltjNextToken' - If the result of the previous request to @ListTranscriptionJobs@ was truncated, include the @NextToken@ to fetch the next set of jobs.
---
--- * 'ltjJobNameContains' - When specified, the jobs returned in the list are limited to jobs whose name contains the specified string.
---
--- * 'ltjMaxResults' - The maximum number of jobs to return in the response. If there are fewer results in the list, this response contains only the actual results.
-listTranscriptionJobs
-    :: ListTranscriptionJobs
-listTranscriptionJobs =
-  ListTranscriptionJobs'
-    { _ltjStatus = Nothing
-    , _ltjNextToken = Nothing
-    , _ltjJobNameContains = Nothing
-    , _ltjMaxResults = Nothing
-    }
-
-
--- | When specified, returns only transcription jobs with the specified status.
-ltjStatus :: Lens' ListTranscriptionJobs (Maybe TranscriptionJobStatus)
-ltjStatus = lens _ltjStatus (\ s a -> s{_ltjStatus = a})
-
--- | If the result of the previous request to @ListTranscriptionJobs@ was truncated, include the @NextToken@ to fetch the next set of jobs.
-ltjNextToken :: Lens' ListTranscriptionJobs (Maybe Text)
-ltjNextToken = lens _ltjNextToken (\ s a -> s{_ltjNextToken = a})
-
--- | When specified, the jobs returned in the list are limited to jobs whose name contains the specified string.
-ltjJobNameContains :: Lens' ListTranscriptionJobs (Maybe Text)
-ltjJobNameContains = lens _ltjJobNameContains (\ s a -> s{_ltjJobNameContains = a})
-
--- | The maximum number of jobs to return in the response. If there are fewer results in the list, this response contains only the actual results.
-ltjMaxResults :: Lens' ListTranscriptionJobs (Maybe Natural)
-ltjMaxResults = lens _ltjMaxResults (\ s a -> s{_ltjMaxResults = a}) . mapping _Nat
-
-instance AWSRequest ListTranscriptionJobs where
-        type Rs ListTranscriptionJobs =
-             ListTranscriptionJobsResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 ListTranscriptionJobsResponse' <$>
-                   (x .?> "Status") <*> (x .?> "NextToken") <*>
-                     (x .?> "TranscriptionJobSummaries" .!@ mempty)
-                     <*> (pure (fromEnum s)))
-
-instance Hashable ListTranscriptionJobs where
-
-instance NFData ListTranscriptionJobs where
-
-instance ToHeaders ListTranscriptionJobs where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.ListTranscriptionJobs" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON ListTranscriptionJobs where
-        toJSON ListTranscriptionJobs'{..}
-          = object
-              (catMaybes
-                 [("Status" .=) <$> _ltjStatus,
-                  ("NextToken" .=) <$> _ltjNextToken,
-                  ("JobNameContains" .=) <$> _ltjJobNameContains,
-                  ("MaxResults" .=) <$> _ltjMaxResults])
-
-instance ToPath ListTranscriptionJobs where
-        toPath = const "/"
-
-instance ToQuery ListTranscriptionJobs where
-        toQuery = const mempty
-
--- | /See:/ 'listTranscriptionJobsResponse' smart constructor.
-data ListTranscriptionJobsResponse = ListTranscriptionJobsResponse'
-  { _ltjrsStatus                    :: !(Maybe TranscriptionJobStatus)
-  , _ltjrsNextToken                 :: !(Maybe Text)
-  , _ltjrsTranscriptionJobSummaries :: !(Maybe [TranscriptionJobSummary])
-  , _ltjrsResponseStatus            :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListTranscriptionJobsResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'ltjrsStatus' - The requested status of the jobs returned.
---
--- * 'ltjrsNextToken' - The @ListTranscriptionJobs@ operation returns a page of jobs at a time. The maximum size of the page is set by the @MaxResults@ parameter. If there are more jobs in the list than the page size, Amazon Transcribe returns the @NextPage@ token. Include the token in the next request to the @ListTranscriptionJobs@ operation to return in the next page of jobs.
---
--- * 'ltjrsTranscriptionJobSummaries' - A list of objects containing summary information for a transcription job.
---
--- * 'ltjrsResponseStatus' - -- | The response status code.
-listTranscriptionJobsResponse
-    :: Int -- ^ 'ltjrsResponseStatus'
-    -> ListTranscriptionJobsResponse
-listTranscriptionJobsResponse pResponseStatus_ =
-  ListTranscriptionJobsResponse'
-    { _ltjrsStatus = Nothing
-    , _ltjrsNextToken = Nothing
-    , _ltjrsTranscriptionJobSummaries = Nothing
-    , _ltjrsResponseStatus = pResponseStatus_
-    }
-
-
--- | The requested status of the jobs returned.
-ltjrsStatus :: Lens' ListTranscriptionJobsResponse (Maybe TranscriptionJobStatus)
-ltjrsStatus = lens _ltjrsStatus (\ s a -> s{_ltjrsStatus = a})
-
--- | The @ListTranscriptionJobs@ operation returns a page of jobs at a time. The maximum size of the page is set by the @MaxResults@ parameter. If there are more jobs in the list than the page size, Amazon Transcribe returns the @NextPage@ token. Include the token in the next request to the @ListTranscriptionJobs@ operation to return in the next page of jobs.
-ltjrsNextToken :: Lens' ListTranscriptionJobsResponse (Maybe Text)
-ltjrsNextToken = lens _ltjrsNextToken (\ s a -> s{_ltjrsNextToken = a})
-
--- | A list of objects containing summary information for a transcription job.
-ltjrsTranscriptionJobSummaries :: Lens' ListTranscriptionJobsResponse [TranscriptionJobSummary]
-ltjrsTranscriptionJobSummaries = lens _ltjrsTranscriptionJobSummaries (\ s a -> s{_ltjrsTranscriptionJobSummaries = a}) . _Default . _Coerce
-
--- | -- | The response status code.
-ltjrsResponseStatus :: Lens' ListTranscriptionJobsResponse Int
-ltjrsResponseStatus = lens _ltjrsResponseStatus (\ s a -> s{_ltjrsResponseStatus = a})
-
-instance NFData ListTranscriptionJobsResponse where
diff --git a/gen/Network/AWS/Transcribe/ListVocabularies.hs b/gen/Network/AWS/Transcribe/ListVocabularies.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/ListVocabularies.hs
+++ /dev/null
@@ -1,187 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.ListVocabularies
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Returns a list of vocabularies that match the specified criteria. If no criteria are specified, returns the entire list of vocabularies.
---
---
-module Network.AWS.Transcribe.ListVocabularies
-    (
-    -- * Creating a Request
-      listVocabularies
-    , ListVocabularies
-    -- * Request Lenses
-    , lvNameContains
-    , lvNextToken
-    , lvStateEquals
-    , lvMaxResults
-
-    -- * Destructuring the Response
-    , listVocabulariesResponse
-    , ListVocabulariesResponse
-    -- * Response Lenses
-    , lvrsVocabularies
-    , lvrsStatus
-    , lvrsNextToken
-    , lvrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'listVocabularies' smart constructor.
-data ListVocabularies = ListVocabularies'
-  { _lvNameContains :: !(Maybe Text)
-  , _lvNextToken    :: !(Maybe Text)
-  , _lvStateEquals  :: !(Maybe VocabularyState)
-  , _lvMaxResults   :: !(Maybe Nat)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListVocabularies' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lvNameContains' - When specified, the vocabularies returned in the list are limited to vocabularies whose name contains the specified string. The search is case-insensitive, @ListVocabularies@ will return both "vocabularyname" and "VocabularyName" in the response list.
---
--- * 'lvNextToken' - If the result of the previous request to @ListVocabularies@ was truncated, include the @NextToken@ to fetch the next set of jobs.
---
--- * 'lvStateEquals' - When specified, only returns vocabularies with the @VocabularyState@ field equal to the specified state.
---
--- * 'lvMaxResults' - The maximum number of vocabularies to return in the response. If there are fewer results in the list, this response contains only the actual results.
-listVocabularies
-    :: ListVocabularies
-listVocabularies =
-  ListVocabularies'
-    { _lvNameContains = Nothing
-    , _lvNextToken = Nothing
-    , _lvStateEquals = Nothing
-    , _lvMaxResults = Nothing
-    }
-
-
--- | When specified, the vocabularies returned in the list are limited to vocabularies whose name contains the specified string. The search is case-insensitive, @ListVocabularies@ will return both "vocabularyname" and "VocabularyName" in the response list.
-lvNameContains :: Lens' ListVocabularies (Maybe Text)
-lvNameContains = lens _lvNameContains (\ s a -> s{_lvNameContains = a})
-
--- | If the result of the previous request to @ListVocabularies@ was truncated, include the @NextToken@ to fetch the next set of jobs.
-lvNextToken :: Lens' ListVocabularies (Maybe Text)
-lvNextToken = lens _lvNextToken (\ s a -> s{_lvNextToken = a})
-
--- | When specified, only returns vocabularies with the @VocabularyState@ field equal to the specified state.
-lvStateEquals :: Lens' ListVocabularies (Maybe VocabularyState)
-lvStateEquals = lens _lvStateEquals (\ s a -> s{_lvStateEquals = a})
-
--- | The maximum number of vocabularies to return in the response. If there are fewer results in the list, this response contains only the actual results.
-lvMaxResults :: Lens' ListVocabularies (Maybe Natural)
-lvMaxResults = lens _lvMaxResults (\ s a -> s{_lvMaxResults = a}) . mapping _Nat
-
-instance AWSRequest ListVocabularies where
-        type Rs ListVocabularies = ListVocabulariesResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 ListVocabulariesResponse' <$>
-                   (x .?> "Vocabularies" .!@ mempty) <*>
-                     (x .?> "Status")
-                     <*> (x .?> "NextToken")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable ListVocabularies where
-
-instance NFData ListVocabularies where
-
-instance ToHeaders ListVocabularies where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.ListVocabularies" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON ListVocabularies where
-        toJSON ListVocabularies'{..}
-          = object
-              (catMaybes
-                 [("NameContains" .=) <$> _lvNameContains,
-                  ("NextToken" .=) <$> _lvNextToken,
-                  ("StateEquals" .=) <$> _lvStateEquals,
-                  ("MaxResults" .=) <$> _lvMaxResults])
-
-instance ToPath ListVocabularies where
-        toPath = const "/"
-
-instance ToQuery ListVocabularies where
-        toQuery = const mempty
-
--- | /See:/ 'listVocabulariesResponse' smart constructor.
-data ListVocabulariesResponse = ListVocabulariesResponse'
-  { _lvrsVocabularies   :: !(Maybe [VocabularyInfo])
-  , _lvrsStatus         :: !(Maybe TranscriptionJobStatus)
-  , _lvrsNextToken      :: !(Maybe Text)
-  , _lvrsResponseStatus :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'ListVocabulariesResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'lvrsVocabularies' - A list of objects that describe the vocabularies that match the search criteria in the request.
---
--- * 'lvrsStatus' - The requested vocabulary state.
---
--- * 'lvrsNextToken' - The @ListVocabularies@ operation returns a page of vocabularies at a time. The maximum size of the page is set by the @MaxResults@ parameter. If there are more jobs in the list than the page size, Amazon Transcribe returns the @NextPage@ token. Include the token in the next request to the @ListVocabularies@ operation to return in the next page of jobs.
---
--- * 'lvrsResponseStatus' - -- | The response status code.
-listVocabulariesResponse
-    :: Int -- ^ 'lvrsResponseStatus'
-    -> ListVocabulariesResponse
-listVocabulariesResponse pResponseStatus_ =
-  ListVocabulariesResponse'
-    { _lvrsVocabularies = Nothing
-    , _lvrsStatus = Nothing
-    , _lvrsNextToken = Nothing
-    , _lvrsResponseStatus = pResponseStatus_
-    }
-
-
--- | A list of objects that describe the vocabularies that match the search criteria in the request.
-lvrsVocabularies :: Lens' ListVocabulariesResponse [VocabularyInfo]
-lvrsVocabularies = lens _lvrsVocabularies (\ s a -> s{_lvrsVocabularies = a}) . _Default . _Coerce
-
--- | The requested vocabulary state.
-lvrsStatus :: Lens' ListVocabulariesResponse (Maybe TranscriptionJobStatus)
-lvrsStatus = lens _lvrsStatus (\ s a -> s{_lvrsStatus = a})
-
--- | The @ListVocabularies@ operation returns a page of vocabularies at a time. The maximum size of the page is set by the @MaxResults@ parameter. If there are more jobs in the list than the page size, Amazon Transcribe returns the @NextPage@ token. Include the token in the next request to the @ListVocabularies@ operation to return in the next page of jobs.
-lvrsNextToken :: Lens' ListVocabulariesResponse (Maybe Text)
-lvrsNextToken = lens _lvrsNextToken (\ s a -> s{_lvrsNextToken = a})
-
--- | -- | The response status code.
-lvrsResponseStatus :: Lens' ListVocabulariesResponse Int
-lvrsResponseStatus = lens _lvrsResponseStatus (\ s a -> s{_lvrsResponseStatus = a})
-
-instance NFData ListVocabulariesResponse where
diff --git a/gen/Network/AWS/Transcribe/StartTranscriptionJob.hs b/gen/Network/AWS/Transcribe/StartTranscriptionJob.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/StartTranscriptionJob.hs
+++ /dev/null
@@ -1,191 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.StartTranscriptionJob
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Starts an asynchronous job to transcribe speech to text.
---
---
-module Network.AWS.Transcribe.StartTranscriptionJob
-    (
-    -- * Creating a Request
-      startTranscriptionJob
-    , StartTranscriptionJob
-    -- * Request Lenses
-    , stjSettings
-    , stjMediaSampleRateHertz
-    , stjTranscriptionJobName
-    , stjLanguageCode
-    , stjMediaFormat
-    , stjMedia
-
-    -- * Destructuring the Response
-    , startTranscriptionJobResponse
-    , StartTranscriptionJobResponse
-    -- * Response Lenses
-    , stjrsTranscriptionJob
-    , stjrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'startTranscriptionJob' smart constructor.
-data StartTranscriptionJob = StartTranscriptionJob'
-  { _stjSettings             :: !(Maybe Settings)
-  , _stjMediaSampleRateHertz :: !(Maybe Nat)
-  , _stjTranscriptionJobName :: !Text
-  , _stjLanguageCode         :: !LanguageCode
-  , _stjMediaFormat          :: !MediaFormat
-  , _stjMedia                :: !Media
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StartTranscriptionJob' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'stjSettings' - A @Settings@ object that provides optional settings for a transcription job.
---
--- * 'stjMediaSampleRateHertz' - The sample rate, in Hertz, of the audio track in the input media file.
---
--- * 'stjTranscriptionJobName' - The name of the job. The name must be unique within an AWS account.
---
--- * 'stjLanguageCode' - The language code for the language used in the input media file.
---
--- * 'stjMediaFormat' - The format of the input media file.
---
--- * 'stjMedia' - An object that describes the input media for a transcription job.
-startTranscriptionJob
-    :: Text -- ^ 'stjTranscriptionJobName'
-    -> LanguageCode -- ^ 'stjLanguageCode'
-    -> MediaFormat -- ^ 'stjMediaFormat'
-    -> Media -- ^ 'stjMedia'
-    -> StartTranscriptionJob
-startTranscriptionJob pTranscriptionJobName_ pLanguageCode_ pMediaFormat_ pMedia_ =
-  StartTranscriptionJob'
-    { _stjSettings = Nothing
-    , _stjMediaSampleRateHertz = Nothing
-    , _stjTranscriptionJobName = pTranscriptionJobName_
-    , _stjLanguageCode = pLanguageCode_
-    , _stjMediaFormat = pMediaFormat_
-    , _stjMedia = pMedia_
-    }
-
-
--- | A @Settings@ object that provides optional settings for a transcription job.
-stjSettings :: Lens' StartTranscriptionJob (Maybe Settings)
-stjSettings = lens _stjSettings (\ s a -> s{_stjSettings = a})
-
--- | The sample rate, in Hertz, of the audio track in the input media file.
-stjMediaSampleRateHertz :: Lens' StartTranscriptionJob (Maybe Natural)
-stjMediaSampleRateHertz = lens _stjMediaSampleRateHertz (\ s a -> s{_stjMediaSampleRateHertz = a}) . mapping _Nat
-
--- | The name of the job. The name must be unique within an AWS account.
-stjTranscriptionJobName :: Lens' StartTranscriptionJob Text
-stjTranscriptionJobName = lens _stjTranscriptionJobName (\ s a -> s{_stjTranscriptionJobName = a})
-
--- | The language code for the language used in the input media file.
-stjLanguageCode :: Lens' StartTranscriptionJob LanguageCode
-stjLanguageCode = lens _stjLanguageCode (\ s a -> s{_stjLanguageCode = a})
-
--- | The format of the input media file.
-stjMediaFormat :: Lens' StartTranscriptionJob MediaFormat
-stjMediaFormat = lens _stjMediaFormat (\ s a -> s{_stjMediaFormat = a})
-
--- | An object that describes the input media for a transcription job.
-stjMedia :: Lens' StartTranscriptionJob Media
-stjMedia = lens _stjMedia (\ s a -> s{_stjMedia = a})
-
-instance AWSRequest StartTranscriptionJob where
-        type Rs StartTranscriptionJob =
-             StartTranscriptionJobResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 StartTranscriptionJobResponse' <$>
-                   (x .?> "TranscriptionJob") <*> (pure (fromEnum s)))
-
-instance Hashable StartTranscriptionJob where
-
-instance NFData StartTranscriptionJob where
-
-instance ToHeaders StartTranscriptionJob where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.StartTranscriptionJob" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON StartTranscriptionJob where
-        toJSON StartTranscriptionJob'{..}
-          = object
-              (catMaybes
-                 [("Settings" .=) <$> _stjSettings,
-                  ("MediaSampleRateHertz" .=) <$>
-                    _stjMediaSampleRateHertz,
-                  Just
-                    ("TranscriptionJobName" .= _stjTranscriptionJobName),
-                  Just ("LanguageCode" .= _stjLanguageCode),
-                  Just ("MediaFormat" .= _stjMediaFormat),
-                  Just ("Media" .= _stjMedia)])
-
-instance ToPath StartTranscriptionJob where
-        toPath = const "/"
-
-instance ToQuery StartTranscriptionJob where
-        toQuery = const mempty
-
--- | /See:/ 'startTranscriptionJobResponse' smart constructor.
-data StartTranscriptionJobResponse = StartTranscriptionJobResponse'
-  { _stjrsTranscriptionJob :: !(Maybe TranscriptionJob)
-  , _stjrsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'StartTranscriptionJobResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'stjrsTranscriptionJob' - An object containing details of the asynchronous transcription job.
---
--- * 'stjrsResponseStatus' - -- | The response status code.
-startTranscriptionJobResponse
-    :: Int -- ^ 'stjrsResponseStatus'
-    -> StartTranscriptionJobResponse
-startTranscriptionJobResponse pResponseStatus_ =
-  StartTranscriptionJobResponse'
-    {_stjrsTranscriptionJob = Nothing, _stjrsResponseStatus = pResponseStatus_}
-
-
--- | An object containing details of the asynchronous transcription job.
-stjrsTranscriptionJob :: Lens' StartTranscriptionJobResponse (Maybe TranscriptionJob)
-stjrsTranscriptionJob = lens _stjrsTranscriptionJob (\ s a -> s{_stjrsTranscriptionJob = a})
-
--- | -- | The response status code.
-stjrsResponseStatus :: Lens' StartTranscriptionJobResponse Int
-stjrsResponseStatus = lens _stjrsResponseStatus (\ s a -> s{_stjrsResponseStatus = a})
-
-instance NFData StartTranscriptionJobResponse where
diff --git a/gen/Network/AWS/Transcribe/Types.hs b/gen/Network/AWS/Transcribe/Types.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/Types.hs
+++ /dev/null
@@ -1,167 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.Types
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.Transcribe.Types
-    (
-    -- * Service Configuration
-      transcribe
-
-    -- * Errors
-    , _ConflictException
-    , _NotFoundException
-    , _InternalFailureException
-    , _BadRequestException
-    , _LimitExceededException
-
-    -- * LanguageCode
-    , LanguageCode (..)
-
-    -- * MediaFormat
-    , MediaFormat (..)
-
-    -- * TranscriptionJobStatus
-    , TranscriptionJobStatus (..)
-
-    -- * VocabularyState
-    , VocabularyState (..)
-
-    -- * Media
-    , Media
-    , media
-    , mMediaFileURI
-
-    -- * Settings
-    , Settings
-    , settings
-    , sVocabularyName
-    , sMaxSpeakerLabels
-    , sShowSpeakerLabels
-
-    -- * Transcript
-    , Transcript
-    , transcript
-    , tTranscriptFileURI
-
-    -- * TranscriptionJob
-    , TranscriptionJob
-    , transcriptionJob
-    , tjCreationTime
-    , tjFailureReason
-    , tjLanguageCode
-    , tjSettings
-    , tjCompletionTime
-    , tjMedia
-    , tjMediaFormat
-    , tjTranscriptionJobStatus
-    , tjTranscriptionJobName
-    , tjTranscript
-    , tjMediaSampleRateHertz
-
-    -- * TranscriptionJobSummary
-    , TranscriptionJobSummary
-    , transcriptionJobSummary
-    , tjsCreationTime
-    , tjsFailureReason
-    , tjsLanguageCode
-    , tjsCompletionTime
-    , tjsTranscriptionJobStatus
-    , tjsTranscriptionJobName
-
-    -- * VocabularyInfo
-    , VocabularyInfo
-    , vocabularyInfo
-    , viLanguageCode
-    , viVocabularyName
-    , viLastModifiedTime
-    , viVocabularyState
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Sign.V4
-import Network.AWS.Transcribe.Types.Product
-import Network.AWS.Transcribe.Types.Sum
-
--- | API version @2017-10-26@ of the Amazon Transcribe Service SDK configuration.
-transcribe :: Service
-transcribe =
-  Service
-    { _svcAbbrev = "Transcribe"
-    , _svcSigner = v4
-    , _svcPrefix = "transcribe"
-    , _svcVersion = "2017-10-26"
-    , _svcEndpoint = defaultEndpoint transcribe
-    , _svcTimeout = Just 70
-    , _svcCheck = statusSuccess
-    , _svcError = parseJSONError "Transcribe"
-    , _svcRetry = retry
-    }
-  where
-    retry =
-      Exponential
-        { _retryBase = 5.0e-2
-        , _retryGrowth = 2
-        , _retryAttempts = 5
-        , _retryCheck = check
-        }
-    check e
-      | has (hasCode "ThrottledException" . hasStatus 400) e =
-        Just "throttled_exception"
-      | has (hasStatus 429) e = Just "too_many_requests"
-      | has (hasCode "ThrottlingException" . hasStatus 400) e =
-        Just "throttling_exception"
-      | has (hasCode "Throttling" . hasStatus 400) e = Just "throttling"
-      | has (hasStatus 504) e = Just "gateway_timeout"
-      | has (hasCode "RequestThrottledException" . hasStatus 400) e =
-        Just "request_throttled_exception"
-      | has (hasStatus 502) e = Just "bad_gateway"
-      | has (hasStatus 503) e = Just "service_unavailable"
-      | has (hasStatus 500) e = Just "general_server_error"
-      | has (hasStatus 509) e = Just "limit_exceeded"
-      | otherwise = Nothing
-
-
--- | The @JobName@ field is a duplicate of a previously entered job name. Resend your request with a different name.
---
---
-_ConflictException :: AsError a => Getting (First ServiceError) a ServiceError
-_ConflictException = _MatchServiceError transcribe "ConflictException"
-
-
--- | We can't find the requested transcription job or custom vocabulary. Check the name and try your request again.
---
---
-_NotFoundException :: AsError a => Getting (First ServiceError) a ServiceError
-_NotFoundException = _MatchServiceError transcribe "NotFoundException"
-
-
--- | There was an internal error. Check the error message and try your request again.
---
---
-_InternalFailureException :: AsError a => Getting (First ServiceError) a ServiceError
-_InternalFailureException =
-  _MatchServiceError transcribe "InternalFailureException"
-
-
--- | Your request didn't pass one or more validation tests. For example, a name already exists when createing a resource or a name may not exist when getting a transcription job or custom vocabulary. See the exception @Message@ field for more information.
---
---
-_BadRequestException :: AsError a => Getting (First ServiceError) a ServiceError
-_BadRequestException = _MatchServiceError transcribe "BadRequestException"
-
-
--- | Either you have sent too many requests or your input file is too long. Wait before you resend your request, or use a smaller file and resend the request.
---
---
-_LimitExceededException :: AsError a => Getting (First ServiceError) a ServiceError
-_LimitExceededException = _MatchServiceError transcribe "LimitExceededException"
-
diff --git a/gen/Network/AWS/Transcribe/Types/Product.hs b/gen/Network/AWS/Transcribe/Types/Product.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/Types/Product.hs
+++ /dev/null
@@ -1,430 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.Types.Product
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.Transcribe.Types.Product where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Transcribe.Types.Sum
-
--- | Describes the input media file in a transcription request.
---
---
---
--- /See:/ 'media' smart constructor.
-newtype Media = Media'
-  { _mMediaFileURI :: Maybe Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Media' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'mMediaFileURI' - The S3 location of the input media file. The URI must be in the same region as the API endpoint that you are calling. The general form is: @https://<aws-region>.amazonaws.com/<bucket-name>/<keyprefix>/<objectkey> @  For example: @https://s3-us-east-1.amazonaws.com/examplebucket/example.mp4@  @https://s3-us-east-1.amazonaws.com/examplebucket/mediadocs/example.mp4@  For more information about S3 object names, see <http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-keys Object Keys> in the /Amazon S3 Developer Guide/ .
-media
-    :: Media
-media = Media' {_mMediaFileURI = Nothing}
-
-
--- | The S3 location of the input media file. The URI must be in the same region as the API endpoint that you are calling. The general form is: @https://<aws-region>.amazonaws.com/<bucket-name>/<keyprefix>/<objectkey> @  For example: @https://s3-us-east-1.amazonaws.com/examplebucket/example.mp4@  @https://s3-us-east-1.amazonaws.com/examplebucket/mediadocs/example.mp4@  For more information about S3 object names, see <http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html#object-keys Object Keys> in the /Amazon S3 Developer Guide/ .
-mMediaFileURI :: Lens' Media (Maybe Text)
-mMediaFileURI = lens _mMediaFileURI (\ s a -> s{_mMediaFileURI = a})
-
-instance FromJSON Media where
-        parseJSON
-          = withObject "Media"
-              (\ x -> Media' <$> (x .:? "MediaFileUri"))
-
-instance Hashable Media where
-
-instance NFData Media where
-
-instance ToJSON Media where
-        toJSON Media'{..}
-          = object
-              (catMaybes [("MediaFileUri" .=) <$> _mMediaFileURI])
-
--- | Provides optional settings for the @StartTranscriptionJob@ operation.
---
---
---
--- /See:/ 'settings' smart constructor.
-data Settings = Settings'
-  { _sVocabularyName    :: !(Maybe Text)
-  , _sMaxSpeakerLabels  :: !(Maybe Nat)
-  , _sShowSpeakerLabels :: !(Maybe Bool)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Settings' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'sVocabularyName' - The name of a vocabulary to use when processing the transcription job.
---
--- * 'sMaxSpeakerLabels' - The maximum number of speakers to identify in the input audio. If there are more speakers in the audio than this number, multiple speakers will be identified as a single speaker. If you specify the @MaxSpeakerLabels@ field, you must set the @ShowSpeakerLabels@ field to true.
---
--- * 'sShowSpeakerLabels' - Determines whether the transcription job should use speaker recognition to identify different speakers in the input audio. If you set the @ShowSpeakerLabels@ field to true, you must also set the maximum number of speaker labels @MaxSpeakerLabels@ field.
-settings
-    :: Settings
-settings =
-  Settings'
-    { _sVocabularyName = Nothing
-    , _sMaxSpeakerLabels = Nothing
-    , _sShowSpeakerLabels = Nothing
-    }
-
-
--- | The name of a vocabulary to use when processing the transcription job.
-sVocabularyName :: Lens' Settings (Maybe Text)
-sVocabularyName = lens _sVocabularyName (\ s a -> s{_sVocabularyName = a})
-
--- | The maximum number of speakers to identify in the input audio. If there are more speakers in the audio than this number, multiple speakers will be identified as a single speaker. If you specify the @MaxSpeakerLabels@ field, you must set the @ShowSpeakerLabels@ field to true.
-sMaxSpeakerLabels :: Lens' Settings (Maybe Natural)
-sMaxSpeakerLabels = lens _sMaxSpeakerLabels (\ s a -> s{_sMaxSpeakerLabels = a}) . mapping _Nat
-
--- | Determines whether the transcription job should use speaker recognition to identify different speakers in the input audio. If you set the @ShowSpeakerLabels@ field to true, you must also set the maximum number of speaker labels @MaxSpeakerLabels@ field.
-sShowSpeakerLabels :: Lens' Settings (Maybe Bool)
-sShowSpeakerLabels = lens _sShowSpeakerLabels (\ s a -> s{_sShowSpeakerLabels = a})
-
-instance FromJSON Settings where
-        parseJSON
-          = withObject "Settings"
-              (\ x ->
-                 Settings' <$>
-                   (x .:? "VocabularyName") <*>
-                     (x .:? "MaxSpeakerLabels")
-                     <*> (x .:? "ShowSpeakerLabels"))
-
-instance Hashable Settings where
-
-instance NFData Settings where
-
-instance ToJSON Settings where
-        toJSON Settings'{..}
-          = object
-              (catMaybes
-                 [("VocabularyName" .=) <$> _sVocabularyName,
-                  ("MaxSpeakerLabels" .=) <$> _sMaxSpeakerLabels,
-                  ("ShowSpeakerLabels" .=) <$> _sShowSpeakerLabels])
-
--- | Describes the output of a transcription job.
---
---
---
--- /See:/ 'transcript' smart constructor.
-newtype Transcript = Transcript'
-  { _tTranscriptFileURI :: Maybe Text
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'Transcript' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'tTranscriptFileURI' - The S3 location where the transcription result is stored. Use this URI to access the results of the transcription job.
-transcript
-    :: Transcript
-transcript = Transcript' {_tTranscriptFileURI = Nothing}
-
-
--- | The S3 location where the transcription result is stored. Use this URI to access the results of the transcription job.
-tTranscriptFileURI :: Lens' Transcript (Maybe Text)
-tTranscriptFileURI = lens _tTranscriptFileURI (\ s a -> s{_tTranscriptFileURI = a})
-
-instance FromJSON Transcript where
-        parseJSON
-          = withObject "Transcript"
-              (\ x -> Transcript' <$> (x .:? "TranscriptFileUri"))
-
-instance Hashable Transcript where
-
-instance NFData Transcript where
-
--- | Describes an asynchronous transcription job that was created with the @StartTranscriptionJob@ operation.
---
---
---
--- /See:/ 'transcriptionJob' smart constructor.
-data TranscriptionJob = TranscriptionJob'
-  { _tjCreationTime           :: !(Maybe POSIX)
-  , _tjFailureReason          :: !(Maybe Text)
-  , _tjLanguageCode           :: !(Maybe LanguageCode)
-  , _tjSettings               :: !(Maybe Settings)
-  , _tjCompletionTime         :: !(Maybe POSIX)
-  , _tjMedia                  :: !(Maybe Media)
-  , _tjMediaFormat            :: !(Maybe MediaFormat)
-  , _tjTranscriptionJobStatus :: !(Maybe TranscriptionJobStatus)
-  , _tjTranscriptionJobName   :: !(Maybe Text)
-  , _tjTranscript             :: !(Maybe Transcript)
-  , _tjMediaSampleRateHertz   :: !(Maybe Nat)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'TranscriptionJob' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'tjCreationTime' - Timestamp of the date and time that the job was created.
---
--- * 'tjFailureReason' - If the @TranscriptionJobStatus@ field is @FAILED@ , this field contains information about why the job failed.
---
--- * 'tjLanguageCode' - The language code for the input speech.
---
--- * 'tjSettings' - Optional settings for the transcription job.
---
--- * 'tjCompletionTime' - Timestamp of the date and time that the job completed.
---
--- * 'tjMedia' - An object that describes the input media for a transcription job.
---
--- * 'tjMediaFormat' - The format of the input media file.
---
--- * 'tjTranscriptionJobStatus' - The status of the transcription job.
---
--- * 'tjTranscriptionJobName' - A name to identify the transcription job.
---
--- * 'tjTranscript' - An object that describes the output of the transcription job.
---
--- * 'tjMediaSampleRateHertz' - The sample rate, in Hertz, of the audio track in the input media file.
-transcriptionJob
-    :: TranscriptionJob
-transcriptionJob =
-  TranscriptionJob'
-    { _tjCreationTime = Nothing
-    , _tjFailureReason = Nothing
-    , _tjLanguageCode = Nothing
-    , _tjSettings = Nothing
-    , _tjCompletionTime = Nothing
-    , _tjMedia = Nothing
-    , _tjMediaFormat = Nothing
-    , _tjTranscriptionJobStatus = Nothing
-    , _tjTranscriptionJobName = Nothing
-    , _tjTranscript = Nothing
-    , _tjMediaSampleRateHertz = Nothing
-    }
-
-
--- | Timestamp of the date and time that the job was created.
-tjCreationTime :: Lens' TranscriptionJob (Maybe UTCTime)
-tjCreationTime = lens _tjCreationTime (\ s a -> s{_tjCreationTime = a}) . mapping _Time
-
--- | If the @TranscriptionJobStatus@ field is @FAILED@ , this field contains information about why the job failed.
-tjFailureReason :: Lens' TranscriptionJob (Maybe Text)
-tjFailureReason = lens _tjFailureReason (\ s a -> s{_tjFailureReason = a})
-
--- | The language code for the input speech.
-tjLanguageCode :: Lens' TranscriptionJob (Maybe LanguageCode)
-tjLanguageCode = lens _tjLanguageCode (\ s a -> s{_tjLanguageCode = a})
-
--- | Optional settings for the transcription job.
-tjSettings :: Lens' TranscriptionJob (Maybe Settings)
-tjSettings = lens _tjSettings (\ s a -> s{_tjSettings = a})
-
--- | Timestamp of the date and time that the job completed.
-tjCompletionTime :: Lens' TranscriptionJob (Maybe UTCTime)
-tjCompletionTime = lens _tjCompletionTime (\ s a -> s{_tjCompletionTime = a}) . mapping _Time
-
--- | An object that describes the input media for a transcription job.
-tjMedia :: Lens' TranscriptionJob (Maybe Media)
-tjMedia = lens _tjMedia (\ s a -> s{_tjMedia = a})
-
--- | The format of the input media file.
-tjMediaFormat :: Lens' TranscriptionJob (Maybe MediaFormat)
-tjMediaFormat = lens _tjMediaFormat (\ s a -> s{_tjMediaFormat = a})
-
--- | The status of the transcription job.
-tjTranscriptionJobStatus :: Lens' TranscriptionJob (Maybe TranscriptionJobStatus)
-tjTranscriptionJobStatus = lens _tjTranscriptionJobStatus (\ s a -> s{_tjTranscriptionJobStatus = a})
-
--- | A name to identify the transcription job.
-tjTranscriptionJobName :: Lens' TranscriptionJob (Maybe Text)
-tjTranscriptionJobName = lens _tjTranscriptionJobName (\ s a -> s{_tjTranscriptionJobName = a})
-
--- | An object that describes the output of the transcription job.
-tjTranscript :: Lens' TranscriptionJob (Maybe Transcript)
-tjTranscript = lens _tjTranscript (\ s a -> s{_tjTranscript = a})
-
--- | The sample rate, in Hertz, of the audio track in the input media file.
-tjMediaSampleRateHertz :: Lens' TranscriptionJob (Maybe Natural)
-tjMediaSampleRateHertz = lens _tjMediaSampleRateHertz (\ s a -> s{_tjMediaSampleRateHertz = a}) . mapping _Nat
-
-instance FromJSON TranscriptionJob where
-        parseJSON
-          = withObject "TranscriptionJob"
-              (\ x ->
-                 TranscriptionJob' <$>
-                   (x .:? "CreationTime") <*> (x .:? "FailureReason")
-                     <*> (x .:? "LanguageCode")
-                     <*> (x .:? "Settings")
-                     <*> (x .:? "CompletionTime")
-                     <*> (x .:? "Media")
-                     <*> (x .:? "MediaFormat")
-                     <*> (x .:? "TranscriptionJobStatus")
-                     <*> (x .:? "TranscriptionJobName")
-                     <*> (x .:? "Transcript")
-                     <*> (x .:? "MediaSampleRateHertz"))
-
-instance Hashable TranscriptionJob where
-
-instance NFData TranscriptionJob where
-
--- | Provides a summary of information about a transcription job.
---
---
---
--- /See:/ 'transcriptionJobSummary' smart constructor.
-data TranscriptionJobSummary = TranscriptionJobSummary'
-  { _tjsCreationTime           :: !(Maybe POSIX)
-  , _tjsFailureReason          :: !(Maybe Text)
-  , _tjsLanguageCode           :: !(Maybe LanguageCode)
-  , _tjsCompletionTime         :: !(Maybe POSIX)
-  , _tjsTranscriptionJobStatus :: !(Maybe TranscriptionJobStatus)
-  , _tjsTranscriptionJobName   :: !(Maybe Text)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'TranscriptionJobSummary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'tjsCreationTime' - Timestamp of the date and time that the job was created.
---
--- * 'tjsFailureReason' - If the @TranscriptionJobStatus@ field is @FAILED@ , this field contains a description of the error.
---
--- * 'tjsLanguageCode' - The language code for the input speech.
---
--- * 'tjsCompletionTime' - Timestamp of the date and time that the job completed.
---
--- * 'tjsTranscriptionJobStatus' - The status of the transcription job. When the status is @COMPLETED@ , use the @GetTranscriptionJob@ operation to get the results of the transcription.
---
--- * 'tjsTranscriptionJobName' - The name assigned to the transcription job when it was created.
-transcriptionJobSummary
-    :: TranscriptionJobSummary
-transcriptionJobSummary =
-  TranscriptionJobSummary'
-    { _tjsCreationTime = Nothing
-    , _tjsFailureReason = Nothing
-    , _tjsLanguageCode = Nothing
-    , _tjsCompletionTime = Nothing
-    , _tjsTranscriptionJobStatus = Nothing
-    , _tjsTranscriptionJobName = Nothing
-    }
-
-
--- | Timestamp of the date and time that the job was created.
-tjsCreationTime :: Lens' TranscriptionJobSummary (Maybe UTCTime)
-tjsCreationTime = lens _tjsCreationTime (\ s a -> s{_tjsCreationTime = a}) . mapping _Time
-
--- | If the @TranscriptionJobStatus@ field is @FAILED@ , this field contains a description of the error.
-tjsFailureReason :: Lens' TranscriptionJobSummary (Maybe Text)
-tjsFailureReason = lens _tjsFailureReason (\ s a -> s{_tjsFailureReason = a})
-
--- | The language code for the input speech.
-tjsLanguageCode :: Lens' TranscriptionJobSummary (Maybe LanguageCode)
-tjsLanguageCode = lens _tjsLanguageCode (\ s a -> s{_tjsLanguageCode = a})
-
--- | Timestamp of the date and time that the job completed.
-tjsCompletionTime :: Lens' TranscriptionJobSummary (Maybe UTCTime)
-tjsCompletionTime = lens _tjsCompletionTime (\ s a -> s{_tjsCompletionTime = a}) . mapping _Time
-
--- | The status of the transcription job. When the status is @COMPLETED@ , use the @GetTranscriptionJob@ operation to get the results of the transcription.
-tjsTranscriptionJobStatus :: Lens' TranscriptionJobSummary (Maybe TranscriptionJobStatus)
-tjsTranscriptionJobStatus = lens _tjsTranscriptionJobStatus (\ s a -> s{_tjsTranscriptionJobStatus = a})
-
--- | The name assigned to the transcription job when it was created.
-tjsTranscriptionJobName :: Lens' TranscriptionJobSummary (Maybe Text)
-tjsTranscriptionJobName = lens _tjsTranscriptionJobName (\ s a -> s{_tjsTranscriptionJobName = a})
-
-instance FromJSON TranscriptionJobSummary where
-        parseJSON
-          = withObject "TranscriptionJobSummary"
-              (\ x ->
-                 TranscriptionJobSummary' <$>
-                   (x .:? "CreationTime") <*> (x .:? "FailureReason")
-                     <*> (x .:? "LanguageCode")
-                     <*> (x .:? "CompletionTime")
-                     <*> (x .:? "TranscriptionJobStatus")
-                     <*> (x .:? "TranscriptionJobName"))
-
-instance Hashable TranscriptionJobSummary where
-
-instance NFData TranscriptionJobSummary where
-
--- | Provides information about a custom vocabulary.
---
---
---
--- /See:/ 'vocabularyInfo' smart constructor.
-data VocabularyInfo = VocabularyInfo'
-  { _viLanguageCode     :: !(Maybe LanguageCode)
-  , _viVocabularyName   :: !(Maybe Text)
-  , _viLastModifiedTime :: !(Maybe POSIX)
-  , _viVocabularyState  :: !(Maybe VocabularyState)
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'VocabularyInfo' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'viLanguageCode' - The language code of the vocabulary entries.
---
--- * 'viVocabularyName' - The name of the vocabulary.
---
--- * 'viLastModifiedTime' - The date and time that the vocabulary was last modified.
---
--- * 'viVocabularyState' - The processing state of the vocabulary. If the state is @READY@ you can use the vocabulary in a @StartTranscriptionJob@ request.
-vocabularyInfo
-    :: VocabularyInfo
-vocabularyInfo =
-  VocabularyInfo'
-    { _viLanguageCode = Nothing
-    , _viVocabularyName = Nothing
-    , _viLastModifiedTime = Nothing
-    , _viVocabularyState = Nothing
-    }
-
-
--- | The language code of the vocabulary entries.
-viLanguageCode :: Lens' VocabularyInfo (Maybe LanguageCode)
-viLanguageCode = lens _viLanguageCode (\ s a -> s{_viLanguageCode = a})
-
--- | The name of the vocabulary.
-viVocabularyName :: Lens' VocabularyInfo (Maybe Text)
-viVocabularyName = lens _viVocabularyName (\ s a -> s{_viVocabularyName = a})
-
--- | The date and time that the vocabulary was last modified.
-viLastModifiedTime :: Lens' VocabularyInfo (Maybe UTCTime)
-viLastModifiedTime = lens _viLastModifiedTime (\ s a -> s{_viLastModifiedTime = a}) . mapping _Time
-
--- | The processing state of the vocabulary. If the state is @READY@ you can use the vocabulary in a @StartTranscriptionJob@ request.
-viVocabularyState :: Lens' VocabularyInfo (Maybe VocabularyState)
-viVocabularyState = lens _viVocabularyState (\ s a -> s{_viVocabularyState = a})
-
-instance FromJSON VocabularyInfo where
-        parseJSON
-          = withObject "VocabularyInfo"
-              (\ x ->
-                 VocabularyInfo' <$>
-                   (x .:? "LanguageCode") <*> (x .:? "VocabularyName")
-                     <*> (x .:? "LastModifiedTime")
-                     <*> (x .:? "VocabularyState"))
-
-instance Hashable VocabularyInfo where
-
-instance NFData VocabularyInfo where
diff --git a/gen/Network/AWS/Transcribe/Types/Sum.hs b/gen/Network/AWS/Transcribe/Types/Sum.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/Types/Sum.hs
+++ /dev/null
@@ -1,152 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE LambdaCase         #-}
-{-# LANGUAGE OverloadedStrings  #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.Types.Sum
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.Transcribe.Types.Sum where
-
-import Network.AWS.Prelude
-
-data LanguageCode
-  = EnUs
-  | EsUs
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText LanguageCode where
-    parser = takeLowerText >>= \case
-        "en-us" -> pure EnUs
-        "es-us" -> pure EsUs
-        e -> fromTextError $ "Failure parsing LanguageCode from value: '" <> e
-           <> "'. Accepted values: en-us, es-us"
-
-instance ToText LanguageCode where
-    toText = \case
-        EnUs -> "en-US"
-        EsUs -> "es-US"
-
-instance Hashable     LanguageCode
-instance NFData       LanguageCode
-instance ToByteString LanguageCode
-instance ToQuery      LanguageCode
-instance ToHeader     LanguageCode
-
-instance ToJSON LanguageCode where
-    toJSON = toJSONText
-
-instance FromJSON LanguageCode where
-    parseJSON = parseJSONText "LanguageCode"
-
-data MediaFormat
-  = Flac
-  | MP3
-  | MP4
-  | Wav
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText MediaFormat where
-    parser = takeLowerText >>= \case
-        "flac" -> pure Flac
-        "mp3" -> pure MP3
-        "mp4" -> pure MP4
-        "wav" -> pure Wav
-        e -> fromTextError $ "Failure parsing MediaFormat from value: '" <> e
-           <> "'. Accepted values: flac, mp3, mp4, wav"
-
-instance ToText MediaFormat where
-    toText = \case
-        Flac -> "flac"
-        MP3 -> "mp3"
-        MP4 -> "mp4"
-        Wav -> "wav"
-
-instance Hashable     MediaFormat
-instance NFData       MediaFormat
-instance ToByteString MediaFormat
-instance ToQuery      MediaFormat
-instance ToHeader     MediaFormat
-
-instance ToJSON MediaFormat where
-    toJSON = toJSONText
-
-instance FromJSON MediaFormat where
-    parseJSON = parseJSONText "MediaFormat"
-
-data TranscriptionJobStatus
-  = TJSCompleted
-  | TJSFailed
-  | TJSInProgress
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText TranscriptionJobStatus where
-    parser = takeLowerText >>= \case
-        "completed" -> pure TJSCompleted
-        "failed" -> pure TJSFailed
-        "in_progress" -> pure TJSInProgress
-        e -> fromTextError $ "Failure parsing TranscriptionJobStatus from value: '" <> e
-           <> "'. Accepted values: completed, failed, in_progress"
-
-instance ToText TranscriptionJobStatus where
-    toText = \case
-        TJSCompleted -> "COMPLETED"
-        TJSFailed -> "FAILED"
-        TJSInProgress -> "IN_PROGRESS"
-
-instance Hashable     TranscriptionJobStatus
-instance NFData       TranscriptionJobStatus
-instance ToByteString TranscriptionJobStatus
-instance ToQuery      TranscriptionJobStatus
-instance ToHeader     TranscriptionJobStatus
-
-instance ToJSON TranscriptionJobStatus where
-    toJSON = toJSONText
-
-instance FromJSON TranscriptionJobStatus where
-    parseJSON = parseJSONText "TranscriptionJobStatus"
-
-data VocabularyState
-  = Failed
-  | Pending
-  | Ready
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Typeable, Generic)
-
-
-instance FromText VocabularyState where
-    parser = takeLowerText >>= \case
-        "failed" -> pure Failed
-        "pending" -> pure Pending
-        "ready" -> pure Ready
-        e -> fromTextError $ "Failure parsing VocabularyState from value: '" <> e
-           <> "'. Accepted values: failed, pending, ready"
-
-instance ToText VocabularyState where
-    toText = \case
-        Failed -> "FAILED"
-        Pending -> "PENDING"
-        Ready -> "READY"
-
-instance Hashable     VocabularyState
-instance NFData       VocabularyState
-instance ToByteString VocabularyState
-instance ToQuery      VocabularyState
-instance ToHeader     VocabularyState
-
-instance ToJSON VocabularyState where
-    toJSON = toJSONText
-
-instance FromJSON VocabularyState where
-    parseJSON = parseJSONText "VocabularyState"
diff --git a/gen/Network/AWS/Transcribe/UpdateVocabulary.hs b/gen/Network/AWS/Transcribe/UpdateVocabulary.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/UpdateVocabulary.hs
+++ /dev/null
@@ -1,188 +0,0 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
-{-# LANGUAGE OverloadedStrings  #-}
-{-# LANGUAGE RecordWildCards    #-}
-{-# LANGUAGE TypeFamilies       #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
-{-# OPTIONS_GHC -fno-warn-unused-matches #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.UpdateVocabulary
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
--- Updates an existing vocabulary with new values.
---
---
-module Network.AWS.Transcribe.UpdateVocabulary
-    (
-    -- * Creating a Request
-      updateVocabulary
-    , UpdateVocabulary
-    -- * Request Lenses
-    , uvVocabularyName
-    , uvLanguageCode
-    , uvPhrases
-
-    -- * Destructuring the Response
-    , updateVocabularyResponse
-    , UpdateVocabularyResponse
-    -- * Response Lenses
-    , uvrsLanguageCode
-    , uvrsVocabularyName
-    , uvrsLastModifiedTime
-    , uvrsVocabularyState
-    , uvrsResponseStatus
-    ) where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Request
-import Network.AWS.Response
-import Network.AWS.Transcribe.Types
-import Network.AWS.Transcribe.Types.Product
-
--- | /See:/ 'updateVocabulary' smart constructor.
-data UpdateVocabulary = UpdateVocabulary'
-  { _uvVocabularyName :: !Text
-  , _uvLanguageCode   :: !LanguageCode
-  , _uvPhrases        :: ![Text]
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UpdateVocabulary' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'uvVocabularyName' - The name of the vocabulary to update. The name is case-sensitive.
---
--- * 'uvLanguageCode' - The language code of the vocabulary entries.
---
--- * 'uvPhrases' - An array of strings containing the vocabulary entries.
-updateVocabulary
-    :: Text -- ^ 'uvVocabularyName'
-    -> LanguageCode -- ^ 'uvLanguageCode'
-    -> UpdateVocabulary
-updateVocabulary pVocabularyName_ pLanguageCode_ =
-  UpdateVocabulary'
-    { _uvVocabularyName = pVocabularyName_
-    , _uvLanguageCode = pLanguageCode_
-    , _uvPhrases = mempty
-    }
-
-
--- | The name of the vocabulary to update. The name is case-sensitive.
-uvVocabularyName :: Lens' UpdateVocabulary Text
-uvVocabularyName = lens _uvVocabularyName (\ s a -> s{_uvVocabularyName = a})
-
--- | The language code of the vocabulary entries.
-uvLanguageCode :: Lens' UpdateVocabulary LanguageCode
-uvLanguageCode = lens _uvLanguageCode (\ s a -> s{_uvLanguageCode = a})
-
--- | An array of strings containing the vocabulary entries.
-uvPhrases :: Lens' UpdateVocabulary [Text]
-uvPhrases = lens _uvPhrases (\ s a -> s{_uvPhrases = a}) . _Coerce
-
-instance AWSRequest UpdateVocabulary where
-        type Rs UpdateVocabulary = UpdateVocabularyResponse
-        request = postJSON transcribe
-        response
-          = receiveJSON
-              (\ s h x ->
-                 UpdateVocabularyResponse' <$>
-                   (x .?> "LanguageCode") <*> (x .?> "VocabularyName")
-                     <*> (x .?> "LastModifiedTime")
-                     <*> (x .?> "VocabularyState")
-                     <*> (pure (fromEnum s)))
-
-instance Hashable UpdateVocabulary where
-
-instance NFData UpdateVocabulary where
-
-instance ToHeaders UpdateVocabulary where
-        toHeaders
-          = const
-              (mconcat
-                 ["X-Amz-Target" =#
-                    ("Transcribe.UpdateVocabulary" :: ByteString),
-                  "Content-Type" =#
-                    ("application/x-amz-json-1.1" :: ByteString)])
-
-instance ToJSON UpdateVocabulary where
-        toJSON UpdateVocabulary'{..}
-          = object
-              (catMaybes
-                 [Just ("VocabularyName" .= _uvVocabularyName),
-                  Just ("LanguageCode" .= _uvLanguageCode),
-                  Just ("Phrases" .= _uvPhrases)])
-
-instance ToPath UpdateVocabulary where
-        toPath = const "/"
-
-instance ToQuery UpdateVocabulary where
-        toQuery = const mempty
-
--- | /See:/ 'updateVocabularyResponse' smart constructor.
-data UpdateVocabularyResponse = UpdateVocabularyResponse'
-  { _uvrsLanguageCode     :: !(Maybe LanguageCode)
-  , _uvrsVocabularyName   :: !(Maybe Text)
-  , _uvrsLastModifiedTime :: !(Maybe POSIX)
-  , _uvrsVocabularyState  :: !(Maybe VocabularyState)
-  , _uvrsResponseStatus   :: !Int
-  } deriving (Eq, Read, Show, Data, Typeable, Generic)
-
-
--- | Creates a value of 'UpdateVocabularyResponse' with the minimum fields required to make a request.
---
--- Use one of the following lenses to modify other fields as desired:
---
--- * 'uvrsLanguageCode' - The language code of the vocabulary entries.
---
--- * 'uvrsVocabularyName' - The name of the vocabulary that was updated.
---
--- * 'uvrsLastModifiedTime' - The date and time that the vocabulary was updated.
---
--- * 'uvrsVocabularyState' - The processing state of the vocabulary. When the @VocabularyState@ field contains @READY@ the vocabulary is ready to be used in a @StartTranscriptionJob@ request.
---
--- * 'uvrsResponseStatus' - -- | The response status code.
-updateVocabularyResponse
-    :: Int -- ^ 'uvrsResponseStatus'
-    -> UpdateVocabularyResponse
-updateVocabularyResponse pResponseStatus_ =
-  UpdateVocabularyResponse'
-    { _uvrsLanguageCode = Nothing
-    , _uvrsVocabularyName = Nothing
-    , _uvrsLastModifiedTime = Nothing
-    , _uvrsVocabularyState = Nothing
-    , _uvrsResponseStatus = pResponseStatus_
-    }
-
-
--- | The language code of the vocabulary entries.
-uvrsLanguageCode :: Lens' UpdateVocabularyResponse (Maybe LanguageCode)
-uvrsLanguageCode = lens _uvrsLanguageCode (\ s a -> s{_uvrsLanguageCode = a})
-
--- | The name of the vocabulary that was updated.
-uvrsVocabularyName :: Lens' UpdateVocabularyResponse (Maybe Text)
-uvrsVocabularyName = lens _uvrsVocabularyName (\ s a -> s{_uvrsVocabularyName = a})
-
--- | The date and time that the vocabulary was updated.
-uvrsLastModifiedTime :: Lens' UpdateVocabularyResponse (Maybe UTCTime)
-uvrsLastModifiedTime = lens _uvrsLastModifiedTime (\ s a -> s{_uvrsLastModifiedTime = a}) . mapping _Time
-
--- | The processing state of the vocabulary. When the @VocabularyState@ field contains @READY@ the vocabulary is ready to be used in a @StartTranscriptionJob@ request.
-uvrsVocabularyState :: Lens' UpdateVocabularyResponse (Maybe VocabularyState)
-uvrsVocabularyState = lens _uvrsVocabularyState (\ s a -> s{_uvrsVocabularyState = a})
-
--- | -- | The response status code.
-uvrsResponseStatus :: Lens' UpdateVocabularyResponse Int
-uvrsResponseStatus = lens _uvrsResponseStatus (\ s a -> s{_uvrsResponseStatus = a})
-
-instance NFData UpdateVocabularyResponse where
diff --git a/gen/Network/AWS/Transcribe/Waiters.hs b/gen/Network/AWS/Transcribe/Waiters.hs
deleted file mode 100644
--- a/gen/Network/AWS/Transcribe/Waiters.hs
+++ /dev/null
@@ -1,21 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE TypeFamilies      #-}
-
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Network.AWS.Transcribe.Waiters
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Network.AWS.Transcribe.Waiters where
-
-import Network.AWS.Lens
-import Network.AWS.Prelude
-import Network.AWS.Transcribe.Types
-import Network.AWS.Waiter
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -2,20 +2,22 @@
 
 -- |
 -- Module      : Main
--- Copyright   : (c) 2013-2018 Brendan Hay
+-- Copyright   : (c) 2013-2023 Brendan Hay
 -- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
+-- Maintainer  : Brendan Hay
 -- Stability   : auto-generated
 -- Portability : non-portable (GHC extensions)
---
 module Main (main) where
 
+import Test.Amazonka.Transcribe
+import Test.Amazonka.Transcribe.Internal
 import Test.Tasty
-import Test.AWS.Transcribe
-import Test.AWS.Transcribe.Internal
 
 main :: IO ()
-main = defaultMain $ testGroup "Transcribe"
-    [ testGroup "tests"    tests
-    , testGroup "fixtures" fixtures
-    ]
+main =
+  defaultMain $
+    testGroup
+      "Transcribe"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/AWS/Gen/Transcribe.hs b/test/Test/AWS/Gen/Transcribe.hs
deleted file mode 100644
--- a/test/Test/AWS/Gen/Transcribe.hs
+++ /dev/null
@@ -1,183 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-unused-imports #-}
-{-# OPTIONS_GHC -fno-warn-orphans        #-}
-
--- Derived from AWS service descriptions, licensed under Apache 2.0.
-
--- |
--- Module      : Test.AWS.Gen.Transcribe
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Gen.Transcribe where
-
-import Data.Proxy
-import Network.AWS.Transcribe
-import Test.AWS.Fixture
-import Test.AWS.Prelude
-import Test.AWS.Transcribe.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"
---         [ requestGetVocabulary $
---             getVocabulary
---
---         , requestGetTranscriptionJob $
---             getTranscriptionJob
---
---         , requestDeleteVocabulary $
---             deleteVocabulary
---
---         , requestUpdateVocabulary $
---             updateVocabulary
---
---         , requestListTranscriptionJobs $
---             listTranscriptionJobs
---
---         , requestListVocabularies $
---             listVocabularies
---
---         , requestCreateVocabulary $
---             createVocabulary
---
---         , requestStartTranscriptionJob $
---             startTranscriptionJob
---
---           ]
-
---     , testGroup "response"
---         [ responseGetVocabulary $
---             getVocabularyResponse
---
---         , responseGetTranscriptionJob $
---             getTranscriptionJobResponse
---
---         , responseDeleteVocabulary $
---             deleteVocabularyResponse
---
---         , responseUpdateVocabulary $
---             updateVocabularyResponse
---
---         , responseListTranscriptionJobs $
---             listTranscriptionJobsResponse
---
---         , responseListVocabularies $
---             listVocabulariesResponse
---
---         , responseCreateVocabulary $
---             createVocabularyResponse
---
---         , responseStartTranscriptionJob $
---             startTranscriptionJobResponse
---
---           ]
---     ]
-
--- Requests
-
-requestGetVocabulary :: GetVocabulary -> TestTree
-requestGetVocabulary = req
-    "GetVocabulary"
-    "fixture/GetVocabulary.yaml"
-
-requestGetTranscriptionJob :: GetTranscriptionJob -> TestTree
-requestGetTranscriptionJob = req
-    "GetTranscriptionJob"
-    "fixture/GetTranscriptionJob.yaml"
-
-requestDeleteVocabulary :: DeleteVocabulary -> TestTree
-requestDeleteVocabulary = req
-    "DeleteVocabulary"
-    "fixture/DeleteVocabulary.yaml"
-
-requestUpdateVocabulary :: UpdateVocabulary -> TestTree
-requestUpdateVocabulary = req
-    "UpdateVocabulary"
-    "fixture/UpdateVocabulary.yaml"
-
-requestListTranscriptionJobs :: ListTranscriptionJobs -> TestTree
-requestListTranscriptionJobs = req
-    "ListTranscriptionJobs"
-    "fixture/ListTranscriptionJobs.yaml"
-
-requestListVocabularies :: ListVocabularies -> TestTree
-requestListVocabularies = req
-    "ListVocabularies"
-    "fixture/ListVocabularies.yaml"
-
-requestCreateVocabulary :: CreateVocabulary -> TestTree
-requestCreateVocabulary = req
-    "CreateVocabulary"
-    "fixture/CreateVocabulary.yaml"
-
-requestStartTranscriptionJob :: StartTranscriptionJob -> TestTree
-requestStartTranscriptionJob = req
-    "StartTranscriptionJob"
-    "fixture/StartTranscriptionJob.yaml"
-
--- Responses
-
-responseGetVocabulary :: GetVocabularyResponse -> TestTree
-responseGetVocabulary = res
-    "GetVocabularyResponse"
-    "fixture/GetVocabularyResponse.proto"
-    transcribe
-    (Proxy :: Proxy GetVocabulary)
-
-responseGetTranscriptionJob :: GetTranscriptionJobResponse -> TestTree
-responseGetTranscriptionJob = res
-    "GetTranscriptionJobResponse"
-    "fixture/GetTranscriptionJobResponse.proto"
-    transcribe
-    (Proxy :: Proxy GetTranscriptionJob)
-
-responseDeleteVocabulary :: DeleteVocabularyResponse -> TestTree
-responseDeleteVocabulary = res
-    "DeleteVocabularyResponse"
-    "fixture/DeleteVocabularyResponse.proto"
-    transcribe
-    (Proxy :: Proxy DeleteVocabulary)
-
-responseUpdateVocabulary :: UpdateVocabularyResponse -> TestTree
-responseUpdateVocabulary = res
-    "UpdateVocabularyResponse"
-    "fixture/UpdateVocabularyResponse.proto"
-    transcribe
-    (Proxy :: Proxy UpdateVocabulary)
-
-responseListTranscriptionJobs :: ListTranscriptionJobsResponse -> TestTree
-responseListTranscriptionJobs = res
-    "ListTranscriptionJobsResponse"
-    "fixture/ListTranscriptionJobsResponse.proto"
-    transcribe
-    (Proxy :: Proxy ListTranscriptionJobs)
-
-responseListVocabularies :: ListVocabulariesResponse -> TestTree
-responseListVocabularies = res
-    "ListVocabulariesResponse"
-    "fixture/ListVocabulariesResponse.proto"
-    transcribe
-    (Proxy :: Proxy ListVocabularies)
-
-responseCreateVocabulary :: CreateVocabularyResponse -> TestTree
-responseCreateVocabulary = res
-    "CreateVocabularyResponse"
-    "fixture/CreateVocabularyResponse.proto"
-    transcribe
-    (Proxy :: Proxy CreateVocabulary)
-
-responseStartTranscriptionJob :: StartTranscriptionJobResponse -> TestTree
-responseStartTranscriptionJob = res
-    "StartTranscriptionJobResponse"
-    "fixture/StartTranscriptionJobResponse.proto"
-    transcribe
-    (Proxy :: Proxy StartTranscriptionJob)
diff --git a/test/Test/AWS/Transcribe.hs b/test/Test/AWS/Transcribe.hs
deleted file mode 100644
--- a/test/Test/AWS/Transcribe.hs
+++ /dev/null
@@ -1,20 +0,0 @@
--- |
--- Module      : Test.AWS.Transcribe
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Transcribe
-    ( tests
-    , fixtures
-    ) where
-
-import Test.Tasty (TestTree)
-
-tests :: [TestTree]
-tests = []
-
-fixtures :: [TestTree]
-fixtures = []
diff --git a/test/Test/AWS/Transcribe/Internal.hs b/test/Test/AWS/Transcribe/Internal.hs
deleted file mode 100644
--- a/test/Test/AWS/Transcribe/Internal.hs
+++ /dev/null
@@ -1,9 +0,0 @@
--- |
--- Module      : Test.AWS.Transcribe.Internal
--- Copyright   : (c) 2013-2018 Brendan Hay
--- License     : Mozilla Public License, v. 2.0.
--- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
--- Stability   : auto-generated
--- Portability : non-portable (GHC extensions)
---
-module Test.AWS.Transcribe.Internal where
diff --git a/test/Test/Amazonka/Gen/Transcribe.hs b/test/Test/Amazonka/Gen/Transcribe.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Transcribe.hs
@@ -0,0 +1,818 @@
+{-# 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.Transcribe
+-- 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.Transcribe where
+
+import Amazonka.Transcribe
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Prelude
+import Test.Amazonka.Transcribe.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"
+--         [ requestCreateCallAnalyticsCategory $
+--             newCreateCallAnalyticsCategory
+--
+--         , requestCreateLanguageModel $
+--             newCreateLanguageModel
+--
+--         , requestCreateMedicalVocabulary $
+--             newCreateMedicalVocabulary
+--
+--         , requestCreateVocabulary $
+--             newCreateVocabulary
+--
+--         , requestCreateVocabularyFilter $
+--             newCreateVocabularyFilter
+--
+--         , requestDeleteCallAnalyticsCategory $
+--             newDeleteCallAnalyticsCategory
+--
+--         , requestDeleteCallAnalyticsJob $
+--             newDeleteCallAnalyticsJob
+--
+--         , requestDeleteLanguageModel $
+--             newDeleteLanguageModel
+--
+--         , requestDeleteMedicalTranscriptionJob $
+--             newDeleteMedicalTranscriptionJob
+--
+--         , requestDeleteMedicalVocabulary $
+--             newDeleteMedicalVocabulary
+--
+--         , requestDeleteTranscriptionJob $
+--             newDeleteTranscriptionJob
+--
+--         , requestDeleteVocabulary $
+--             newDeleteVocabulary
+--
+--         , requestDeleteVocabularyFilter $
+--             newDeleteVocabularyFilter
+--
+--         , requestDescribeLanguageModel $
+--             newDescribeLanguageModel
+--
+--         , requestGetCallAnalyticsCategory $
+--             newGetCallAnalyticsCategory
+--
+--         , requestGetCallAnalyticsJob $
+--             newGetCallAnalyticsJob
+--
+--         , requestGetMedicalTranscriptionJob $
+--             newGetMedicalTranscriptionJob
+--
+--         , requestGetMedicalVocabulary $
+--             newGetMedicalVocabulary
+--
+--         , requestGetTranscriptionJob $
+--             newGetTranscriptionJob
+--
+--         , requestGetVocabulary $
+--             newGetVocabulary
+--
+--         , requestGetVocabularyFilter $
+--             newGetVocabularyFilter
+--
+--         , requestListCallAnalyticsCategories $
+--             newListCallAnalyticsCategories
+--
+--         , requestListCallAnalyticsJobs $
+--             newListCallAnalyticsJobs
+--
+--         , requestListLanguageModels $
+--             newListLanguageModels
+--
+--         , requestListMedicalTranscriptionJobs $
+--             newListMedicalTranscriptionJobs
+--
+--         , requestListMedicalVocabularies $
+--             newListMedicalVocabularies
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestListTranscriptionJobs $
+--             newListTranscriptionJobs
+--
+--         , requestListVocabularies $
+--             newListVocabularies
+--
+--         , requestListVocabularyFilters $
+--             newListVocabularyFilters
+--
+--         , requestStartCallAnalyticsJob $
+--             newStartCallAnalyticsJob
+--
+--         , requestStartMedicalTranscriptionJob $
+--             newStartMedicalTranscriptionJob
+--
+--         , requestStartTranscriptionJob $
+--             newStartTranscriptionJob
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateCallAnalyticsCategory $
+--             newUpdateCallAnalyticsCategory
+--
+--         , requestUpdateMedicalVocabulary $
+--             newUpdateMedicalVocabulary
+--
+--         , requestUpdateVocabulary $
+--             newUpdateVocabulary
+--
+--         , requestUpdateVocabularyFilter $
+--             newUpdateVocabularyFilter
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateCallAnalyticsCategory $
+--             newCreateCallAnalyticsCategoryResponse
+--
+--         , responseCreateLanguageModel $
+--             newCreateLanguageModelResponse
+--
+--         , responseCreateMedicalVocabulary $
+--             newCreateMedicalVocabularyResponse
+--
+--         , responseCreateVocabulary $
+--             newCreateVocabularyResponse
+--
+--         , responseCreateVocabularyFilter $
+--             newCreateVocabularyFilterResponse
+--
+--         , responseDeleteCallAnalyticsCategory $
+--             newDeleteCallAnalyticsCategoryResponse
+--
+--         , responseDeleteCallAnalyticsJob $
+--             newDeleteCallAnalyticsJobResponse
+--
+--         , responseDeleteLanguageModel $
+--             newDeleteLanguageModelResponse
+--
+--         , responseDeleteMedicalTranscriptionJob $
+--             newDeleteMedicalTranscriptionJobResponse
+--
+--         , responseDeleteMedicalVocabulary $
+--             newDeleteMedicalVocabularyResponse
+--
+--         , responseDeleteTranscriptionJob $
+--             newDeleteTranscriptionJobResponse
+--
+--         , responseDeleteVocabulary $
+--             newDeleteVocabularyResponse
+--
+--         , responseDeleteVocabularyFilter $
+--             newDeleteVocabularyFilterResponse
+--
+--         , responseDescribeLanguageModel $
+--             newDescribeLanguageModelResponse
+--
+--         , responseGetCallAnalyticsCategory $
+--             newGetCallAnalyticsCategoryResponse
+--
+--         , responseGetCallAnalyticsJob $
+--             newGetCallAnalyticsJobResponse
+--
+--         , responseGetMedicalTranscriptionJob $
+--             newGetMedicalTranscriptionJobResponse
+--
+--         , responseGetMedicalVocabulary $
+--             newGetMedicalVocabularyResponse
+--
+--         , responseGetTranscriptionJob $
+--             newGetTranscriptionJobResponse
+--
+--         , responseGetVocabulary $
+--             newGetVocabularyResponse
+--
+--         , responseGetVocabularyFilter $
+--             newGetVocabularyFilterResponse
+--
+--         , responseListCallAnalyticsCategories $
+--             newListCallAnalyticsCategoriesResponse
+--
+--         , responseListCallAnalyticsJobs $
+--             newListCallAnalyticsJobsResponse
+--
+--         , responseListLanguageModels $
+--             newListLanguageModelsResponse
+--
+--         , responseListMedicalTranscriptionJobs $
+--             newListMedicalTranscriptionJobsResponse
+--
+--         , responseListMedicalVocabularies $
+--             newListMedicalVocabulariesResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseListTranscriptionJobs $
+--             newListTranscriptionJobsResponse
+--
+--         , responseListVocabularies $
+--             newListVocabulariesResponse
+--
+--         , responseListVocabularyFilters $
+--             newListVocabularyFiltersResponse
+--
+--         , responseStartCallAnalyticsJob $
+--             newStartCallAnalyticsJobResponse
+--
+--         , responseStartMedicalTranscriptionJob $
+--             newStartMedicalTranscriptionJobResponse
+--
+--         , responseStartTranscriptionJob $
+--             newStartTranscriptionJobResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateCallAnalyticsCategory $
+--             newUpdateCallAnalyticsCategoryResponse
+--
+--         , responseUpdateMedicalVocabulary $
+--             newUpdateMedicalVocabularyResponse
+--
+--         , responseUpdateVocabulary $
+--             newUpdateVocabularyResponse
+--
+--         , responseUpdateVocabularyFilter $
+--             newUpdateVocabularyFilterResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateCallAnalyticsCategory :: CreateCallAnalyticsCategory -> TestTree
+requestCreateCallAnalyticsCategory =
+  req
+    "CreateCallAnalyticsCategory"
+    "fixture/CreateCallAnalyticsCategory.yaml"
+
+requestCreateLanguageModel :: CreateLanguageModel -> TestTree
+requestCreateLanguageModel =
+  req
+    "CreateLanguageModel"
+    "fixture/CreateLanguageModel.yaml"
+
+requestCreateMedicalVocabulary :: CreateMedicalVocabulary -> TestTree
+requestCreateMedicalVocabulary =
+  req
+    "CreateMedicalVocabulary"
+    "fixture/CreateMedicalVocabulary.yaml"
+
+requestCreateVocabulary :: CreateVocabulary -> TestTree
+requestCreateVocabulary =
+  req
+    "CreateVocabulary"
+    "fixture/CreateVocabulary.yaml"
+
+requestCreateVocabularyFilter :: CreateVocabularyFilter -> TestTree
+requestCreateVocabularyFilter =
+  req
+    "CreateVocabularyFilter"
+    "fixture/CreateVocabularyFilter.yaml"
+
+requestDeleteCallAnalyticsCategory :: DeleteCallAnalyticsCategory -> TestTree
+requestDeleteCallAnalyticsCategory =
+  req
+    "DeleteCallAnalyticsCategory"
+    "fixture/DeleteCallAnalyticsCategory.yaml"
+
+requestDeleteCallAnalyticsJob :: DeleteCallAnalyticsJob -> TestTree
+requestDeleteCallAnalyticsJob =
+  req
+    "DeleteCallAnalyticsJob"
+    "fixture/DeleteCallAnalyticsJob.yaml"
+
+requestDeleteLanguageModel :: DeleteLanguageModel -> TestTree
+requestDeleteLanguageModel =
+  req
+    "DeleteLanguageModel"
+    "fixture/DeleteLanguageModel.yaml"
+
+requestDeleteMedicalTranscriptionJob :: DeleteMedicalTranscriptionJob -> TestTree
+requestDeleteMedicalTranscriptionJob =
+  req
+    "DeleteMedicalTranscriptionJob"
+    "fixture/DeleteMedicalTranscriptionJob.yaml"
+
+requestDeleteMedicalVocabulary :: DeleteMedicalVocabulary -> TestTree
+requestDeleteMedicalVocabulary =
+  req
+    "DeleteMedicalVocabulary"
+    "fixture/DeleteMedicalVocabulary.yaml"
+
+requestDeleteTranscriptionJob :: DeleteTranscriptionJob -> TestTree
+requestDeleteTranscriptionJob =
+  req
+    "DeleteTranscriptionJob"
+    "fixture/DeleteTranscriptionJob.yaml"
+
+requestDeleteVocabulary :: DeleteVocabulary -> TestTree
+requestDeleteVocabulary =
+  req
+    "DeleteVocabulary"
+    "fixture/DeleteVocabulary.yaml"
+
+requestDeleteVocabularyFilter :: DeleteVocabularyFilter -> TestTree
+requestDeleteVocabularyFilter =
+  req
+    "DeleteVocabularyFilter"
+    "fixture/DeleteVocabularyFilter.yaml"
+
+requestDescribeLanguageModel :: DescribeLanguageModel -> TestTree
+requestDescribeLanguageModel =
+  req
+    "DescribeLanguageModel"
+    "fixture/DescribeLanguageModel.yaml"
+
+requestGetCallAnalyticsCategory :: GetCallAnalyticsCategory -> TestTree
+requestGetCallAnalyticsCategory =
+  req
+    "GetCallAnalyticsCategory"
+    "fixture/GetCallAnalyticsCategory.yaml"
+
+requestGetCallAnalyticsJob :: GetCallAnalyticsJob -> TestTree
+requestGetCallAnalyticsJob =
+  req
+    "GetCallAnalyticsJob"
+    "fixture/GetCallAnalyticsJob.yaml"
+
+requestGetMedicalTranscriptionJob :: GetMedicalTranscriptionJob -> TestTree
+requestGetMedicalTranscriptionJob =
+  req
+    "GetMedicalTranscriptionJob"
+    "fixture/GetMedicalTranscriptionJob.yaml"
+
+requestGetMedicalVocabulary :: GetMedicalVocabulary -> TestTree
+requestGetMedicalVocabulary =
+  req
+    "GetMedicalVocabulary"
+    "fixture/GetMedicalVocabulary.yaml"
+
+requestGetTranscriptionJob :: GetTranscriptionJob -> TestTree
+requestGetTranscriptionJob =
+  req
+    "GetTranscriptionJob"
+    "fixture/GetTranscriptionJob.yaml"
+
+requestGetVocabulary :: GetVocabulary -> TestTree
+requestGetVocabulary =
+  req
+    "GetVocabulary"
+    "fixture/GetVocabulary.yaml"
+
+requestGetVocabularyFilter :: GetVocabularyFilter -> TestTree
+requestGetVocabularyFilter =
+  req
+    "GetVocabularyFilter"
+    "fixture/GetVocabularyFilter.yaml"
+
+requestListCallAnalyticsCategories :: ListCallAnalyticsCategories -> TestTree
+requestListCallAnalyticsCategories =
+  req
+    "ListCallAnalyticsCategories"
+    "fixture/ListCallAnalyticsCategories.yaml"
+
+requestListCallAnalyticsJobs :: ListCallAnalyticsJobs -> TestTree
+requestListCallAnalyticsJobs =
+  req
+    "ListCallAnalyticsJobs"
+    "fixture/ListCallAnalyticsJobs.yaml"
+
+requestListLanguageModels :: ListLanguageModels -> TestTree
+requestListLanguageModels =
+  req
+    "ListLanguageModels"
+    "fixture/ListLanguageModels.yaml"
+
+requestListMedicalTranscriptionJobs :: ListMedicalTranscriptionJobs -> TestTree
+requestListMedicalTranscriptionJobs =
+  req
+    "ListMedicalTranscriptionJobs"
+    "fixture/ListMedicalTranscriptionJobs.yaml"
+
+requestListMedicalVocabularies :: ListMedicalVocabularies -> TestTree
+requestListMedicalVocabularies =
+  req
+    "ListMedicalVocabularies"
+    "fixture/ListMedicalVocabularies.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestListTranscriptionJobs :: ListTranscriptionJobs -> TestTree
+requestListTranscriptionJobs =
+  req
+    "ListTranscriptionJobs"
+    "fixture/ListTranscriptionJobs.yaml"
+
+requestListVocabularies :: ListVocabularies -> TestTree
+requestListVocabularies =
+  req
+    "ListVocabularies"
+    "fixture/ListVocabularies.yaml"
+
+requestListVocabularyFilters :: ListVocabularyFilters -> TestTree
+requestListVocabularyFilters =
+  req
+    "ListVocabularyFilters"
+    "fixture/ListVocabularyFilters.yaml"
+
+requestStartCallAnalyticsJob :: StartCallAnalyticsJob -> TestTree
+requestStartCallAnalyticsJob =
+  req
+    "StartCallAnalyticsJob"
+    "fixture/StartCallAnalyticsJob.yaml"
+
+requestStartMedicalTranscriptionJob :: StartMedicalTranscriptionJob -> TestTree
+requestStartMedicalTranscriptionJob =
+  req
+    "StartMedicalTranscriptionJob"
+    "fixture/StartMedicalTranscriptionJob.yaml"
+
+requestStartTranscriptionJob :: StartTranscriptionJob -> TestTree
+requestStartTranscriptionJob =
+  req
+    "StartTranscriptionJob"
+    "fixture/StartTranscriptionJob.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateCallAnalyticsCategory :: UpdateCallAnalyticsCategory -> TestTree
+requestUpdateCallAnalyticsCategory =
+  req
+    "UpdateCallAnalyticsCategory"
+    "fixture/UpdateCallAnalyticsCategory.yaml"
+
+requestUpdateMedicalVocabulary :: UpdateMedicalVocabulary -> TestTree
+requestUpdateMedicalVocabulary =
+  req
+    "UpdateMedicalVocabulary"
+    "fixture/UpdateMedicalVocabulary.yaml"
+
+requestUpdateVocabulary :: UpdateVocabulary -> TestTree
+requestUpdateVocabulary =
+  req
+    "UpdateVocabulary"
+    "fixture/UpdateVocabulary.yaml"
+
+requestUpdateVocabularyFilter :: UpdateVocabularyFilter -> TestTree
+requestUpdateVocabularyFilter =
+  req
+    "UpdateVocabularyFilter"
+    "fixture/UpdateVocabularyFilter.yaml"
+
+-- Responses
+
+responseCreateCallAnalyticsCategory :: CreateCallAnalyticsCategoryResponse -> TestTree
+responseCreateCallAnalyticsCategory =
+  res
+    "CreateCallAnalyticsCategoryResponse"
+    "fixture/CreateCallAnalyticsCategoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateCallAnalyticsCategory)
+
+responseCreateLanguageModel :: CreateLanguageModelResponse -> TestTree
+responseCreateLanguageModel =
+  res
+    "CreateLanguageModelResponse"
+    "fixture/CreateLanguageModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateLanguageModel)
+
+responseCreateMedicalVocabulary :: CreateMedicalVocabularyResponse -> TestTree
+responseCreateMedicalVocabulary =
+  res
+    "CreateMedicalVocabularyResponse"
+    "fixture/CreateMedicalVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateMedicalVocabulary)
+
+responseCreateVocabulary :: CreateVocabularyResponse -> TestTree
+responseCreateVocabulary =
+  res
+    "CreateVocabularyResponse"
+    "fixture/CreateVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVocabulary)
+
+responseCreateVocabularyFilter :: CreateVocabularyFilterResponse -> TestTree
+responseCreateVocabularyFilter =
+  res
+    "CreateVocabularyFilterResponse"
+    "fixture/CreateVocabularyFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateVocabularyFilter)
+
+responseDeleteCallAnalyticsCategory :: DeleteCallAnalyticsCategoryResponse -> TestTree
+responseDeleteCallAnalyticsCategory =
+  res
+    "DeleteCallAnalyticsCategoryResponse"
+    "fixture/DeleteCallAnalyticsCategoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCallAnalyticsCategory)
+
+responseDeleteCallAnalyticsJob :: DeleteCallAnalyticsJobResponse -> TestTree
+responseDeleteCallAnalyticsJob =
+  res
+    "DeleteCallAnalyticsJobResponse"
+    "fixture/DeleteCallAnalyticsJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCallAnalyticsJob)
+
+responseDeleteLanguageModel :: DeleteLanguageModelResponse -> TestTree
+responseDeleteLanguageModel =
+  res
+    "DeleteLanguageModelResponse"
+    "fixture/DeleteLanguageModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteLanguageModel)
+
+responseDeleteMedicalTranscriptionJob :: DeleteMedicalTranscriptionJobResponse -> TestTree
+responseDeleteMedicalTranscriptionJob =
+  res
+    "DeleteMedicalTranscriptionJobResponse"
+    "fixture/DeleteMedicalTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteMedicalTranscriptionJob)
+
+responseDeleteMedicalVocabulary :: DeleteMedicalVocabularyResponse -> TestTree
+responseDeleteMedicalVocabulary =
+  res
+    "DeleteMedicalVocabularyResponse"
+    "fixture/DeleteMedicalVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteMedicalVocabulary)
+
+responseDeleteTranscriptionJob :: DeleteTranscriptionJobResponse -> TestTree
+responseDeleteTranscriptionJob =
+  res
+    "DeleteTranscriptionJobResponse"
+    "fixture/DeleteTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteTranscriptionJob)
+
+responseDeleteVocabulary :: DeleteVocabularyResponse -> TestTree
+responseDeleteVocabulary =
+  res
+    "DeleteVocabularyResponse"
+    "fixture/DeleteVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVocabulary)
+
+responseDeleteVocabularyFilter :: DeleteVocabularyFilterResponse -> TestTree
+responseDeleteVocabularyFilter =
+  res
+    "DeleteVocabularyFilterResponse"
+    "fixture/DeleteVocabularyFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteVocabularyFilter)
+
+responseDescribeLanguageModel :: DescribeLanguageModelResponse -> TestTree
+responseDescribeLanguageModel =
+  res
+    "DescribeLanguageModelResponse"
+    "fixture/DescribeLanguageModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeLanguageModel)
+
+responseGetCallAnalyticsCategory :: GetCallAnalyticsCategoryResponse -> TestTree
+responseGetCallAnalyticsCategory =
+  res
+    "GetCallAnalyticsCategoryResponse"
+    "fixture/GetCallAnalyticsCategoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetCallAnalyticsCategory)
+
+responseGetCallAnalyticsJob :: GetCallAnalyticsJobResponse -> TestTree
+responseGetCallAnalyticsJob =
+  res
+    "GetCallAnalyticsJobResponse"
+    "fixture/GetCallAnalyticsJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetCallAnalyticsJob)
+
+responseGetMedicalTranscriptionJob :: GetMedicalTranscriptionJobResponse -> TestTree
+responseGetMedicalTranscriptionJob =
+  res
+    "GetMedicalTranscriptionJobResponse"
+    "fixture/GetMedicalTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetMedicalTranscriptionJob)
+
+responseGetMedicalVocabulary :: GetMedicalVocabularyResponse -> TestTree
+responseGetMedicalVocabulary =
+  res
+    "GetMedicalVocabularyResponse"
+    "fixture/GetMedicalVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetMedicalVocabulary)
+
+responseGetTranscriptionJob :: GetTranscriptionJobResponse -> TestTree
+responseGetTranscriptionJob =
+  res
+    "GetTranscriptionJobResponse"
+    "fixture/GetTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetTranscriptionJob)
+
+responseGetVocabulary :: GetVocabularyResponse -> TestTree
+responseGetVocabulary =
+  res
+    "GetVocabularyResponse"
+    "fixture/GetVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetVocabulary)
+
+responseGetVocabularyFilter :: GetVocabularyFilterResponse -> TestTree
+responseGetVocabularyFilter =
+  res
+    "GetVocabularyFilterResponse"
+    "fixture/GetVocabularyFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetVocabularyFilter)
+
+responseListCallAnalyticsCategories :: ListCallAnalyticsCategoriesResponse -> TestTree
+responseListCallAnalyticsCategories =
+  res
+    "ListCallAnalyticsCategoriesResponse"
+    "fixture/ListCallAnalyticsCategoriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListCallAnalyticsCategories)
+
+responseListCallAnalyticsJobs :: ListCallAnalyticsJobsResponse -> TestTree
+responseListCallAnalyticsJobs =
+  res
+    "ListCallAnalyticsJobsResponse"
+    "fixture/ListCallAnalyticsJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListCallAnalyticsJobs)
+
+responseListLanguageModels :: ListLanguageModelsResponse -> TestTree
+responseListLanguageModels =
+  res
+    "ListLanguageModelsResponse"
+    "fixture/ListLanguageModelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListLanguageModels)
+
+responseListMedicalTranscriptionJobs :: ListMedicalTranscriptionJobsResponse -> TestTree
+responseListMedicalTranscriptionJobs =
+  res
+    "ListMedicalTranscriptionJobsResponse"
+    "fixture/ListMedicalTranscriptionJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMedicalTranscriptionJobs)
+
+responseListMedicalVocabularies :: ListMedicalVocabulariesResponse -> TestTree
+responseListMedicalVocabularies =
+  res
+    "ListMedicalVocabulariesResponse"
+    "fixture/ListMedicalVocabulariesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMedicalVocabularies)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseListTranscriptionJobs :: ListTranscriptionJobsResponse -> TestTree
+responseListTranscriptionJobs =
+  res
+    "ListTranscriptionJobsResponse"
+    "fixture/ListTranscriptionJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTranscriptionJobs)
+
+responseListVocabularies :: ListVocabulariesResponse -> TestTree
+responseListVocabularies =
+  res
+    "ListVocabulariesResponse"
+    "fixture/ListVocabulariesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVocabularies)
+
+responseListVocabularyFilters :: ListVocabularyFiltersResponse -> TestTree
+responseListVocabularyFilters =
+  res
+    "ListVocabularyFiltersResponse"
+    "fixture/ListVocabularyFiltersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListVocabularyFilters)
+
+responseStartCallAnalyticsJob :: StartCallAnalyticsJobResponse -> TestTree
+responseStartCallAnalyticsJob =
+  res
+    "StartCallAnalyticsJobResponse"
+    "fixture/StartCallAnalyticsJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartCallAnalyticsJob)
+
+responseStartMedicalTranscriptionJob :: StartMedicalTranscriptionJobResponse -> TestTree
+responseStartMedicalTranscriptionJob =
+  res
+    "StartMedicalTranscriptionJobResponse"
+    "fixture/StartMedicalTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartMedicalTranscriptionJob)
+
+responseStartTranscriptionJob :: StartTranscriptionJobResponse -> TestTree
+responseStartTranscriptionJob =
+  res
+    "StartTranscriptionJobResponse"
+    "fixture/StartTranscriptionJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartTranscriptionJob)
+
+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)
+
+responseUpdateCallAnalyticsCategory :: UpdateCallAnalyticsCategoryResponse -> TestTree
+responseUpdateCallAnalyticsCategory =
+  res
+    "UpdateCallAnalyticsCategoryResponse"
+    "fixture/UpdateCallAnalyticsCategoryResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateCallAnalyticsCategory)
+
+responseUpdateMedicalVocabulary :: UpdateMedicalVocabularyResponse -> TestTree
+responseUpdateMedicalVocabulary =
+  res
+    "UpdateMedicalVocabularyResponse"
+    "fixture/UpdateMedicalVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateMedicalVocabulary)
+
+responseUpdateVocabulary :: UpdateVocabularyResponse -> TestTree
+responseUpdateVocabulary =
+  res
+    "UpdateVocabularyResponse"
+    "fixture/UpdateVocabularyResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVocabulary)
+
+responseUpdateVocabularyFilter :: UpdateVocabularyFilterResponse -> TestTree
+responseUpdateVocabularyFilter =
+  res
+    "UpdateVocabularyFilterResponse"
+    "fixture/UpdateVocabularyFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateVocabularyFilter)
diff --git a/test/Test/Amazonka/Transcribe.hs b/test/Test/Amazonka/Transcribe.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Transcribe.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Transcribe
+-- 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.Transcribe
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Transcribe/Internal.hs b/test/Test/Amazonka/Transcribe/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Transcribe/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Transcribe.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.Transcribe.Internal where
