> ## Documentation Index
> Fetch the complete documentation index at: https://docs.inworld.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Design a voice

> Design a voice based on a text description. Returns preview voices that can be published using the Publish Voice endpoint.

Design a voice from a text description. This endpoint generates up to three preview voices that can then be published to your voice library using the [Publish Voice](/api-reference/voiceAPI/voiceservice/publish-voice) endpoint.

For a guided workflow, see [Voice Design](/tts/voice-design) in the docs.

<Note>
  **Preview text length:** The `previewText` must result in generated audio that is 1-15 seconds long (\~50-200 characters in English).
</Note>

<RequestField body="langCode" type="string" required>
  * EN\_US: English - US.
  * ZH\_CN: Chinese - China.
  * KO\_KR: Korean - Korea.
  * JA\_JP: Japanese - Japan.
  * RU\_RU: Russian - Russia.
  * AUTO: Auto-detect language.
  * IT\_IT: Italian - Italy.
  * ES\_ES: Spanish - Spain.
  * PT\_BR: Portuguese - Brazil.
  * DE\_DE: German - Germany.
  * FR\_FR: French - France.
  * AR\_SA: Arabic - Saudi Arabia.
  * PL\_PL: Polish - Poland.
  * NL\_NL: Dutch - Netherlands.
  * HI\_IN: Hindi - India.
  * HE\_IL: Hebrew - Israel.
</RequestField>


## OpenAPI

````yaml post /voices/v1/voices:design
openapi: 3.0.0
info:
  title: Inworld Text-to-Speech API
  version: v1
  contact:
    name: Inworld AI
    url: https://inworld.ai
    email: support@inworld.ai
servers:
  - url: https://api.inworld.ai
security:
  - inworld_basic: []
tags:
  - name: VoiceService
paths:
  /voices/v1/voices:design:
    post:
      tags:
        - VoiceService
      summary: Design a voice
      description: >-
        Design a voice based on a text description. Returns preview voices that
        can be published using the Publish Voice endpoint.
      operationId: VoiceService_DesignVoice
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/VoiceServiceDesignVoiceBody'
            examples:
              example:
                summary: Design voice request example
                description: previewText must produce 1-15 seconds of audio.
                value:
                  langCode: EN_US
                  designPrompt: >-
                    Warm, friendly, conversational voice with a subtle smile;
                    natural pacing; clear articulation.
                  previewText: >-
                    Hey! I am here. What can I help you with today? I would be
                    happy to assist you with whatever you need. Just let me know
                    how I can be of service.
                  voiceDesignConfig:
                    numberOfSamples: 1
        required: true
      responses:
        '200':
          description: A successful response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/v1DesignVoiceResponse'
              examples:
                success:
                  summary: Successful voice design
                  value:
                    langCode: EN_US
                    previewVoices:
                      - voiceId: your_workspace_id__design-voice-38b05df9
                        previewText: >-
                          Hey! I am here. What can I help you with today? I
                          would be happy to assist you with whatever you need.
                          Just let me know how I can be of service.
                        previewAudio: <base64-audio>
        default:
          description: An unexpected error response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rpcStatus'
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --location 'https://api.inworld.ai/voices/v1/voices:design' \
            --header "Authorization: Basic $INWORLD_API_KEY" \
            --header 'Content-Type: application/json' \
            --data '{
              "langCode": "EN_US",
              "designPrompt": "Warm, friendly, conversational voice with a subtle smile; natural pacing; clear articulation.",
              "previewText": "Hey! I am here. What can I help you with today?",
              "voiceDesignConfig": {
                "numberOfSamples": 1
              }
            }'
        - lang: python
          label: Python
          source: |-
            import requests

            url = "https://api.inworld.ai/voices/v1/voices:design"
            headers = {
                "Authorization": "Basic <api-key>",
                "Content-Type": "application/json"
            }
            payload = {
                "langCode": "EN_US",
                "designPrompt": "Warm, friendly, conversational voice with a subtle smile; natural pacing; clear articulation.",
                "previewText": "Hey! I am here. What can I help you with today?",
                "voiceDesignConfig": {
                    "numberOfSamples": 1
                }
            }

            response = requests.post(url, json=payload, headers=headers)
            print(response.json())
        - lang: javascript
          label: JavaScript
          source: |-
            const url = 'https://api.inworld.ai/voices/v1/voices:design';

            const response = await fetch(url, {
              method: 'POST',
              headers: {
                'Authorization': 'Basic <api-key>',
                'Content-Type': 'application/json',
              },
              body: JSON.stringify({
                langCode: 'EN_US',
                designPrompt: 'Warm, friendly, conversational voice with a subtle smile; natural pacing; clear articulation.',
                previewText: 'Hey! I am here. What can I help you with today?',
                voiceDesignConfig: {
                  numberOfSamples: 1,
                },
              }),
            });

            const data = await response.json();
            console.log(data);
components:
  schemas:
    VoiceServiceDesignVoiceBody:
      type: object
      properties:
        voiceDesignConfig:
          $ref: '#/components/schemas/v1VoiceDesignConfig'
          description: >-
            Voice design configuration for generating the preview. If not
            provided, defaults to generating 1 sample.
        designPrompt:
          type: string
          description: >-
            Text description of the desired voice. Must be in English and
            between 30 and 250 characters. For best results, include age,
            gender, accent, pitch, pace, and tone. See [Voice Design Best
            Practices](/tts/best-practices/voice-design) for more details. 


            Example: "A middle-aged male voice with a clear British accent
            speaking at a steady pace and with a neutral tone."
        langCode:
          $ref: '#/components/schemas/inworldttslanguage_codesLanguageCode'
          description: Language code for the voice preview.
        previewText:
          type: string
          description: >-
            Script for the generated voice to speak. Must result in audio that
            is 1-15 seconds. 


            The script will shape the voice that gets generated, as the model
            will tailor the voice to suit the content it's speaking. See [Voice
            Design Best Practices](/tts/best-practices/voice-design) for more
            details.
      description: Request message for DesignVoice.
      required:
        - designPrompt
        - langCode
        - previewText
    v1DesignVoiceResponse:
      type: object
      properties:
        langCode:
          $ref: '#/components/schemas/inworldttslanguage_codesLanguageCode'
          description: The language code of the generated previews.
        previewVoices:
          type: array
          items:
            $ref: '#/components/schemas/v1PreviewVoice'
          description: >-
            Preview voices generated (in DRAFT status). Up to 3 voices will be
            generated each time you call this endpoint. Use Publish Voice to
            promote one to your library.
      description: Response message for DesignVoice.
    rpcStatus:
      type: object
      properties:
        code:
          type: integer
          format: int32
          description: >-
            The status code, which should be an enum value of
            [google.rpc.Code][google.rpc.Code].
        message:
          type: string
          description: >-
            A developer-facing error message, which should be in English. Any
            user-facing error message should be localized and sent in the
            [google.rpc.Status.details][google.rpc.Status.details] field, or
            localized by the client.
        details:
          type: array
          items:
            $ref: '#/components/schemas/protobufAny'
          description: >-
            A list of messages that carry the error details. There is a common
            set of message types for APIs to use.
      description: >-
        The `Status` type defines a logical error model that is suitable for

        different programming environments, including REST APIs and RPC APIs. It
        is

        used by [gRPC](https://github.com/grpc). Each `Status` message contains

        three pieces of data: error code, error message, and error details.


        You can find out more about this error model and how to work with it in
        the

        [API Design Guide](https://cloud.google.com/apis/design/errors).
    v1VoiceDesignConfig:
      type: object
      properties:
        numberOfSamples:
          type: integer
          format: int32
          minimum: 1
          maximum: 3
          description: >-
            Number of voice samples to generate. Must be between 1 and 3.
            Default is 1 if not provided.
      description: Voice design configuration for generating voices from a design prompt.
    inworldttslanguage_codesLanguageCode:
      type: string
      enum:
        - EN_US
        - ZH_CN
        - KO_KR
        - JA_JP
        - RU_RU
        - AUTO
        - IT_IT
        - ES_ES
        - PT_BR
        - DE_DE
        - FR_FR
        - AR_SA
        - PL_PL
        - NL_NL
        - HI_IN
        - HE_IL
      title: >-
        This is a extended language list for the voice clone feature. The
        structure is the same as for LanguageCode from common. Dedicated file
        created to do not break any other features that uses language common
        definition.
    v1PreviewVoice:
      type: object
      properties:
        voiceId:
          type: string
          description: The voice ID of the generated preview.
        previewText:
          type: string
          description: The text used for the preview.
        previewAudio:
          type: string
          format: byte
          description: Preview audio data (base64-encoded).
      description: A preview voice generated during voice design.
    protobufAny:
      type: object
      properties:
        '@type':
          type: string
          description: >-
            A URL/resource name that uniquely identifies the type of the
            serialized

            protocol buffer message. This string must contain at least

            one "/" character. The last segment of the URL's path must represent

            the fully qualified name of the type (as in

            `path/google.protobuf.Duration`). The name should be in a canonical
            form

            (e.g., leading "." is not accepted).


            In practice, teams usually precompile into the binary all types that
            they

            expect it to use in the context of Any. However, for URLs which use
            the

            scheme `http`, `https`, or no scheme, one can optionally set up a
            type

            server that maps type URLs to message definitions as follows:


            * If no scheme is provided, `https` is assumed.

            * An HTTP GET on the URL must yield a [google.protobuf.Type][]
              value in binary format, or produce an error.
            * Applications are allowed to cache lookup results based on the
              URL, or have them precompiled into a binary to avoid any
              lookup. Therefore, binary compatibility needs to be preserved
              on changes to types. (Use versioned type names to manage
              breaking changes.)

            Note: this functionality is not currently available in the official

            protobuf release, and it is not used for type URLs beginning with

            type.googleapis.com. As of May 2023, there are no widely used type
            server

            implementations and no plans to implement one.


            Schemes other than `http`, `https` (or the empty scheme) might be

            used with implementation specific semantics.
      additionalProperties: {}
      description: >-
        `Any` contains an arbitrary serialized protocol buffer message along
        with a

        URL that describes the type of the serialized message.


        Protobuf library provides support to pack/unpack Any values in the form

        of utility functions or additional generated methods of the Any type.


        Example 1: Pack and unpack a message in C++.

            Foo foo = ...;
            Any any;
            any.PackFrom(foo);
            ...
            if (any.UnpackTo(&foo)) {
              ...
            }

        Example 2: Pack and unpack a message in Java.

            Foo foo = ...;
            Any any = Any.pack(foo);
            ...
            if (any.is(Foo.class)) {
              foo = any.unpack(Foo.class);
            }
            // or ...
            if (any.isSameTypeAs(Foo.getDefaultInstance())) {
              foo = any.unpack(Foo.getDefaultInstance());
            }

         Example 3: Pack and unpack a message in Python.

            foo = Foo(...)
            any = Any()
            any.Pack(foo)
            ...
            if any.Is(Foo.DESCRIPTOR):
              any.Unpack(foo)
              ...

         Example 4: Pack and unpack a message in Go

             foo := &pb.Foo{...}
             any, err := anypb.New(foo)
             if err != nil {
               ...
             }
             ...
             foo := &pb.Foo{}
             if err := any.UnmarshalTo(foo); err != nil {
               ...
             }

        The pack methods provided by protobuf library will by default use

        'type.googleapis.com/full.type.name' as the type URL and the unpack

        methods only use the fully qualified type name after the last '/'

        in the type URL, for example "foo.bar.com/x/y.z" will yield type

        name "y.z".


        JSON

        ====

        The JSON representation of an `Any` value uses the regular

        representation of the deserialized, embedded message, with an

        additional field `@type` which contains the type URL. Example:

            package google.profile;
            message Person {
              string first_name = 1;
              string last_name = 2;
            }

            {
              "@type": "type.googleapis.com/google.profile.Person",
              "firstName": <string>,
              "lastName": <string>
            }

        If the embedded message type is well-known and has a custom JSON

        representation, that representation will be embedded adding a field

        `value` which holds the custom JSON in addition to the `@type`

        field. Example (for message [google.protobuf.Duration][]):

            {
              "@type": "type.googleapis.com/google.protobuf.Duration",
              "value": "1.212s"
            }
  securitySchemes:
    inworld_basic:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your [API key](../../../api-reference/introduction). Read permissions
        are required for GET endpoints. Write permissions are required for POST,
        PATCH, and DELETE endpoints.

         For Basic authentication, please populate `Basic $INWORLD_API_KEY`

````