diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+# Amazon Transcribe Service SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+
+`1.6.0`
+
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-transcribe)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Network.AWS.Transcribe](http://hackage.haskell.org/package/amazonka-transcribe/docs/Network-AWS-Transcribe.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-transcribe` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import           Distribution.Simple
+main = defaultMain
diff --git a/amazonka-transcribe.cabal b/amazonka-transcribe.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-transcribe.cabal
@@ -0,0 +1,93 @@
+name:                  amazonka-transcribe
+version:               1.6.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>
+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
+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.
+
+source-repository head
+    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
+
+    other-modules:
+          Network.AWS.Transcribe.Types.Product
+        , Network.AWS.Transcribe.Types.Sum
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , base          >= 4.7     && < 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
+
+    -- 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
+
+    build-depends:
+          amazonka-core == 1.6.0.*
+        , amazonka-test == 1.6.0.*
+        , amazonka-transcribe
+        , base
+        , bytestring
+        , tasty
+        , tasty-hunit
+        , text
+        , time
+        , unordered-containers
diff --git a/fixture/CreateVocabulary.yaml b/fixture/CreateVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVocabulary.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/CreateVocabularyResponse.proto b/fixture/CreateVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateVocabularyResponse.proto
diff --git a/fixture/DeleteVocabulary.yaml b/fixture/DeleteVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVocabulary.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/DeleteVocabularyResponse.proto b/fixture/DeleteVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteVocabularyResponse.proto
diff --git a/fixture/GetTranscriptionJob.yaml b/fixture/GetTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetTranscriptionJob.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/GetTranscriptionJobResponse.proto b/fixture/GetTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetTranscriptionJobResponse.proto
diff --git a/fixture/GetVocabulary.yaml b/fixture/GetVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetVocabulary.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/GetVocabularyResponse.proto b/fixture/GetVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetVocabularyResponse.proto
diff --git a/fixture/ListTranscriptionJobs.yaml b/fixture/ListTranscriptionJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTranscriptionJobs.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/ListTranscriptionJobsResponse.proto b/fixture/ListTranscriptionJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTranscriptionJobsResponse.proto
diff --git a/fixture/ListVocabularies.yaml b/fixture/ListVocabularies.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListVocabularies.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/ListVocabulariesResponse.proto b/fixture/ListVocabulariesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListVocabulariesResponse.proto
diff --git a/fixture/StartTranscriptionJob.yaml b/fixture/StartTranscriptionJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartTranscriptionJob.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/StartTranscriptionJobResponse.proto b/fixture/StartTranscriptionJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartTranscriptionJobResponse.proto
diff --git a/fixture/UpdateVocabulary.yaml b/fixture/UpdateVocabulary.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVocabulary.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/UpdateVocabularyResponse.proto b/fixture/UpdateVocabularyResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateVocabularyResponse.proto
diff --git a/gen/Network/AWS/Transcribe.hs b/gen/Network/AWS/Transcribe.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe.hs
@@ -0,0 +1,174 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/CreateVocabulary.hs
@@ -0,0 +1,198 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/DeleteVocabulary.hs
@@ -0,0 +1,109 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/GetTranscriptionJob.hs
@@ -0,0 +1,136 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/GetVocabulary.hs
@@ -0,0 +1,185 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/ListTranscriptionJobs.hs
@@ -0,0 +1,187 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/ListVocabularies.hs
@@ -0,0 +1,187 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/StartTranscriptionJob.hs
@@ -0,0 +1,191 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/Types.hs
@@ -0,0 +1,167 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/Types/Product.hs
@@ -0,0 +1,430 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/Types/Sum.hs
@@ -0,0 +1,152 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/UpdateVocabulary.hs
@@ -0,0 +1,188 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/gen/Network/AWS/Transcribe/Waiters.hs
@@ -0,0 +1,21 @@
+{-# 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/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,21 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- 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 Main (main) where
+
+import Test.Tasty
+import Test.AWS.Transcribe
+import Test.AWS.Transcribe.Internal
+
+main :: IO ()
+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
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Gen/Transcribe.hs
@@ -0,0 +1,183 @@
+{-# 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
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Transcribe.hs
@@ -0,0 +1,20 @@
+-- |
+-- 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
new file mode 100644
--- /dev/null
+++ b/test/Test/AWS/Transcribe/Internal.hs
@@ -0,0 +1,9 @@
+-- |
+-- 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
