Tic Tac Toe implementation in Ruby
You require pry, and you don't seem to use it.  Perhaps it is being used for troubleshooting, and the binding.pry or other code, has been removed.  In that case it may be more appropriate to simply use the -rpry option as in ruby -rpry file.rb.  Then you don't have to remember to remove that line, just the troubleshooting line.  (Or even better, set up a system that lets you leave things in but turn them off and on from an option in the system call.  Perhaps -w or -v flags.  Perhaps an environment variable.  A line in with this in mind may look like this:  binding.pry if $VERBOSE  And a require 'pry' if $VERBOSE)

Looking at your loop do tells me that you have an infinite loop.  But you have a well defined exit strategy, there is no need for an infinite loop.  Using something like until @board.winner? will run the block at least once, and will stop when your method returns true/truthy value.  You also call 'play' from inside the loop inside of play, but it is already going to start from the beginning of the loop.  

If you had folders bin/, lib/, I would expect some of the code in your tic-tac-toe.rb file to be in maybe bin/tic-tac-toe. The start equivalent for sure.  This will allow you to use the lib/tic-tac-toe.rb file in a way that someone that requires that library would expect.  Right now, you are unable to require that library file without starting the game.

The interface of using words like top left seems clumsy and error prone, even if it is nice.  Creating a numbered or lettered menu or presenting the grid with numbers or letters could make play easier, less typing to do, less error prone.  Perhaps a lettered 'x, y' grid.  Presenting that grid would also document the game play, and make initial play more straight forward.

Your "choose_character" method does two things, it prompts and processes the choice.  The @player_character and @computer_character is repetitive, confusing in a way.  Simply having @player and @computer is probably clear enough.  @player.character might be better, though I think we consider that letter a 'marker', as the player mark may be 'X' and the AI mark may be 'O'.

Looking at cell.rb you could be using the new named arguments in Ruby 2.0.

In the Board file you can likely use the all? Enumerable method, if an array has all? the markers that match the current players marker, then that player is the winner.